打印

MSP430串口中断接收丢数据----(中断优先级问题)

[复制链接]
151|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coshi|  楼主 | 2023-7-12 08:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题
串口接收数据总会有一定的机率丢掉若干个字节,使用示波器查看串口的波形并无异常,使用串口调试助手查看数据发送端并未丢失数据,猜想MSP430接收数据出现问题,经过查资料对比文档,串口初始化并无问题。
以下为串口中断处理函数:

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
  uint8 data =0;
switch(__even_in_range(UCA1IV,USCI_UART_UCTXCPTIFG))
  {
    case USCI_NONE: break;
    case USCI_UART_UCRXIFG:
      while(!(UCA1IFG&UCTXIFG));
            data = UCA1RXBUF;
            if(data != 0x00)
              RxBuffer[RxCounter++] = data;// Read buffer

            if(RxCounter>511)//
               RxCounter=0;
      break;
    case USCI_UART_UCTXIFG: break;
    case USCI_UART_UCSTTIFG: break;
    case USCI_UART_UCTXCPTIFG: break;
  }   
}



通过查找资料,可能是由于其他中断影响了串口中断接收。

查找到的综合资料
1)MSP430中断优先级无法设置,是根据中断向量表;
2)430默认关闭中断嵌套,即进入中断后默认关闭总中断,除非进入中断程序后再次打开总中断;
3)若在中断服务程序中打开了总中断,来了多个中断,按照优先级来执行。

例如:
中断A服务程序中打开了总中断,就可以响应后来的中断B(不管中断B的优先级是比A高还是比A低),当中断B执行完之后继续执行中断A。中断B执行完之后进入中断A,此时总中断会自动打开;
进入中断B后总中断也会关闭,若此时要响应中断C,B中断服务程序中也要打开总中断。

解决办法
MSP430打开总中断的语句为

_EINT();//开总中断


我的代码中有定时中断和串口接收中断,定时中断被打断对于我的系统影响不大,所以程序在进入定时器中断程序中后我打开总中断,此时若有串口中断,串口中断程序会执行,就不会漏掉数据了。

/*timer A0 中断服务函数*/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0(void) //1s
{  
   _EINT();//开总中断

  /*此处为定时器处理函数*/
}


按照上述方法更改之后,系统运行正常。
————————————————
版权声明:本文为CSDN博主「家养钢铁侠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45325304/article/details/129020477

使用特权

评论回复
沙发
xyz549040622| | 2023-7-18 07:39 | 只看该作者
确实是经验之谈,不掉几个坑是不会找到这个问题的,当任务多,中断开的多的时候,系统就会迟缓,一般就是这个问题导致的。

使用特权

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

本版积分规则

95

主题

3301

帖子

4

粉丝