今天要来介绍一下HAL库的串口中断使用方法
首先打开CUBEMX,新建一个STM32工程,博主建立的是F429工程,然后在图形界面中打开一个USART,这里我们使用USART1。
然后进入配置configguration
基本的参数都不用修改,在NVIC中,大概中断使能
然后生成工程即可,打开工程文件。这里要解释一下串口中断接收:
关于串口接收中断
用CUBEMX生成的工程文件中,先开启接收中断使能
__HAL_UART_ENABLE_IT(uartHandle, UART_IT_RXNE);
并且利用HAL_UART_Receive_IT(uartHandle, &TempChar, 1);
这个函数中,第二个和第三个参数可以修改,分别代表预处字符串和字符串大小。
我们可以定义个初始化函数,在进入while(1)之前执行,比如我自定义了一个ITEnable(void);我们再来看一下这个函数的定义和使用位置:
void ITEnable(void) {
HAL_TIM_Base_Start_IT(&htim6);
HAL_TIM_Base_Start_IT(&htim7);
__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);
HAL_UART_Receive_IT(&huart3, &TempChar, 1);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
HAL_UART_Receive_IT(&huart1, &TempChar, 1);
}
可以看到,在这里我们开启了中断使能以及说明了接收到的信息存放位置&TempChar, TempChar是我们声明的一个全局变量,存放临时字符。
/* USER CODE BEGIN 2 */ delay_init(180); LED_Init(); SDRAM_Init(); LCD_Init(); ESP8266_Init(); ITEnable(); PeriphInit(); LCD_ShowString(30,0,200,24,24,"ShowTimeWalker"); /* USER CODE END 2 */
(上面是我从自己的工程里面挑选的代码,大家只需要关注部分代码)
设置完后,每次接受完一个字符,都会进入中断服务函数,官方申明的服务函数为
void USART1_IRQHandler(void)
该函数中只有一个目的,即进入
HAL_UART_IRQHandler(&huart1);
在这个函数中,函数会清除中断标志位,禁止使能中断!!!
并且进入函数UART_Receive_IT(huart);
在这里,把接收到的那个字符存放在之前HAL_UART_Receive_IT()设定的位置&TempChar,并计数
当计数达到设定值1后,转入回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
最终的操作就可以在回调函数中完成了,博主的处理代码如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { if(!END_STA) { if (TempChar!=0x0d) { Usart_ReceiveBuffer[USART_COUNTER++] = TempChar; } else { Usart_ReceiveBuffer[USART_COUNTER++] = TempChar; if (Usart_ReceiveBuffer[USART_COUNTER + 1] == 0) END_STA = 1; } } else { Usart_ReceiveBuffer[USART_COUNTER++] = TempChar; END_STA = 0; USART_COUNTER = 0; LCD_Fill(0, 120, 479, 149, WHITE); memcpy(USART1MESSAGE, Usart_ReceiveBuffer, RX_Length); for (int i = 0; i < RX_Length; i++) Usart_ReceiveBuffer[i] = 0; POINT_COLOR = BLACK; LCD_ShowString(30,120,800,24,24,(char*)USART1MESSAGE); } } }
在这之前还要声明一些全局变量
u8 Usart_ReceiveBuffer[RX_Length] = {0}; u8 USART1MESSAGE[RX_Length] = {0}; u8 USART3MESSAGE[RX_Length] = {0}; u16 USART_COUNTER = 0; u8 END_STA = 0; uint8_t TempChar = 0;
由于已经禁能中断,所以还要开启中断,每完成一次中断处理后,我们还要再USART1_IRQHandler中补充一行
HAL_UART_Receive_IT(uartHandle, &TempChar, 1);
在stm32f4xx_it.c里面找到这个函数,修改为:
void USART1_IRQHandler(void) { HAL_UART_IRQHandler(&huart1); HAL_UART_Receive_IT(&huart1, &TempChar, 1); }
博主把接收到的信息存放在USART1MESSAGE的字符数组中,并且打印到了RGB显示屏上,
红字不用理他,博主是把发送的信息作为执行命令,比如发送了一个清屏函数LCD_Clear(),STM32会调用USMART组件完成相应的功能,如果不是正确格式,就会提示红字。
以上便是我对HAL库串口中断接收的理解,欢迎大家讨论。