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 中断的简单程序。 我按照 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。