蓝桥杯练习——STM32串口接收中断只有效执行了一次的问题

实践场景:

提示:这里简述项目相关背景:

STM32板子型号:STM32F103RBT6

内容:将RTC的初值设置为23:59:55,并将时间显示在LCD屏上,通过串口发送"XX:XX:XX",XX分别表示时、分、秒,可以完成时钟的重新配置。若发送数据不符合规定,则不做更改。

使用的串口类型:蓝桥杯比赛的串口 AccessPort
在这里插入图片描述


问题描述

串口接收中断出现的问题:

1、串口只能执行第一次接收中断,并在LCD屏幕上成功显示

2、第二次通过串口发送数据时,debug查看发现接收时数据出现错误,表现为接收数据第二位开始才是有效值,之后再进行发送则不再进入接收中断

3、(作者也不知道的问题)在通过对1和2的问题进行修改之后(方法在后面),重新注释掉修改的代码进行编译,发现问题也不会重新出现,如果有知道原因的朋友,欢迎评论区探讨。


一、有问题的串口配置:

u8 uart_buf[8];
u8 uart_count=0;
_Bool rtc_flag = 0 ;
void USART2_IRQHandler(void)
{
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
	USART_ClearITPendingBit (USART2, USART_IT_RXNE);
    /* Read one byte from the receive data register */
    uart_buf [uart_count++] = USART_ReceiveData(USART2);
		
	if(uart_count >= 8)
    {			
		uart_count = 0;	
		rtc_flag = 1;
		USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);		
    }		
  }
}

中断的开启:

USART_Cmd(USART2, ENABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

以上的配置一开始只能进行一次正常的数据接收。


解决办法:

通过IDLE中断RXNE中断结合: 实现接收一个字节,产生RXNE中断,一帧数据(串口一次接收的数据)接收后 ,产生IDLE中断

例:串口收到一个字节,产生8次RXNE中断和1次IDLE中断

一帧数据:
比如说单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。IDLE中断就是串口收到一帧数据后产生的中断。


解决方案:

IDLE中断
一、F1系列的单片机:“先读SR寄存器,再读DR寄存器”。
二、F0系列的单片机:需要用ICR寄存器清楚。
由于我用的是F1系列的单片机,处理方法如下:

1、串口初始化函数中,使能IDLE中断

USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);

2、串口中断函数中,添加IDLE中断处理:

	else if(USART_GetITStatus(USART2,USART_IT_IDLE) != RESET)//接收到一帧数据
	{
		USART2->SR;//先读SR
		USART2->DR;//再读DR
		uart_count = 0;
		printf("%s", uart_buf);
	}

最后一个问题:就是在编译了一次IDLE中断处理之后,再注释掉添加的IDLE中断,就没有出现原来的问题了,不是很明白是怎么回事。不过加上IDLE中断是真的不用担心是不是接受完一帧数据了。


完整代码链接: STM32F103RBT6单片机修改RTC时钟初值的串口接收中断问题。.
原帖地址: https://blog.csdn.net/main_h_/article/details/55668953.
十分感谢原帖楼主的分享。

要下载STM32串口中断接收数据程序,需要按照以下步骤进行操作: 1. 首先需要准备好开发环境,包括ST-Link下载调试器、编程软件(如Keil、IAR等)、USB转串口模块等。 2. 确保硬件连接正确。将STM32单片机与ST-Link下载调试器通过JTAG/SWD接口相连,将USB转串口模块的TX和RX引脚分别与STM32单片机的相应串口引脚相连。 3. 在编程软件中创建一个新的工程,并添加相应的库文件。打开文件->新建->MDK-ARM Project,然后选择对应的芯片型号。 4. 在工程中添加对应的串口库文件,例如“stm32f10x_usart.h”和“stm32f10x_usart.c”。 5. 配置串口的中断接收。在main函数中,通过设置USART_InitTypeDef结构体参数,配置相应串口的波特率、数据位、停止位等参数。然后通过NVIC_Configuration函数开启串口的中断。 6. 实现串口接收中断函数。在stm32f10x_it.c文件中,找到USARTx_IRQHandler函数。在该函数中编写串口接收数据的处理代码。例如,可以通过判断USART_GetITStatus(USARTx, USART_IT_RXNE)的返回值来判断是否收到数据,并通过USART_ReceiveData(USARTx)读取接收到的数据。 7. 编译并下载程序。在编程软件中点击“Build”,编译源代码并生成bin或hex文件。然后使用ST-Link下载调试器将生成的bin或hex文件下载到STM32单片机中。 8. 在STM32单片机上运行程序。将USB转串口模块连接电脑,并通过串口调试软件(如Tera Term)打开串口进行数据接收。 通过以上步骤,即可成功下载STM32串口中断接收数据程序,并实现数据的接收和处理。不过要注意,在编写代码过程中,需要根据具体的芯片型号和组件进行相应的配置和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值