我遇到了一个奇怪的问题;我的端口1中断将不会清除。 从我调用的那一刻_enable_interrupt()
起、除了在中断处理程序中执行代码之外、我再也不执行任何其他代码-如果我在后面的语句上放置一个断点、我永远不会点击它、而在中断处理程序的入口和出口处插入一个断点则确认我正在反复点击它。 下面展示了这一点的最小示例:
#include <msp430.h>
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void){
P1IFG = 0;
return;
}
int main(void){
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P1DIR &= ~BIT5; // input
P1OUT |= BIT5; // pull up
P1REN |= BIT5; // enable pull
P1IES |= BIT5; // high -> low transition
P1IFG &= ~BIT5; //clear interrupt flag
P1IE |= BIT5; // enable interrupts
__enable_interrupt();
while(1){ }
return 0;
}
在调试器中、我可以看到 P1IE 被设置为0x20 (正确)、但是 P1IFG 寄存器在中断开始时为0x30。 这是错误的;它表明引脚4也在触发一个中断。 同样、当中断处理程序返回时、在中断处理程序中写入 P1IFG=0似乎不会更改 P1IFG 的值。
这并不是这个特定引脚特有的、我看到与我已经测试过的其他引脚具有相同的行为、从这些引脚触发中断(以及引脚的组合)。 我想知道特定的芯片是否坏了、所以构建了一些其他的板、它们的表现都是一样的。 我以前曾做过这项工作(实际上,在我的另一天,我做了一项完美的工作几分钟之后,它又开始出现了错误行为)。 我是否曾犯过模糊的硬件错误、或者我是否遗漏了什么?
我知道还有其他方法可以清除中断标志(例如、使用 P1IV)、但这些方法不再成功。