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.
我正在尝试编写一些简单的代码,以便使用Launchpad上的两个开关打开和关闭板载LED。 但是,只要我在端口1引脚4上启用中断,中断标志就会出现。 此引脚连接到Launchpad上的开关2 (常开),并在其关闭时将引脚连接到GND。 我开始做一些实验,当我启用端口1引脚5上的中断时也会发生这种情况,该端口1引脚5没有连接到任何按钮。 我已经使用了几种不同的配置,但我根本不知道为什么在启用中断时会发生中断。 端口1引脚1具有完全相同的寄存器和交换机配置,不会以这种方式运行。
我最初使用TI的驱动程序库为MSP432编写代码,然后通过设置寄存器值再次编写代码。 两个代码都有相同的问题。
我尝试了将引脚配置为具有下拉功能的输入时的上升边缘触发和将引脚配置为具有上拉功能的输入时的下降边缘中断触发,这两个引脚都有相同的问题。 我知道在MSP430s上,当寄存器初始化到正在设置的标志时,您必须清除中断。 但是,P1IFG寄存器将初始化为所有未断言的标志。
代码如下:
void main (void) { WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; //停止监视计时器 /* S1 */ GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO_PIN1); /* S2 */ GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO_PIN4); /*红色LED */ GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN0); GPIO _setOutputLowOnPin (GPIO端口P1,GPIO _PIN0); GPIO中断边缘选择(GPIO_PORT_P1, GPIO PIN1, GPIO高电平转换); GPIO中断边缘选择(GPIO_PORT_P1, GPIO_PIN4, GPIO高电平转换); //上3位控制硬件优先级,下7位控制子优先级 InterrupT_setPriority (INT_Port1,0xC0); GPIO注册器中断(GPIO_PORT_P1, InputIRQHandler); 中断= gPIO_getEnabledInterruptStatus(GPIO_PORT_P1); GPIO _启用中断(GPIO_PORT_P1, GPIO _PIN1); GPIO _启用中断(GPIO_PORT_P1, GPIO _PIN4); /*注册级别代码 P1->SEL0 &=~BIT4; P1->SEL1 &=~BIT4; P1->DIR &=~BIT4; P1->OUT |= BIT4; P1->REN |= BIT4; P1->IES |= BIT4; P1->IE |= BIT4; */ interrup_enableMaster(); whid(1); } void inputIRQHandler(void){ UINT_FAST16_t中断; 中断= gPIO_getEnabledInterruptStatus(GPIO_PORT_P1); IF (中断和GPIO _PIN1) { GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN1); GPIO _setOutputLowOnPin (GPIO_PORT_P1, GPIO _PIN0); } IF (中断和GPIO _PIN4) { GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN4); GPIO _setOutputHighOnPin (GPIO_PORT_P1, GPIO _PIN0); } }
有什么想法吗?
下面是我的代码:
#include <stdint.h>/* MSP432 driverlib includes */ #include <ti/devices/msp432p4xx/driverlib/gPIO.h> #include <ti/devices/msp432p4xx/driverlib/interrupti.h> void inputIRQHandler(void){ UINT_FAST16_t中断; 中断= gPIO_getEnabledInterruptStatus(GPIO_PORT_P1); IF (中断和GPIO _PIN1) { GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN1); GPIO _setOutputLowOnPin (GPIO_PORT_P1, GPIO _PIN0); } IF (中断和GPIO _PIN4) { GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN4); GPIO _setOutputHighOnPin (GPIO_PORT_P1, GPIO _PIN0); } } void main(void){ UINT_FAST16_t中断; WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; //停止监视计时器 interrup_disableMaster(); /* S1 */ GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO_PIN1); /* S2 */ GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO_PIN4); /*红色LED */ GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN0); GPIO _setOutputLowOnPin (GPIO端口P1,GPIO _PIN0); GPIO中断边缘选择(GPIO_PORT_P1, GPIO PIN1, GPIO高电平转换); GPIO中断边缘选择(GPIO_PORT_P1, GPIO_PIN4, GPIO高电平转换); //上3位控制硬件优先级,下7位控制子优先级 //中断_setPriority (INT_Port1,0xC0); GPIO _启用中断(GPIO_PORT_P1, GPIO _PIN1); GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN1); GPIO _启用中断(GPIO_PORT_P1, GPIO _PIN4); GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN4); GPIO注册器中断(GPIO_PORT_P1, InputIRQHandler); 中断= gPIO_getEnabledInterruptStatus(GPIO_PORT_P1); interrup_enableMaster(); 中断= gPIO_getEnabledInterruptStatus(GPIO_PORT_P1); while (1); }
我发现主中断在默认情况下是启用的,所以我在执行所有设置之前禁用了它,并在设置结束时重新启用它。 我在启用主中断之前和之后检查GPIO中断状态。 两次都显示未声明中断标志,但ISR仍输入一次。 但是,由于ISR逻辑检查GPIO中断标志(这些标志仍然都未断言),因此ISR不执行任何操作。
当我注释掉清除GPIO中断标志的代码时,返回其状态的函数将显示与WFP 1.4 关联的中断已声明。 我一启用中断,就好像中断就以某种方式锁定在NVIC中。 这甚至可能吗? 我是99 % ,确定这不是按钮的问题,因为WFP 1.1 的配置完全相同,不会出现此问题。 我尝试用与WFP 1.1 和WFP 1.4 相同的方法在端口1上设置所有的引脚,只有WFP 1.5 (一个浮动引脚)也表现出这种奇怪的行为,一启动就断言中断。
有什么想法吗?
我使用CMSIS函数 NVIC_GetPendingIRQ(Port1_IRQn)来检查NVIC中端口1中断的状态。 在我启用了WFP 1.4 中断之前,该功能返回0。 之后,它返回1。 因此,启用中断会导致断言NVIC端口1中断。 怎么会发生这种情况?
此代码似乎可以修复它,但我不应该为了使其正常运行而清除特定的引脚中断。 我想确切地了解在启用此特定的引脚中断时,会发生什么情况导致自动断言此特定的引脚中断。
#include <stdint.h>/* MSP432 driverlib includes */ #include <ti/devices/msp432p4xx/driverlib/gPIO.h> #include <ti/devices/msp432p4xx/driverlib/interrupti.h> void inputIRQHandler(void){ UINT_FAST16_t中断; 中断= gPIO_getEnabledInterruptStatus(GPIO_PORT_P1); IF (中断和GPIO _PIN1) { GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN1); GPIO _setOutputLowOnPin (GPIO_PORT_P1, GPIO _PIN0); } IF (中断和GPIO _PIN4) { GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN4); GPIO _setOutputHighOnPin (GPIO_PORT_P1, GPIO _PIN0); } } void main(void){ UINT_FAST16_t中断; WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; //停止监视计时器 interrup_disableMaster(); /* S1 */ GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO_PIN1); /* S2 */ GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO_PIN4); /*红色LED */ GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN0); GPIO _setOutputLowOnPin (GPIO端口P1,GPIO _PIN0); GPIO中断边缘选择(GPIO_PORT_P1, GPIO PIN1, GPIO高电平转换); GPIO中断边缘选择(GPIO_PORT_P1, GPIO_PIN4, GPIO高电平转换); //上3位控制硬件优先级,下7位控制子优先级 //中断_setPriority (INT_Port1,0xC0); GPIO _启用中断(GPIO_PORT_P1, GPIO _PIN1); GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN1); GPIO _启用中断(GPIO_PORT_P1, GPIO _PIN4); GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN4); NVIC_ClearPendingIRQ (端口1_IRQn); GPIO注册器中断(GPIO_PORT_P1, InputIRQHandler); interrup_enableMaster(); while (1); }
你好,Nicholas,
请告诉我您使用的是哪个Launchpad版本(可能发送图片)。 另外,请告诉我芯片的标记,以便我知道您组装的模具版本。
我将使用RevC器件设置启动板v 1.9 ,并将尝试MSP432 1.40 - v:01.00 示例"gPIO_INPUT_INTERRUC"示例,使驱动程序库实现虚拟化。
结果出来后,我会再找你们。
此致,
Dietmar
尝试在ISR中设置断点,并查看它是否进入。 我发布的代码正常工作,但意外进入ISR,没有明显的原因。
尼古拉斯,
当然,我也尝试了它的断点,但一旦让程序通过调试器运行,它就不会进入ISR。
第一次进入ISR时,我按下了2个按钮之一。
您能告诉我您使用的启动板版本和设备吗? 也许有不同之处。
此致,
Dietmar
我正在使用MSP-EXP432P401R Rev 2.1 Launchpad
我明白了。 我是在启用中断后直接清除中断标志,而不是直接在它之前清除。 我改变了
GPIO_enableInterrupt (GPIO端口P1,GPIO PIN4); GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN4);
至
GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN4); GPIO _启用中断(GPIO端口P1,GPIO PIN4);
它起了作用...只是表明您不能一定信任寄存器的默认值。 抱歉,没有问题。 我知道你早些时候曾建议过这一点,但我没有意识到我的旗帜是在中断启用之后才被清除的,这实际上是与清除旗帜的目的背道而驰的。 我仍然不知道为什么只有引脚4和5上的GPIO中断才会自动断言,但我想这也不是问题...感谢您的帮助!