请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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;//<--此线将不断被命中! 为什么???
中断;
默认:
中断;
}
}