打印
[技术问答]

N76E003串口中断与管脚中断冲突

[复制链接]
3699|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
302702801|  楼主 | 2018-3-1 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当按下按键后,有几率导致程序卡死在串口发送的while(TI==0)中。
void Send_Data_To_UART0 (UINT8 c)
{
    TI = 0;
    SBUF = c;
    while(TI==0);
}

按键中断中没有程序修改TI的值,串口中断的优先级为3,管脚中断的优先级为2,还有个定时器中断的优先级为1.不知道具体是什么样的原因导致程序卡死在串口发送的判断语句中,要怎么样才能解决呢?
沙发
302702801|  楼主 | 2018-3-1 17:11 | 只看该作者
void PinInterrupt_ISR (void) interrupt 7
{
  if(PIF==0x20)
  {
                while(P15==0);
                PIF = 0x00;
    if(z==2&&high==0&&low==1)
    {
      LED3L;
      LED4H;
      high=1;
      low=0;
    }
    else if(z==2&&high==1&&low==0)
    {
      LED3H;
      LED4L;
      high=0;
      low=1;
    }
  }
  else if(PIF==0x80)
  {
                while(P17==0);
                PIF = 0x00;
    if(z==0)
    {
      TXPLON;
      LED5H;
      LED3H;
      if(EEPROM_ReadByte(0x3801)==1)
      {
        if(EEPROM_ReadByte(0x3802)==1)
        {
          LED1H;
          LED2L;
        }
        else if(EEPROM_ReadByte(0x3802)==2)
        {
          LED1L;
          LED2H;
        }
        else
        {
          LED1L;
          LED2L;
        }
      }
      else
      {
        LED1L;
        LED2L;
      }
      high=0;
      low=1;
      z=2;
                        set_TR0;
                        set_TR2;
    }
    else if(z!=0)
    {
      LED_close();
      z=0;
    }
  }
        else if(PIF==0x10)
        {
                while(P14==0);
                PIF = 0x00;
                if(z==2&&EEPROM_ReadByte(0x3801)==1)
                {
                        if(EEPROM_ReadByte(0x3802)==1)
                        {
                                LED1L;
                                LED2H;
                                EEPROM_WriteByte(0x3802,2);
                        }
                        else if(EEPROM_ReadByte(0x3802)==2)
                        {
                                LED1H;
                                LED2L;
                                EEPROM_WriteByte(0x3802,1);
                        }
                }
        }
}

这是其中的按键中断

使用特权

评论回复
板凳
302702801|  楼主 | 2018-3-1 17:13 | 只看该作者
void SerialPort0_ISR(void) interrupt 4 
{
        if (RI==1)
        {                                 
                clr_RI;                             
                if(SBUF==0xF2)       
                {
                        UART_BUFFER[0] = 0xF2;
                        u16CNT=1;
                }
                else if(SBUF==0xF1)
                {
                        UART_BUFFER[u16CNT]=0xF1;
                        clr_REN;
                        flag=1;
                        if(UART_BUFFER[2]==0x80)
                        {
                                z=3;
                                if(UART_BUFFER[4]==0x02){ERROR=2;}
                                if(UART_BUFFER[4]==0x03){ERROR=3;}
                                if(UART_BUFFER[4]==0x04){ERROR=4;}
                                if(UART_BUFFER[4]==0x05){ERROR=5;}
                                if(UART_BUFFER[4]==0x06){ERROR=6;}
                                if(UART_BUFFER[4]==0x07){ERROR=7;}
                                if(UART_BUFFER[4]==0x08){ERROR=8;}
                                clr_TR0;
                                clr_TR2;
                        }
                }
                else
                {
                        UART_BUFFER[u16CNT] = SBUF;
                        u16CNT ++;
                        if(u16CNT>15){u16CNT=1;}
                }
        }
        if(TI==1)
        {
                clr_TI;                          
        }
}

这是串口中断
void senddata_power(UINT8 add,UINT8 cmd)
{
  UINT8 j;
  UINT8 send_temp[6];
  send_temp[0]=0xF1;
  send_temp[1]=add;
  send_temp[2]=cmd;
  send_temp[3]=0x00;
  send_temp[4]=add+cmd+0x00;  
  send_temp[5]=0xF2;
        P06=1;
        clr_REN;
  for(j=0;j<7;j++)
  {
    Send_Data_To_UART0(send_temp[j]);
  }
        set_ES;
        P06=0;
        set_REN;
  delay(220);
        clr_ES;
}

这是串口发送函数

使用特权

评论回复
地板
zhuotuzi| | 2018-3-4 10:09 | 只看该作者
可以顺利的发送数据c吗?如果可以,后面就别用这个while了,看看能否正常使用。

使用特权

评论回复
5
小了个明| | 2018-3-4 23:26 | 只看该作者

我现在测试串口0,直接将收到电脑串口的数据发回去,发现有丢包现象。大概1000 byte丢10byte  波特率 19200

使用特权

评论回复
6
小了个明| | 2018-3-4 23:28 | 只看该作者
感觉也像是 TI 没有清零

使用特权

评论回复
7
302702801|  楼主 | 2018-3-5 10:03 | 只看该作者
zhuotuzi 发表于 2018-3-4 10:09
可以顺利的发送数据c吗?如果可以,后面就别用这个while了,看看能否正常使用。 ...

可以顺利发送C,但如果不用while就无**常发送了

使用特权

评论回复
8
302702801|  楼主 | 2018-3-5 10:07 | 只看该作者
小了个明 发表于 2018-3-4 23:28
感觉也像是 TI 没有清零

因为我仿真就是卡在了while循环中,而且只有在按键触发管脚中断的时候才会出现这种情况,所以我不清楚是为什么导致管脚中断会和串口中断中清除标志位的语句冲突,让系统卡死在while循环中。

使用特权

评论回复
9
呵呵呵囧行| | 2019-2-27 17:02 | 只看该作者
您好,能给中断使用的代码分享给我下吗?官方例程看不懂啊

使用特权

评论回复
10
星奕科技| | 2023-4-20 18:41 | 只看该作者
朋友你好,我用N76E003也遇到同样的问题,捕获中断会概率触发程序卡死在while(!TI)处,请问你解决这个问题了没,如果解决了可否分享下你的经验,谢谢啦

使用特权

评论回复
11
小夏天的大西瓜| | 2023-4-21 11:45 | 只看该作者
个人感觉像是循环出问题了,建议再查看一下

使用特权

评论回复
12
中国龙芯CDX| | 2023-4-23 20:46 | 只看该作者
楼主是用官方的API函数应该没问题,是不是其他设置的问题

使用特权

评论回复
13
星辰大海不退缩| | 2023-4-23 20:47 | 只看该作者
是不是频率设置的问题

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝