概述
上一篇 说了 STM32CubeMX之串口的使用 (阻塞模式) ,这一章来说说串口中断模式收发数据。
环境:
- 开发板:STM32F4探索者(正点原子)
一. 在STM32CubeMX 图形化中开启串口中断
在 前一篇 STM32CubeMX之串口的使用 (阻塞模式) 的文章的基础上,打开串口中断,如下图所示:
然后就可以生成工程了
二. 串口中断相关函数介绍
串口中断函数
- 如串口1中断函数:
USART1_IRQHandler()
发送接收函数
- 串口中断模式发送:
HAL_UART_Transmit_IT()
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
- 串口实例的指针
- 想要发送的数据的指针,如数组的首地址
- 想要发送数据的个数
- 串口中断模式接收:
HAL_UART_Receive_IT()
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
-
串口实例的指针
-
接收数据缓冲块的首地址,如数组的首地址
-
想要接收数据的个数
相关回调函数
- 串口中断模式发送完成回调:
HAL_UART_TxCpltCallback
- 串口中断模式接收完成回调:
HAL_UART_RxCpltCallback
三. 串口中断函数使用实例
- 在
stm32f4xx_it.c
中,先看一下串口中断函数有没有添加上,如下图所示:
现在就可以使用中断相关发送接收函数了
在这里为了方便测试,我添加了一个如下结构体并进行了初始化:
- 发送数据
在主函数中,5s 进行一次发送
发送成功产生回调,该函数在main.c
中
然后在主程序中查询到发送成功,打印 send done
-
接收数据
在进入循环的之前,就说明串口要进行10个字节的数据接收
接收10个字节成功产生回调,该函数在
main.c
中然后在主函数中,查询是否接收成功
最后运行程序,可以在串口调试助手上显示
注意:
若定长串口中断接收数据,数据溢出,将会产生数据溢出错误,中断不再接收数据,如下图:
错误回调函数如下:
//错误回调 void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { if( rxtx_it_usart.huart1 == huart) { printf("error %d\r\n",huart->ErrorCode); } }
以上例子,代码已上传
四. HAL库中的串口相关源码介绍
串口中断函数中的处理函数
HAL_UART_IRQHandler
/** * @brief This function handles UART interrupt request. * @param huart Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART module. * @retval None */ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) { uint32_t isrflags = READ_REG(huart->Instance->SR); uint32_t cr1its = READ_REG(huart->Instance->CR1); uint32_t cr3its = READ_REG(huart->Instance->CR3); uint32_t errorflags = 0x00U; uint32_t dmarequest = 0x00U; /* If no error occurs */ errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE)); if (errorflags == RESET) { /* UART in mode Receiver -------------------------------------------------*/ if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) {