【发布时间】: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