问题
串口接收数据总会有一定的机率丢掉若干个字节,使用示波器查看串口的波形并无异常,使用串口调试助手查看数据发送端并未丢失数据,猜想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
|