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.

[参考译文] MSP430FR2310:中断不会清除

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1014083/msp430fr2310-interrupts-will-not-clear

器件型号:MSP430FR2310

我遇到了一个奇怪的问题;我的端口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)、但这些方法不再成功。

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

    上拉电阻非常弱、因此 RFI 可能会导致问题。 端口中断不取决于引脚是否配置为输入、因此请尝试将其设置为输出。 这应保证不会发生中断。

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

    1) 1)请勿忘记"PM5CTL0 &=~LOCKLPM5;"。 在初始化 P1IFG/P1IE 之前执行此操作。 [参考用户指南(SLAU445I)第8.3.1节]

    2) 2) IFG 位被置位、与 IE 位无关。 为您不感兴趣的事件设置 IFG 是常规做法。

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

    第一个就是我所缺少的内容。 但它使我感到困惑的是、它以前是有效的。 我只能假设我要么将其放入并删除(合理)、要么我会从超时的单粒子翻转(不太可能)中受益。

    谢谢!