[技术问答] N76E003串口中断与管脚中断冲突

[复制链接]
4256|12
 楼主| 302702801 发表于 2018-3-1 17:05 | 显示全部楼层 |阅读模式
当按下按键后,有几率导致程序卡死在串口发送的while(TI==0)中。
  1. void Send_Data_To_UART0 (UINT8 c)
  2. {
  3.     TI = 0;
  4.     SBUF = c;
  5.     while(TI==0);
  6. }

按键中断中没有程序修改TI的值,串口中断的优先级为3,管脚中断的优先级为2,还有个定时器中断的优先级为1.不知道具体是什么样的原因导致程序卡死在串口发送的判断语句中,要怎么样才能解决呢?
 楼主| 302702801 发表于 2018-3-1 17:11 | 显示全部楼层
  1. void PinInterrupt_ISR (void) interrupt 7
  2. {
  3.   if(PIF==0x20)
  4.   {
  5.                 while(P15==0);
  6.                 PIF = 0x00;
  7.     if(z==2&&high==0&&low==1)
  8.     {
  9.       LED3L;
  10.       LED4H;
  11.       high=1;
  12.       low=0;
  13.     }
  14.     else if(z==2&&high==1&&low==0)
  15.     {
  16.       LED3H;
  17.       LED4L;
  18.       high=0;
  19.       low=1;
  20.     }
  21.   }
  22.   else if(PIF==0x80)
  23.   {
  24.                 while(P17==0);
  25.                 PIF = 0x00;
  26.     if(z==0)
  27.     {
  28.       TXPLON;
  29.       LED5H;
  30.       LED3H;
  31.       if(EEPROM_ReadByte(0x3801)==1)
  32.       {
  33.         if(EEPROM_ReadByte(0x3802)==1)
  34.         {
  35.           LED1H;
  36.           LED2L;
  37.         }
  38.         else if(EEPROM_ReadByte(0x3802)==2)
  39.         {
  40.           LED1L;
  41.           LED2H;
  42.         }
  43.         else
  44.         {
  45.           LED1L;
  46.           LED2L;
  47.         }
  48.       }
  49.       else
  50.       {
  51.         LED1L;
  52.         LED2L;
  53.       }
  54.       high=0;
  55.       low=1;
  56.       z=2;
  57.                         set_TR0;
  58.                         set_TR2;
  59.     }
  60.     else if(z!=0)
  61.     {
  62.       LED_close();
  63.       z=0;
  64.     }
  65.   }
  66.         else if(PIF==0x10)
  67.         {
  68.                 while(P14==0);
  69.                 PIF = 0x00;
  70.                 if(z==2&&EEPROM_ReadByte(0x3801)==1)
  71.                 {
  72.                         if(EEPROM_ReadByte(0x3802)==1)
  73.                         {
  74.                                 LED1L;
  75.                                 LED2H;
  76.                                 EEPROM_WriteByte(0x3802,2);
  77.                         }
  78.                         else if(EEPROM_ReadByte(0x3802)==2)
  79.                         {
  80.                                 LED1H;
  81.                                 LED2L;
  82.                                 EEPROM_WriteByte(0x3802,1);
  83.                         }
  84.                 }
  85.         }
  86. }

这是其中的按键中断
 楼主| 302702801 发表于 2018-3-1 17:13 | 显示全部楼层
  1. void SerialPort0_ISR(void) interrupt 4
  2. {
  3.         if (RI==1)
  4.         {                                 
  5.                 clr_RI;                             
  6.                 if(SBUF==0xF2)       
  7.                 {
  8.                         UART_BUFFER[0] = 0xF2;
  9.                         u16CNT=1;
  10.                 }
  11.                 else if(SBUF==0xF1)
  12.                 {
  13.                         UART_BUFFER[u16CNT]=0xF1;
  14.                         clr_REN;
  15.                         flag=1;
  16.                         if(UART_BUFFER[2]==0x80)
  17.                         {
  18.                                 z=3;
  19.                                 if(UART_BUFFER[4]==0x02){ERROR=2;}
  20.                                 if(UART_BUFFER[4]==0x03){ERROR=3;}
  21.                                 if(UART_BUFFER[4]==0x04){ERROR=4;}
  22.                                 if(UART_BUFFER[4]==0x05){ERROR=5;}
  23.                                 if(UART_BUFFER[4]==0x06){ERROR=6;}
  24.                                 if(UART_BUFFER[4]==0x07){ERROR=7;}
  25.                                 if(UART_BUFFER[4]==0x08){ERROR=8;}
  26.                                 clr_TR0;
  27.                                 clr_TR2;
  28.                         }
  29.                 }
  30.                 else
  31.                 {
  32.                         UART_BUFFER[u16CNT] = SBUF;
  33.                         u16CNT ++;
  34.                         if(u16CNT>15){u16CNT=1;}
  35.                 }
  36.         }
  37.         if(TI==1)
  38.         {
  39.                 clr_TI;                          
  40.         }
  41. }

这是串口中断
  1. void senddata_power(UINT8 add,UINT8 cmd)
  2. {
  3.   UINT8 j;
  4.   UINT8 send_temp[6];
  5.   send_temp[0]=0xF1;
  6.   send_temp[1]=add;
  7.   send_temp[2]=cmd;
  8.   send_temp[3]=0x00;
  9.   send_temp[4]=add+cmd+0x00;  
  10.   send_temp[5]=0xF2;
  11.         P06=1;
  12.         clr_REN;
  13.   for(j=0;j<7;j++)
  14.   {
  15.     Send_Data_To_UART0(send_temp[j]);
  16.   }
  17.         set_ES;
  18.         P06=0;
  19.         set_REN;
  20.   delay(220);
  21.         clr_ES;
  22. }

这是串口发送函数
zhuotuzi 发表于 2018-3-4 10:09 | 显示全部楼层
可以顺利的发送数据c吗?如果可以,后面就别用这个while了,看看能否正常使用。
小了个明 发表于 2018-3-4 23:26 | 显示全部楼层

我现在测试串口0,直接将收到电脑串口的数据发回去,发现有丢包现象。大概1000 byte丢10byte  波特率 19200
小了个明 发表于 2018-3-4 23:28 | 显示全部楼层
感觉也像是 TI 没有清零
 楼主| 302702801 发表于 2018-3-5 10:03 | 显示全部楼层
zhuotuzi 发表于 2018-3-4 10:09
可以顺利的发送数据c吗?如果可以,后面就别用这个while了,看看能否正常使用。 ...

可以顺利发送C,但如果不用while就无**常发送了
 楼主| 302702801 发表于 2018-3-5 10:07 | 显示全部楼层
小了个明 发表于 2018-3-4 23:28
感觉也像是 TI 没有清零

因为我仿真就是卡在了while循环中,而且只有在按键触发管脚中断的时候才会出现这种情况,所以我不清楚是为什么导致管脚中断会和串口中断中清除标志位的语句冲突,让系统卡死在while循环中。
呵呵呵囧行 发表于 2019-2-27 17:02 | 显示全部楼层
您好,能给中断使用的代码分享给我下吗?官方例程看不懂啊
星奕科技 发表于 2023-4-20 18:41 | 显示全部楼层
朋友你好,我用N76E003也遇到同样的问题,捕获中断会概率触发程序卡死在while(!TI)处,请问你解决这个问题了没,如果解决了可否分享下你的经验,谢谢啦
小夏天的大西瓜 发表于 2023-4-21 11:45 | 显示全部楼层
个人感觉像是循环出问题了,建议再查看一下
中国龙芯CDX 发表于 2023-4-23 20:46 | 显示全部楼层
楼主是用官方的API函数应该没问题,是不是其他设置的问题
星辰大海不退缩 发表于 2023-4-23 20:47 | 显示全部楼层
是不是频率设置的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部