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串口通信程序

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值