STM32中断清除标志位后无法再次进入中断问题及解决方案

USART清除中断标志位问题

在调用USART_ClearITPendingBit()函数清除中断标志位的时候,会导致下一次中断无法进入,例如以下程序:

/*错误案例*/
void USART1_IRQHandler(){
	
	if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET){
		
			uart_cout("测试USART_IT_RXNE = true");
		
			USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
    //或者将USART_ClearITPendingBit(USART1,USART_IT_RXNE)放在这一行
}

以上案例的问题在于,USART_ClearITPendingBit需要确保DR寄存器里面的值已经被接收了,所以如果如果加上`uint16_t data = USART_ReceiveData(USART1);``问题就解决了

/*解决案例1*/
void USART1_IRQHandler(){
	
	if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET){
		
			uart_cout("测试USART_IT_RXNE = true");
		   
			USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
}

在中断结束的位置,重新开启中断函数即可。

chatGPT:

如果已经进入过 USART 接收中断服务程序,并且在中断服务程序中已经调用了 USART_ClearITPendingBit() 函数来清除中断标志位,则接下来即使接收到新的数据,也无法再次触发中断。解决方法是不要在中断服务程序中调用 USART_ClearITPendingBit() 函数,或者在退出中断服务程序之前再次开启相应的中断,以便下一次能够继续触发中断。

参考:
田野的小站-STM32F103C8T6USART串口通信程序

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F429系列微控制器中的串口通信通常使用USART(通用异步接收发送器)模块,包括USART1、USART2、USART3等,它们都支持中断功能,用于处理接收数据完成、发送数据就绪或错误情况。要清除串口中断标志位,你需要操作特定的寄存器。 首先,你需要确定你要操作的是哪个USART的中断标志,因为每个USART都有自己的标志寄存器。比如,USART1的中断标志位于USART1->ISR(中断状态寄存器)和USART1->ICR(中断清除寄存器)中。对于USART1,清除中断标志位的步骤通常是: 1. **读取中断标志**:通过写入`USART1->ISR`寄存器,读取你感兴趣的中断标志(如RXNE、TXE、NE、PE、FRE、OVR等)。 ```c uint32_t flags = USART1->ISR; ``` 2. **清除中断标志**:然后将这些标志位对应的值写入`USART1->ICR`寄存器。例如,要清除RXNE(接收就绪),你将`flags & USART_ISR_RXNE`与0进行&运算并写回ICR: ```c USART1->ICR = flags & USART_ISR_RXNE; // 清除RXNE标志 ``` 3. **重复此过程**:如果需要清除多个标志,可以分别对每个标志执行上述操作,如清空`USART_ISR_TXE`(发送就绪)和`USART_ISR_OVR`(溢出)等。 ```c USART1->ICR |= (USART_ISR_TXE | USART_ISR_OVR); // 清除TXE和OVR标志 ``` 记得在实际编程中,你需要根据你的具体需求和所使用的USART子集来调整这些操作。此外,可能还需要考虑中断的嵌套处理和中断优先级设置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值