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()
函数,或者在退出中断服务程序之前再次开启相应的中断,以便下一次能够继续触发中断。