【问题标题】:Interrupt-Flag is set although Interrupt-Enable-Flag is not set尽管未设置中断启用标志,但已设置中断标志
【发布时间】:2020-03-29 15:47:57
【问题描述】:

我为 MSP430FR6989 编写了一个小程序,只要按下按钮,就可以切换 LED。

#include <msp430.h>

/**
 * main.c
 */
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    PM5CTL0 &= ~LOCKLPM5;

    // reset port 1
    P1DIR = 0x00;
    P1OUT = 0x00;

    // turn off led on startup
    P1DIR |= BIT0;
    P1OUT &= ~BIT0;

    P1DIR &= ~BIT1; // P1.1 -> input
    P1REN |= BIT1;  // P1.1 -> enable resistor
    P1OUT |= BIT1; // P1.1 -> pull-up resistor

    // enable on P1.1
    P1IES |= BIT1;
    P1IE |= BIT1;
    P1IFG = 0x00;

    __enable_interrupt();
    while(1)
    {
        __delay_cycles(1000);
    }

    return 0;
}

#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
    switch (__even_in_range(P1IV, P1IV_P1IFG1))
    {
        case P1IV_P1IFG1:
            P1OUT = (P1IN & BIT1)
                ? P1OUT & ~BIT0
                : P1OUT | BIT0;
            P1IES ^= BIT1;

            break;
        default:
            break;
    }
}

一切都按预期进行。 但是:当我调试程序时,我看到第一次按下按钮时 P1IFG 中的 BIT0 已设置。 为什么会这样?我以为只有启用相应的 IE-Bit 才会设置?

提前致谢

【问题讨论】:

  • 中断是理想的分层,这就是你作为程序员想要的,既出于开发原因,又出于灵活性。但这也意味着虽然外围设备有一个门可以将中断启用到下一个级别,但可能还有其他门可以将中断进一步向下启用到内核,有时它只有一个,因为您可能习惯于或两个,外设和处理器内核,有时甚至更多层,您必须启用所有层。
  • 同样,根据设计,您可能需要按特定顺序清除多个其中一个

标签: microcontroller interrupt msp430


【解决方案1】:

MSP430FR58xx, MSP430FR59xx, and MSP430FR6xx Family User's Guide 第 12.2.6 节说:

每个 PxIFG 位是其相应 I/O 引脚的中断标志,当所选输入信号沿出现在该引脚时,该标志置位。所有 PxIFG 中断标志​​都在其对应的 PxIE 位和 GIE 位被置位时请求中断。

因此,您始终可以使用 P1IFG 位来检查输入引脚上是否发生了转换。如果您想在代码开始读取引脚的当前状态时检测可能已经结束的短脉冲,这将非常有用。

这就是为什么您应该在启用中断之前清除 P1IFG 寄存器(除非您对旧事件感兴趣)。

【讨论】:

  • 所以这基本上意味着无论是否设置了中断使能标志,只要引脚改变其状态,P1IFG 位都会被设置,对吧?
  • 是的,它完全独立于启用标志。
猜你喜欢
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2014-12-23
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多