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.

[参考译文] MSP432P401R:调用两次中断服务例程

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/569737/msp432p401r-interrupt-service-routines-called-twice

器件型号:MSP432P401R

我发现、除非我正确订购了代码、否则我的 ISR 被调用两次。  下面是在 MSP432 Launchpad 上运行的一个简单的基于中断的程序。  我发现 Port1_IRQHandler:

void Port1_IRQHandler (void){
P1OUT ^= RED;//切换红色 LED
P1IFG = 0;//清除标志
} 

每次按下按钮时调用两次、不是触点反弹的结果。  从一些在线调查中可以看出、清除标志会使用高级外设总线(APB)与标志寄存器进行通信、这可能会延迟。  因此、当 CPU 从 ISR 返回并且看到该标志尚未清除时、它会立即返回到 ISR 中。  根据我所读出的内容、解决方案是在 ISR 内清除标志后执行 APB 读取指令、这可确保在 ISR 完成之前通过"刷写"总线来完成标志清除。

通过将 ISR 中的两条语句的顺序交换为以下内容、我能够修复以下程序:

void Port1_IRQHandler (void){
P1IFG = 0;//清除标志 
P1OUT ^=红色;//切换红色 LED 


这样、在标志清零后、P1OUT 就会进行读取-修改-写入。  

我对行为的解释是否正确?  这是否记录在任何地方? 

// //简单端口1中断示例 //********* #include "MSP.h" #define S1 BIT1 // S1按钮连接到 P1.1 #define RED BIT0 //红色 LED 连接到 P1.0 void main (void) { WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器 //为输出启用红色 LED P1OUT &=~红色; P1DIR |=红色; //将 S1设置为具有上拉电阻的输入 P1DIR &=~S1; P1REN |= S1; P1OUT |= S1; //为 S1启用下降沿中断 P1IES |= S1; P1IE |= S1; P1IFG = 0; //在 NVIC 中启用端口1中断 NVIC_EnableIRQ (Port1_IRQn); //全局中断使能 __ENABLE_INTERRUPTS (); while (1){} ////////////////////////////////////////////////////////// // port1ISR -端口1中断服务例程 //参数:none //返回值:none //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void Port1_IRQHandler (void){ P1OUT ^= RED;//切换红色 LED P1IFG = 0;//清除标志 }