器件型号: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); }