STM32F429基于CUBEMX的串口中断接收

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

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

时间: 2024-08-28 15:13:38

STM32F429基于CUBEMX的串口中断接收的相关文章

Stm32L0串口中断接收使用

最新在做LoRa的项目,使用的是STM32L072和SX1276,需要做一个串口透传模块,刚开始做demo的时候不考虑功耗,所以串口发送和接收直接使用下列函数执行: HAL_UART_Transmit(&Sensor_UartHandle,(unsigned char *)&readcommand, sizeof(vcom_read_command_t), VCOM_START_DELAY); HAL_UART_Receive(&Sensor_UartHandle,(unsigne

利用串口空闲中断接收数据

1 void USART2_IRQHandler(void) 2 { 3 // 使能串口空闲中断 4 USART_ITConfig(USART2, USART_IT_IDLE , ENABLE); 5 6 if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET) 7 { 8 9 rx_buf[cnt]=USART_ReceiveData(USART2); 10 rx_rxbuf[cnt] = rx_buf[cnt] ;//把接收到的数组存到备用的数组当中,

stm32RS485串口通信——中断接收发送数据

功能:通过PC机的串口调试助手发送数据给串口A,串口B接收到串口A发送的数据,再由串口B将接收到的数据返回给PC机的串口调试助手. PC->串口A->串口B->PC. 实验平台:stm32f407 /********************************************************************* 本平台具有六个串口: com1  485 com2 com3  232 需一个管脚控制DTU com4 485 com5  调试串口  TTL com6

【转】搞定单片机多字节串口接收(串口多字节接收发送的高阶研究)

搞定单片机多字节串口接收(串口多字节接收发送的高阶研究) 原文地址:http://bbs.ednchina.com/BLOG_ARTICLE_3007162.HTM 工作了一年多,写了不少单片机串口程序.感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回复一字节只是多了一个循环. 串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了.然而在实际应用当中,基本

STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

Ⅰ.写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件.硬件)I2C主机控制从机EEPROM的例子.在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信.但在实际项目中作为I2C从机的应用相对要少的多,本文主要讲述关于[STM32F10x_硬件I2C主从通信]中STM32作为从机的例子. 在学习本问内容之前,如果对I2C协议还不太了解的朋友请先去了解一下I2C协议,或看我之前关于I2C通信的文章(我微信公众号和博客都有). 关于STM32硬件I2C作

STM32串口中断卡死主循环问题分析

在一项目中,使用STM32作为主控,程序运行一段时间后概率出现主循环卡死现象. 问题分析如下: 1.程序USART2不停接收并处理串口数据,波特率115200: 2.主循环卡死: 3.USART1中断及TIM2中断响应函数运行正常:(USART1及TIM2中断优先级均比USART2高) 4.出现现象后,拔掉USART2的接收数据线,现象不能回复正常: 5.出现现象后,拔掉后再插入USART2的接收数据线,现象不能回复正常: 6.并未出现HardFault现象: 基于以上4点,可能原因如下: 1.

STM8S和STM8L调试串口中断的注意点

1. STM8L串口中断注意点 在调试PM2.5传感器GP2Y1051的时候,发现在仿真的时候开始能够进行数据的接受,但是如果暂停之后就不能接受数据,其实只是接收了一次完整的数据. 问题程序 解决方法 if(USART_GetITStatus(USART1, USART_IT_RXNE)) { RecevieData = USART_ReceiveData8(USART1); switch(state_machine) 2. STM8S串口中断注意点 征对STM8S003F3或者103系列等单片

串口中断

1 中断图里边,芯片,最右侧是CPU,左边都是寄存器.2 PND寄存器不需要设置,需要判断.3 问题串口0中断有2级中断么? 串口中断28号,但是对应了3个中断源,2,串口错误 1,串口发送, 0 ,串口接收.4 8N1中的N表示无校验.5 当你向串口BUF中写入一个时,不取走的情况下,不能再写.6 代码和栈怎么理解? 4K指SRAM4K的大小. nandflash 256K,SRAM,4K,(SRAM只有4K,但是占用了128的地址,片选0) 4096(4096~3840表示系统栈空间) 38

STM32串口中断的一些资料

在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里.以供自己查阅,以及方便其他人. TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理的方式,从队列以及FIFO方面写起. SECTION 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 /* 调试STM32串口过程中发现一个奇怪的问题,