【求助】KE02跑一会儿就进不了串口中断了

2020-02-19 20:53发布

      用的是MKE02Z32VLD2型号的单片机,外部20Mhz晶振,串口波特率为57600,开了UART1串口接收中断,禁用了发送中断,采用查询的方式发数据。

      问题是:做了几块板子,发现串口通信不正常,有的跑了十几分钟就没通信了,有的几个小时后才没通信,可以确定没通信后单片机没死机,按按键有反应,能进定时器中断闪个灯什么的,没开看门狗。

      发现问题后,在串口中断里不做任何串口数据处理,只是亮个灯,空读数据,然后在main主循环里熄灭在串口中断里亮起的那个灯。单片机跑起来后开始那个灯会闪,不一定的时间后就不闪了,单片机也没死机。
可以确定是进不了串口接收中断了,非常郁闷啊!

      串口配置:

  1. void UART_Config( void )
  2. {
  3.     UART_ConfigType sUART_Config;
  4.    
  5.     sUART_Config.u32SysClkHz = BUS_CLK_HZ;                  //总线时钟20MHz
  6.     sUART_Config.u32Baudrate = UART1_BAUD_RATE;             //波特率57600
  7.    
  8.     UART_Init(UART1,&sUART_Config);  
  9.    
  10.     UART_EnableInterrupt(UART1,UART_RxBuffFullInt);         //使能串口接收中断
  11.    
  12.     //关闭发送完成中断
  13.     UART_DisableInterrupt(UART1,UART_TxBuffEmptyInt);
  14.     UART_DisableInterrupt(UART1,UART_TxCompleteInt);
  15.    
  16.    
  17.     UART_SetCallback(&UART_ReceiveTask);

  18.     /* enable UART1 interrupts */      
  19.     NVIC_EnableIRQ(UART1_IRQn);   
  20. }
复制代码

      串口接收中断函数里的内容:

  1. void UART_ReceiveTask( UART_Type *pUART )
  2. {
  3.     volatile unsigned char temp = 0;
  4.    
  5.     Light_FaultLED(0);    //亮个指示灯
  6.    
  7.     if( UART_IsRxBuffFull(pUART) )
  8.     {   
  9.         temp = UART_ReadDataReg(pUART);
  10.     }
  11. }
复制代码

      main主循环里就是按键检测,AD采样,清那个指示灯。还开了KBI和PIT中断,没开看门狗。


各位大神帮忙分析一下可能的原因吧,我已经无计可施了~

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
26条回答
FSL_TICS_ZP
1楼-- · 2020-02-21 17:58
哪能确定单片机不进入Receive中断后,程序还可以正常执行其他操作吗?
lpantonie
2楼-- · 2020-02-21 21:20
FSL_TICS_ZP 发表于 2015-3-16 14:19
哪能确定单片机不进入Receive中断后,程序还可以正常执行其他操作吗?

目前来看,进不了串口中断后,按按键有反应,PIT定时器中断能正常控制闪灯~
FSL_TICS_ZP
3楼-- · 2020-02-22 00:52
lpantonie 发表于 2015-3-16 16:08
目前来看,进不了串口中断后,按按键有反应,PIT定时器中断能正常控制闪灯~ ...

在这种情况下,又进行过单步调试,查看寄存器的各个位状态吗?
lpantonie
4楼-- · 2020-02-22 01:29
 精彩回答 2  元偷偷看……
FSL_TICS_ZJJ
5楼-- · 2020-02-22 03:45
lpantonie 发表于 2015-3-17 12:34
Keil 5不给力,调到串口罢工的时候,就没响应了,下断点多调试几次有时也会没响应,真是够了!!!{:cry: ...

你有没有设置嵌套中断优先级?
现在确定是ADC中断影响了串口接收中断吗?
lpantonie
6楼-- · 2020-02-22 08:35
今天来结贴,问题应该解决了,跑了好多天未出现问题!
结论是和我写的程序计算溢不溢出没有关系,是官方提供的串口接收例程有点问题,串口接收容易溢出,但是中断里加溢出判断好像没有作用,以下是目前使用的解决方案:
1.一开始将PIT0定时中断里的语句提到main主循环里根据标志位处理,中断里只剩置标志位语句,测试没发现问题。以为该问题解决,先这样跑着吧,但是毫无理由PIT0中断能干扰到串口接收中断彻底进不去的地步!
2.后来另外一同事也遇到了相同的问题,发现串口接收溢出比较频繁,多次尝试,在串口中断里再判断一遍接收是否溢出就可以了,或在主循环里判断也行
   可以这样写:
void UART_ReceiveTask( UART_Type *pUART )
{
    volatile unsigned char temp = 0;
   
    /* check overrun flag *///防止溢出卡死,空读数据,使之能正常接收数据
    if( UART_CheckFlag(pUART,UART_FlagOR) )
    {
        temp = UART_ReadDataReg(pUART);
    }
    /* check receiver */
    else if( UART_IsRxBuffFull(pUART) )
    {   
  
        //这里写串口接收到数据后的处理程序
        temp = UART_ReadDataReg(pUART);
        ...............      
  
    }
    else
    {
        /* default interrupt */
        temp = UART_ReadDataReg(pUART);
    }

   
    /* check overrun flag *///再判断一遍,防止溢出卡死,空读数据,使之能正常接收数据
    if( UART_CheckFlag(pUART,UART_FlagOR) )
    {
        temp = UART_ReadDataReg(pUART);
    }
   
}


好了,此贴结贴,各位散了吧!

一周热门 更多>