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:2个中断之间的优先级不起作用、例如、在执行优先级7中断时、优先级0中断不会触发

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/928265/msp432p401r-the-priority-between-2-interrupts-is-not-working-e-g-priority-0-interrupt-does-not-trigger-while-priority-7-interrupt-is-executed

器件型号:MSP432P401R

你好

首先、我使用的是 TI-RSLK 机器人套件 https://training.ti.com/ti-robotics-system-learning-kit 、 其中包含 MSP432P401R LaunchPad。 我的程序在 MSP432P401R LaunchPadTm上使用 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、保险杠引脚);
}

  

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

    >      Interrupt_setPriority (INT_PORT1, 7); // SW1 is linked to P1.1, and 0 is highest priority

    此函数获取一个实际优先级字节、该字节的优先级为高(对于 MSP432) 3位、而不是低3位。 评论提到了这一点,但没有解释如何做。 您需要的公式为:

    > Interrupt_setPriority (INT_Port1、7 <<(8U -_NVIC_PRIO_Bits));// SW1链接到 P1.1、0为最高优先级

    其中_NVIC_PRIO_bits=3、因此移位计数为5。

    我个人使用 NVIC_setpriority(),它为您执行该算术运算。

    ------

    未经请求:  

    > Interrupt_setPriority (GPIO_PORT_P4, 0); // 0 is highest priority

    这不符合您的要求。 它要么被函数拒绝、要么设置一些您不想设置的字节(我不确定是哪一个字节)。 尝试:

    > Interrupt_setPriority (INT_PORT4, 0); // 0 is highest priority

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

    非常感谢  

    可以了