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:GPIO 中断仍会触发,尽管使用 Interrupt_disableMaster ()禁用了所有中断;

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/928215/msp432p401r-gpio-interrupt-still-triggers-although-all-interrupts-are-disabled-using-interrupt_disablemaster

器件型号:MSP432P401R

你好  

我有一个测试 GPIO 中断的简单程序。 我按照   MSPWare 代码示例中建议的中断使能序列步骤进行了操作。  基本上1)启动关键段并禁用内部的所有中断、2)配置 GPIO 中断端口、引脚和边沿选择、3) NVIC 设置、最后4)启用主中断以结束关键段。  

我的代码函数很简单、当按下开关1按钮时、将在 ISR 中切换 LED1。  

问题基本上与  Interrupt_enableMaster()有关;我尝试注释掉此行以查看其效果。 我期望通过注释掉,按下 switch1按钮将不起作用,因为所有中断都是使用(Interrupt_disableMaster();)禁用而没有重新启用的,因为(Interrupt_enableMaster();) 已注释掉?

我真的很困惑、因为有这些原因、我真的对关键部分的想法提出质疑。

我的代码如下所示:

/*********
*按下开关 s1时、此程序切换 LED1 (红色)。 当按下开关2时切换 LED2 (蓝色)
*当按下两个开关时,LED2 (紫色)切换
/

#include "driverlib.h"

void LED1_Initialization (){
MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);//将 P1.0设置为输出(P1.0连接到低功耗 LED1)
MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);//初始关闭
};

void SW1_Initialization (){
GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN1);//Pin1.1连接到 SW1
};

int main (void)
{

WDT_A_HOLDTimer();

LED1_Initialization ();
SW1_Initialization ();

// GPIO 中断设置的7个步骤
// 1-通过禁用所有中断来启动关键段
interrupt_disableMaster ();
//--------------- 启动临界区-------------------------------------------------------- //
// 2-边沿选择。 在我们的情况下、当按下任何按钮时、将输入低电压(下降沿)
GPIO_interruptEdgeSelect (GPIO_PORT_P1、GPIO_PIN1、GPIO_HIGH_TO_LOW_TRANSITION);

// 3-清除中断标志
GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1);

// 4-启用 GPIO 中断
GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1);

// 5-设置优先级
Interrupt_setPriority (INT_Port1、0);// SW1链接到 P1.1、0为最高优先级

// 6-在端口1的 NVIC 中启用中断
Interrupt_enableInterrupt (INT_Port1);

// 7-临界区末尾,启用已启用的中断
//Interrupt_enableMaster();/*问题出在这里。 即使这行被注释,按 switch1按钮仍会调用中断并切换 LED1*/
//--------------- 临界区的末尾------------------------------------------------------- //
while (1)
{
PCM_gotoLPM0InterruptSafe ();//将 MC 置于睡眠状态,直到发生中断
}
}


void Port1_IRQHandler (void)
{
MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1);
}

 

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

    这是 PCM_gotoLPM0InterruptSafe。 您将注意到、它会短暂启用、然后禁用 中断。

    我明白为何他们这样做,但事后看来,这可能令人感到惊讶。 如果您用"_WFI ();"替换该调用、您将获得所需的结果。 (您将获得唤醒、但不会调用 ISR。)

    bool PCM_gotoLPM0InterruptSafe (void)
    {
    bool slHappenedCorrect;
    
    /*禁用主中断。 在 Cortex M 中、如果中断被启用、则为
    主机中断被禁用、WFI 将会发生一个 WFI
    立即退出。 *
    interrupt_disableMaster();
    
    "改正"附录= PCM_gotoLPM0();
    
    /*非常快速地启用和禁用中断,以便
    处理器捕获任何挂起的中断*/
    interrupt_enableMaster();
    interrupt_disableMaster();
    
    返回"改正"附录;
    } 

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

    谢谢 Bruce、__WFT();工作!

    是否还会像 PCM_gotoLPM0InterruptSafe ()一样将 MC_gotoLPM0InterruptSafe ()置于睡眠模式?

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

    裸__WFI ()约为 LPM0。 要获得更高的 LPM、您需要使用 driverlib 知道的一些其他寄存器(我总是需要查找)。

    我假设 LPM 问题只是您测试的一部分、因为通常情况下、在关键部分中不会涉及 LPM。

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

    谢谢