码迷,mamicode.com
首页 > 其他好文 > 详细

STM32F429基于CUBEMX的串口中断接收

时间:2019-08-25 15:55:10      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:info   字符数组   and   修改   com   mem   存放位置   显示   let   

今天要来介绍一下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库串口中断接收的理解,欢迎大家讨论。

STM32F429基于CUBEMX的串口中断接收

标签:info   字符数组   and   修改   com   mem   存放位置   显示   let   

原文地址:https://www.cnblogs.com/showtime20190824/p/11407923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!