关于STM8S003和S103,可能会出现的一直进入串口接收中断子程序问题的处理。

关于STM8S003和S103,可能会出现的一直进入串口接收中断子程序问题的处理。

已有 2430 次阅读2016-7-20 10:28 |个人分类:STM8S

 
/*-------------------------------------- (C) COPYRIGHT  北 ----------------------------------------------
  * @文件性质:  应用总结。   
  * @笔记主题:  关于STM8S003和S103,可能会出现的一直进入串口接收中断子程序问题的处理。
  * @文件功能:  
  * @作者    :  bei
  * @创建日期:  20160720
 * @修改日期:  
 * @修改记录:      
-----------------------------------------------------------------------------------------------------------*/
 
对STM8S003F3或103系列等单片机,由于与其他单片机不一样,串口接收中断中有OR标志位(UART_SR寄存器中的OR位),即过载错误标志位。
若处理不当,将会导致反复进入串口接收中断。
 
一般,我们的串口接收中断子程序如下:
 INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
 {
u8 Res;
 
//读取接收到的数据,当读完数据后自动取消RXNE的中断标志位
Res = UART1_ReceiveData8();
 
        //数据接收过程处理。。。
 
 //清中断。
 UART1_ClearITPendingBit(UART1_IT_RXNE);
 }
 
但是对于STM8S003和STM8S103系列,若接收的数据被下个接收到的数据覆盖,会导致过载错误,UART_SR中的OR置位,引起串口中断从而进入中断程序。
所以必须正确地处理该位,否则会出现一直进入中断的问题。如下:
 
 INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
 {
u8 Res;
 
//读取接收到的数据,当读完数据后自动取消RXNE的中断标志位
Res = UART1_ReceiveData8();
 
    //数据接收过程处理。。。
 
 //清中断。
 UART1_ClearITPendingBit(UART1_IT_RXNE);
  
 //如果发生了过载错误,则清除该中断标志。
 if(UART1->SR & UART1_SR_OR)
 {
UART1_ClearITPendingBit(UART1_IT_OR);
  }  
 
//注意,直接写成 UART1_ClearITPendingBit(UART1_IT_OR); 依然会出现一直进中断的问题。
//我认为是需要先读下UART_SR这个寄存器,然后再清除,这样才能使程序正常。
 }
 
完结。

转载于:https://www.cnblogs.com/hubertboy/p/8007462.html

你可能感兴趣的:(关于STM8S003和S103,可能会出现的一直进入串口接收中断子程序问题的处理。)