This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430F5529:嵌套中断

Guru**** 2826755 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/949031/ccs-msp430f5529-nested-interrupts

器件型号:MSP430F5529

工具/软件:Code Composer Studio

我基本上尝试使用这个进行嵌套中断。  我让 WDT ISR 在正确的时序下正常工作、但 port2_ISR 调用不当(或者我认为根本不正确)。  我可以取消注释第27行和注释第26行、LED 将会完美切换。  但是、当我尝试使用嵌套 ISR 执行它时、它不执行任何操作。

#include 

int i = 0;

void main (void)
{
WDTCTL = WDTPW | WDTSSEL_SMCLK | WDTIS__512 | WDTTMSEL;//设置 WDT 0.5ms 间隔
P4DIR |= BIT7; //将 P1.0设置为输出方向(LED2)
P4OUT &=~BIT7; // LED2最初关闭
SFRIE1 |= WDTIE; //启用 WDT 中断
_BIS_SR (LPM0_Bits + GIE);//输入 LPM0、带中断
P2IE |= BIT1; //在 P2.1上启用中断
P2IES |= BIT1; //为中断启用 hi->lo 边缘
P2IFG &=~BIT1; //清除任何错误的中断标志
}

//看门狗计时器中断服务例程
#pragma vector=WDT_vector
__interrupt void watchdog_timer (void)
{
if (i < 1000)
i++;
其他
{
I = 0;
P2IFG |= BIT1;
//P4OUT ^= BIT7;
}
}

#pragma vector = port2_vector //SW1 ISR
__interrupt void port2_ISR (void)
{
P2IFG &=~BIT1;//清除标志
P4OUT ^= BIT7;//切换 LED2
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    作为处理中断的一部分、处理器会清除 GIE、因此如果您希望能够处理 ISR 中的另一个中断、则必须自行设置 GIE。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是否意味着我需要在  WDT ISR 内重复行(_BIS_SR (LPM0_BITS + GIE);//输入 LPM0 w 中断)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试通过_EINT()进行设置;在 WDT ISR 内部进行设置,但这不起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是我当前(不工作)的设置:

    #include 
    
    int i = 0;
    
    void main (void)
    {
    WDTCTL = WDTPW | WDTSSEL_SMCLK | WDTIS__512 | WDTTMSEL;//设置 WDT 0.5ms 间隔
    P4DIR |= BIT7; //将 P1.0设置为输出方向(LED2)
    P4OUT &=~BIT7; // LED2最初关闭
    SFRIE1 |= WDTIE; //启用 WDT 中断
    _BIS_SR (LPM0_Bits + GIE);//输入 LPM0、带中断
    P2IE |= BIT1; //在 P2.1上启用中断
    P2IES |= BIT1; //为中断启用 hi->lo 边缘
    P2IFG &=~BIT1; //清除任何错误的中断标志
    }
    
    //看门狗计时器中断服务例程
    #pragma vector=WDT_vector
    __interrupt void watchdog_timer (void)
    {
    _EINT();//重置 GIE
    if (i < 1000)
    i++;
    其他
    {
    I = 0;
    P2IFG |= BIT1;//为 SW1设置标志
    }
    }
    
    #pragma vector = port2_vector //SW1 ISR
    __interrupt void port2_ISR (void)
    {
    P2IFG &=~BIT1;//清除标志
    P4OUT ^= BIT7;//切换 LED2
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    _EINT()与_BIS_SR (GIE)相同

    配置端口中断的代码永远不会执行、因为您之前进入 LPM0并且无法退出它。 此外,您应该在 main()的末尾执行一些操作,而不是依赖启动代码在退出时执行合理的操作。 一个简单的 while (1);可以。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在这里没有想到 LPMO 会是个问题。  只需删除 LPMO 设置即可将其修复。  谢谢你们!