一、介绍
串口的传输方式包括:轮询、中断DMA,在此要介绍的是关于HAL库底层串口接收中断流程的讲解,包括串口错误的处理,中断回调函数以及错误中断回调函数的执行。
二、配置流程
首先使用STM32CubeMX配置串口参数和工作方式。如下图:

配置好基础参数波特率和数据长度,校验位,停止位后, 选择NVIC Settings点击Enabled使能全局中断。

这样整个串口配置就完成了。
三、开启接收中断
在代码初始化调用HAL_UART_Receive_IT(&huart2, &gUart2.Temp, RECLEN)函数即可开启接收中断,这边gUart2结构体是自己定义用来存放串口接收的内容,RECLEN则指一次性接收几个字节后触发中断回调函数。这边先介绍一下串口底层数据的存放。串口收到一个字节数据时最先存放到移位寄存器内,然后移到RDR寄存器中。当RDR寄存器有值时则RXNE标志置1(指示接收非空),这时将RXNEIE标志置1则会触发中断。执行HAL_UART_Receive_IT函数的作用就是指定接收数据长度,存放的地址以及开启接收非空中断,还有接收函数的映射。
四、中断流程
当接收到一个字节的数据时进入了中断处理函数,由于这边使用的是USART2,所以进入的是USART2_IRQHandler:
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
紧接着进入HAL_UART_IRQHandler里面执行,点进去可以发现里面在做的是一些状态位读取以及判断,还有中断回调函数接收函数的入口。如下读取ISR状态寄存器以及CR1控制寄存器还有CR3控制寄存器的内容分别存放到isrflags、cr1its、cr3its。然后让状态寄存器去与上以下四种错误PE奇偶校验错误、FE帧错误、ORE溢出错误、NE噪声错误。查看状态位是否有以下四种错误。
uint32_t isrflags = READ_REG(huart->Instance->ISR);
uint32_t cr1its = READ_REG(huart->Instance->CR1);
uint32_t cr3its = READ_REG(huart->Instance->CR3);
uint32_t errorflags;
uint32_t errorco

最低0.47元/天 解锁文章
2052





