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.

[参考译文] 编译器/MSP430FR5869:GPIO中断持续触发

Guru**** 2540460 points
Other Parts Discussed in Thread: MSP430FR5869

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/584114/compiler-msp430fr5869-gpio-interrupt-fires-constantly

部件号:MSP430FR5869

工具/软件:TI C/C++编译器

我正在使用MSP430FR5869的设备上工作,该设备具有多个低活动按钮,但无法使GPIO中断正常工作。  我使用了逻辑分析器来确认感兴趣的针脚是否被正确拔出,按下按钮时针脚变低,松开按钮时针脚又变高。  但是,使用以下代码时,中断服务例程会持续触发,即使我从未按下过该按钮。  无论我使用哪一个PIN,它都能执行此操作。  使用Code Composer Studio查看端口3寄存器时,我发现中断标志始终设置,并且似乎从未清除。  我已尝试手动清除中断标志,但这没有帮助(用户手册中说这不是必需的)。

是否有人看到我做错了事?

谢谢!

Adam J.

/************************************************************************
*本示例为低活动GPIO中断设置引脚。 当
引脚变低并解码其为哪个引脚时,将触发中断*服务例程。
***************** /

#include <MSP430.h>
#include "driverlib.h" //用于MSP430FR5xx_6xx

int main(void)
{
//停止看门狗计时器。
WDTCTL = WDTPW | WDTHOLD;

//将系统时钟初始化为16MHz,等待状态为1。
FRCTL0 = FRCTLPW | NWITS_1;

CS_setDCOFreq (CS_DCORSEL_1,CS_DCOFSEL_4);

//将MCLK和SMCLK配置为由DCOCLK提供源代码。
cs_initClockSignal (CS_SMCLK,CS_DCOCLK_SELECT,CS_Clock_diver_4);
cs_initClockSignal (CS_MCLK,CS_DCOCLK_SELECT,CS_Clock_diver_1);

//配置为输入引脚。
GPIO_setAsInputPin (GPIO端口P3,GPIO _PIN7);

//启用上拉电阻。
GPIO _setAsInputPinWithPullUp阻 器(GPIO_PORT_P3,GPIO _PIN7);

//禁用中断。
GPIO禁用中断(GPIO_PORT_P3,GPIO _PIN7);

//清除所有挂起的中断。
GPIO清除中断(GPIO_PORT_P3,GPIO _PIN7);

//将中断设置为在下降边缘触发。
GPIO_selectInterruptEdge (GPIO端口_P3,GPIO _PIN7,GPIO _高_至_低_转换);

//启用中断。
GPIO_enableInterrupt (GPIO端口P3,GPIO _PIN7);

//启用全局中断。
__enable_interrupit();

//永远在这里等待。
while (true);
}/*

Port 3 Interrupt Vector for ionKEY_R,ionKEY_U,ionKEY_L,ionKEY_D*/
#pragma vector=PORT3_vector;
__interrupt void port3(void)
{
//此位将告诉我们哪个引脚导致中断触发。
//它是易失性的,因此编译器不会对其进行优化。
易失性uint8_t引脚;

//确定端口中哪个针脚导致中断。
//您可能认为我们会检查中断标志寄存器,但不会!
//用户手册的示例让我们检查中断向量寄存器。
//此外,不需要清除中断标志,因为根据
//用户手册中的"对的低位字节的任何访问(读取或写入)
// PxIV寄存器(字或字节访问)自动重置
//最高暂挂中断标志。"
开关(__偶 数_范围内(P3IV,16))
{
案例0: //矢量0-无中断
中断;
案例2: //矢量2 -引脚0
引脚= 0;
中断;
案例4: //矢量4 -引脚1
引脚= 1;
中断;
案例6: //矢量6 -引脚2
引脚= 2;
中断;
案例8: //矢量8 -引脚3
引脚= 3;
中断;
案例10://矢量10 -引脚4
引脚= 4;
中断;
案例12://矢量12 -引脚5
引脚= 5;
中断;
案例14://矢量14 -引脚6
引脚= 6;
中断;
案例16://矢量16 -引脚7
pin =7;//<--此线将不断被命中! 为什么???
中断;
默认:
中断;
}
}

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

    您好,Adam:
    重置或开机后,您应配置以下步骤。 在你的代码中,我 错过了第二个代码。 您是否尝试清除 LOCKLPM5位?

    1.初始化端口:PxDIR,PxREN,PxOUT和PxIES

    2.清除LOCKLPM5

    3.如果未从LPMx.5唤醒:清除所有PxIFG以避免错误的端口中断  

    4.在PxIE中启用端口中断

    此致,
    托比亚斯

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

    谢谢!  就是这样。  我在上面的示例第22行之后添加了以下内容,现在可以正常工作:

    //加电后,清除PM5CTL0寄存器中的LOCKLPM2 5位,否则部分
    // IO功能将保持锁定。
    pm_unlockLPM5();