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.
我发现、除非我正确订购了代码、否则我的 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;//清除标志
}