打印
[STM8]

串口接收中断为啥总是溢出错误

[复制链接]
857|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huwr|  楼主 | 2017-7-21 22:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用STM8的串口中断接收GSM模块的数据,波特率是38400,串口接收到的字符串有时候是对的,有时候会少一个字符。我发现是串口溢出错误引起的,如果不清除溢出标志,就会在串口中断里跳不出来了。
问题是,为啥我的程序老是溢出错误呢?
沙发
huanghuac| | 2017-7-21 22:23 | 只看该作者
串口的FIFO不够

使用特权

评论回复
板凳
happy_10| | 2017-7-21 22:26 | 只看该作者

中断优先级不够高

使用特权

评论回复
地板
huwr|  楼主 | 2017-7-21 22:27 | 只看该作者
我这里也就一个串口中断,一个定时器中断。

使用特权

评论回复
5
tian111| | 2017-7-21 22:29 | 只看该作者

看看你得程序吧

使用特权

评论回复
6
huwr|  楼主 | 2017-7-21 22:30 | 只看该作者

int main( void )
{
    u8 *pr,i;
    u8 loc_temp[20];
    GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);  //TXD   //txd初始化为高电平互补推挽输出模式
    GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);      //RXD    //rxd初始化为不带中断上拉输入模式  
    CLK_PeripheralClockConfig (CLK_Peripheral_USART1,ENABLE);//开启USART时钟
    USART_Init(USART1,38400,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx|USART_Mode_Rx);//设置USART参数9600,8N1,接收/发送
    USART_ITConfig (USART1,USART_IT_RXNE,ENABLE);//使能接收中断
    USART_Cmd (USART1,ENABLE);//使能USART
    CLK_PeripheralClockConfig (CLK_Peripheral_TIM4,ENABLE); //使能外设时钟
    TIM4_TimeBaseInit(TIM4_Prescaler_128, 0xff);
    TIM4_ClearFlag(TIM4_FLAG_Update);
    TIM4_ITConfig(TIM4_IT_Update, ENABLE);
    TIM4_Cmd(ENABLE);   
    enableInterrupts();
    Delay(60000);  
    GSM_Start_Config();
    while(1)
    {
    }
}
//===============================================================
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28) //串口中断处理程序
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
     u8 cc;
     if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中断处理
     {
         USART_ClearITPendingBit (USART1,USART_IT_RXNE);//清中断标志      
         cc=USART_ReceiveData8 (USART1);
         if(USART_RX_STA<200)
         {
            receive_count=0;
            if(USART_RX_STA==0)
            {
                count_start_flag =1;//计数器开始计数
            }
            USART_RX_BUF[USART_RX_STA++]=cc;         
         }
         else
         {
            USART_RX_STA|=1<<14;
            count_start_flag =0;
         }
     }
     if(USART_GetFlagStatus(USART1,USART_FLAG_OR)==SET)//溢出中断处理
     {
       USART_ClearFlag(USART1,USART_FLAG_OR);
       USART_ReceiveData8 (USART1);
      
     }     
}

使用特权

评论回复
7
zhuhuis| | 2017-7-21 22:31 | 只看该作者

你这个代码看着就头大   会不会是初始化问题呢

使用特权

评论回复
8
tian111| | 2017-7-21 22:31 | 只看该作者
波特率太高了  中断中处理数据时间太长   猜测的

使用特权

评论回复
9
gongche| | 2017-7-21 22:32 | 只看该作者


ITC_SPR6 &= 0x3f;//tim1 软件优先级2级
要不加上这句

使用特权

评论回复
10
chenho| | 2017-7-21 22:33 | 只看该作者

你查下手册  你的定时器中断号是多少 找到中断优先级控制r

使用特权

评论回复
11
huwr|  楼主 | 2017-7-21 22:34 | 只看该作者
唉,还是没有什么结果,算了,先结贴吧,多谢大家啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

780

主题

8627

帖子

5

粉丝