打印

[讨论] MSP430 IO中断嵌套

[复制链接]
301|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2023-2-9 10:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬,想请教一下,我在IO下降沿中断中服务程序中打开了总中断,每隔5ms进入一次定时器的中断,就会出现IO中断中串口发送数据有问题,请问我要实现这个功能有什么修改方法吗?
部分代码如下:
// AD采样中断服务程序,定时5ms
#pragma vector=tiMER0_A0_VECTOR
__interrupt void TimerA(void)
{   
    P4OUT ^= BIT4;
    ADC12CTL0 |= ADC12SC;                   // 开始AD转换
    while (!(ADC12IFG & BIT0));             // 判断转换是否完成
    if(ecg_cnt < ECG_Length)
        ecg[ecg_cnt++] = ADC12MEM0;             // AD值存入数组   
}

// IO中断服务程序,下降沿中断
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
    _EINT();
    int i;
    for(i=10;i>0;i--)
    {
        if(P1IN&BIT4)
          break;
        delay_ms(1);
    }
    if (i == 0)
    {
        P2SEL &= ~0x01;
        P2DIR |= 0x01;
        P2OUT = 0x01;
        delay_ms(50);
        Open_Timer1_A0();
        while (!(UCA0IFG&UCTXIFG));             // USCI_A0 TX buffer ready?
        UCA0TXBUF = 0xAA;  
         while (!(UCA0IFG&UCTXIFG));
        delay_ms(33);
        Close_Timer1_A0();
    }

    P2SEL &= ~0x01;
    P2DIR |= 0x01;
    P2OUT = 0x01;

    P1IFG &= ~BIT4;                     // 手动清除标志位
}

使用特权

评论回复
沙发
ayb_ice| | 2023-2-9 17:34 | 只看该作者
430MCU最大的两个弱点,没有硬件除法,中断不能直接嵌套

使用特权

评论回复
板凳
xyz549040622| | 2023-2-9 20:17 | 只看该作者
默认的MSP430是不能中断嵌套的,要想在执行某一中断时能够响应更高优先级的中断,需要在低优先级的中断程序中手动打开全局中断使能位,因为在进入中断服务子程序时全局中断使能位被清零,即禁止响应其它中断。
所以,你需要在定时器中断中也打开总中断。

使用特权

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

本版积分规则

1196

主题

3007

帖子

0

粉丝