UART2中断接 进入OR接收过载

2019-07-19 20:31发布


STM8_2018-03-06.rar (2.48 MB, 下载次数: 44) 2018-3-21 15:40 上传 点击文件名下载附件





STM8S005 芯片UART2中断接收数据完后不能跳出,一直死循环在中断里面,出现接收过载情况,请大神指点,我把程序贴出来,望大神指教。



void Uart2_Init(void)
{

   unsigned int baud_div=0;

   baud_div =HSIClockFreq/BaudRate1;  /*求出分频因子*/
   baud_div =baud_div;



   GPIO_Init(EN485_PORTD, TX_PD5, GPIO_MODE_OUT_PP_HIGH_FAST);//发送数据IO  
   GPIO_Init(EN485_PORTD, RX_PD6, GPIO_MODE_IN_PU_NO_IT);//接受数据IO  
   GPIO_Init(EN485_PORTD, EN485_PD4, GPIO_MODE_OUT_PP_HIGH_FAST);   //EN IO

       
        /*
         * 将UART1配置为:
         * 波特率 = 115200
         * 数据位 = 8
         * 1位停止位
         * 无校验位
         * 使能接收和发送
         * 使能接收中断
         */


    UART2->SR = (0<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);

    UART2->CR1 = (0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);
    /*1位起始位 8位数据位 结束位由CR3设置 不使用奇偶校验 不使能奇偶校验中断*/
    UART2->CR2 = (0<<7)|(0<<6)|(1<<5)|(0<<4)|(1<<3)|(1<<2);
    /*使能发送和接收 接收中断使能 禁止发送中断*/
    UART2->CR3 = (0<<6)|(0<<4)|(0<<3); /*设置1位停止位 不使能SCLK*/        
    UART2->CR5 = (0<<2)|(0<<1);     
    /*使用智能卡模式需要设置的,基本上保持默认就行了 */

    /*设置波特率*/
    baud_div =HSIClockFreq/BaudRate1;  /*求出分频因子*/
    UART2->BRR2 = baud_div & 0x0f;
    UART2->BRR2 |= ((baud_div & 0xf000) >> 8);
    UART2->BRR1 = ((baud_div & 0x0ff0) >> 4);    /*先给BRR2赋值 最后再设置BRR1*/

    UART2->CR1 |= (0<<5);         /*使能UART*/  

    GPIO_WriteLow(EN485_PORTD, EN485_PD4);    //485接收
    //GPIO_WriteHigh(EN485_PORTD, EN485_PD4);    //485发送   
}



u8   Rev_Data[20];
  u8   Rev_Count=0;
  u8   Rev_Finish=0;
   u8   Rev_Count_Buff;
INTERRUPT_HANDLER(UART2_RX_IRQHandler, 21)
{

    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
   //UART2_ClearITPendingBit(UART2_FLAG_RXNE);  //清中断标志位

   //UART2_ClearITPendingBit(UART2_IT_RXNE);
  // REV=UART2->SR;

  // REV=UART2_ReceiveByte();

   REV=UART2_ReceiveData8();

   if(REV=='#'){
     Rev_Count=0;

   }

    Rev_Data[Rev_Count] = REV;
    Rev_Count++;

   if(REV=='*'){
    // Rev_Count=0;
     Rev_Finish=1;    //完成接收,要判断地址和接收数据
     Rev_Count_Buff=Rev_Count;


   }  

   if(Rev_Count > 14)
    Rev_Count=0;


          if(UART2->SR & 0x08){   //读取DR 清除OR
            REV=UART2->SR;
            REV=UART2->DR;
            Rev_Finish=0;

          }  
       UART2_ClearITPendingBit(UART2_IT_RXNE);      
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。