今天要来介绍一下HAL库的串口中断使用方法

首先打开CUBEMX,新建一个STM32工程,博主建立的是F429工程,然后在图形界面中打开一个USART,这里我们使用USART1。

cubemx外部中断配置 cubemx 中断_嵌入式

然后进入配置configguration

cubemx外部中断配置 cubemx 中断_字符串_02

基本的参数都不用修改,在NVIC中,大概中断使能

cubemx外部中断配置 cubemx 中断_cubemx外部中断配置_03

然后生成工程即可,打开工程文件。这里要解释一下串口中断接收:

关于串口接收中断

用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显示屏上,

cubemx外部中断配置 cubemx 中断_IT_04

cubemx外部中断配置 cubemx 中断_串口_05

红字不用理他,博主是把发送的信息作为执行命令,比如发送了一个清屏函数LCD_Clear(),STM32会调用USMART组件完成相应的功能,如果不是正确格式,就会提示红字。