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

问题

串口接收数据总会有一定的机率丢掉若干个字节,使用示波器查看串口的波形并无异常,使用串口调试助手查看数据发送端并未丢失数据,猜想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();//开总中断
   
  /*此处为定时器处理函数*/
}

按照上述方法更改之后,系统运行正常。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值