器件型号:MSP432P401R
你好
首先、我使用的是 TI-RSLK 机器人套件 https://training.ti.com/ti-robotics-system-learning-kit 、 其中包含 MSP432P401R LaunchPad。 我的程序在 MSP432P401R LaunchPad上使用 LED1
开发套件(MSP‑EXP432P401R)和 TI-RSLK 机箱上的保险杠开关。
我正在创建一个简单的程序来演示中断之间的优先级设置。 1)在我的代码中、我创建了2个简单的 GPIO 中断1)通过按下开关1触发第一个中断并点亮 MSP432P401R LaunchPad 上的 LED1、2)如果 TI-RSLK 机箱上的任何碰撞开关被按下、则触发第二个中断、 其中这些开关连接到 MSP432P401R LaunchPad 上的端口4。 我将开关1中断的优先级设置为7 (最低)、而保险杠将中断切换为0 (最高)。 如我的代码下方所示、两个 ISR 都非常简单、如果按下开关1、则切换 LED1;如果按下任何碰撞开关、则切换 LED2。 我在每个 ISR 中都有2个断点;一个在第一行触发 LED、另一个在第二行清除中断标志。 为了测试保险杠中断优先级高于开关1中断、我按下了开关1按钮、触发中断1并转至 ISR 1中的第一行、该行会切换 LED1、 由于该行有一个断点、因此在我单击 Continue (继续)之前、我按下了一个碰撞开关按钮、因此在执行第二行之前、它会转到具有更高优先级的 ISR2、在完成 ISR2后、它会返回 ISR1的第二行。 但是实际发生的情况是 ISR1继续正常运行、然后执行第2行、然后处理传输到 ISR2。 这违反了预期的优先级覆盖、虽然我的代码非常简单、但我真的不知道问题在哪里。
如果有任何帮助、我们将不胜感激! 提前感谢
/********* *按下开关 s1时、此程序切换 LED1 (红色)。 当按下开关2时切换 LED2 (蓝色) *当按下两个开关时,LED2 (紫色)切换 / #include "driverlib.h" #define LED2_PINFO_PIN2|GPIO_PIN1|GPIO_PIN0 #define FMPER_PIN0|GPIO_PIN2|GPIO_PIN3|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7 // P4.0、2、3、5、6、Port7 初始化方法(Bum_4初始化) //将 P4.1配置为 GPIO /*P4->SEL0 &= 0x12;//将引脚0、2、3、5、6、7设置为 GPIO P4->SEL1 &= 0x12; //将 P4.0,2,3,5,6,7英寸 P4->DIR &= 0x12; //激活该引脚上的电阻器 P4->REN |= 0xED; //使其成为上拉电阻器 P4->OUT |= 0xED; //更简单 GPIO_setAsInputPinWithPullUp电 阻器(GPIO_PORT_P4、GPIO_PIN0); GPIO_setAsInputPinWithPullUp电 阻器(GPIO_PORT_P4、GPIO_PIN2); GPIO_setAsInputPinWithPullUp电 阻器(GPIO_PORT_P4、GPIO_PIN3); GPIO_setAsInputPinWithPullUp电 阻器(GPIO_PORT_P4、GPIO_PIN5); GPIO_setAsInputPinWithPullUp电 阻器(GPIO_PORT_P4、GPIO_PIN6); GPIO_setAsInputPinWithPullUp电 阻器(GPIO_PORT_P4、GPIO_PIN7);*/ //最简单的方法 GPIO_setAsOutputPin (GPIO_PORT_P4、保险杠引脚); return; } void BumperSwitches_Interrupt_Initialization (){ // 7个 GPIO 中断设置步骤 //--------------- 启动临界区-------------------------------------------------------- // // 2-边沿选择。 在我们的情况下、当按下任何按钮时、将输入低电压(下降沿) MAP_GPIO_interruptEdgeSelect (GPIO_PORT_P4、保险杠引脚、GPIO_HIGH_TO_LOW_TRANSITION); // 3-清除中断标志 GPIO_clearInterruptFlag (GPIO_PORT_P4、保险杠引脚); // 4-启用 GPIO 中断 GPIO_enableInterrupt (GPIO_PORT_P4、保险杠引脚); // 5-设置优先级 INTERRUPT_setPriority (GPIO_PORT_P4、0);// 0是最高优先级 // 6-在端口1的 NVIC 中启用中断 Interrupt_enableInterrupt (INT_Port4); //--------- 临界区的末尾------------------------------------------------------- // } void LED2_Initialization(){ /*MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN0);//将 P2.0设置为输出(P2.0连接到低功耗 LED2红色) MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN0); MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN1);//将 P2.1设置为输出(P2.1连接到低功耗 LED2绿色环保) MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1); MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN2);//将 P2.2设置为输出(P2.2连接到低功耗 LED2蓝色) MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN2);*/ //最简单的方法 MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、LED2_Pins); MAP_GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1); }; 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 }; void SW1_Interrupt_Initialization (){ // 7个 GPIO 中断设置步骤 //--------------- 启动临界区-------------------------------------------------------- // // 2-边沿选择。 在我们的情况下、当按下任何按钮时、将输入低电压(下降沿) MAP_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、7);// SW1链接到 P1.1、0为最高优先级 // 6-在端口1的 NVIC 中启用中断 Interrupt_enableInterrupt (INT_Port1); //--------- 临界区的末尾------------------------------------------------------- // } int main (void) { WDT_A_HOLDTimer(); LED1_Initialization (); LED2_Initialization (); SW1_Initialization (); BumperSwitchPort4_initialization_BasicMethod(); // 1-通过禁用所有中断来启动关键段 interrupt_disableMaster(); SW1_Interrupt_Initialization (); BumperSwitches_Interrupt_Initialization (); // 7-临界区末尾,启用已启用的中断 MAP_Interrupt_enableMaster(); while (1) { __WFI ();//等待中断 } } void Port1_IRQHandler (void) { MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0); GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1); } void Port4_IRQHandler (void) { MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P2、LED2_Pins); GPIO_clearInterruptFlag (GPIO_PORT_P4、保险杠引脚); }