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.

[参考译文] MSP430FR6989:为什么板载按钮中断在此代码中不起作用?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/952860/msp430fr6989-why-does-the-onboard-button-interrupt-not-work-in-this-code

器件型号:MSP430FR6989

在下面的代码中、我希望使用其中一个板载开关来切换 P2.0的方向和输出。 注释掉的部分是我尝试过的内容

问题是、当我按下板载开关时、我使用 P2.0驱动的 LED 将关闭、但只有在我按下开关时才会关闭。 这与切换开关的愿望不一致。 在调试模式下、ISR 看起来根本就没有调用。

我只能假设我配置了错误的内容、但我不确定我没有完成什么。 在另一个程序中、使用初始化代码按开关1可正确复位矩阵。 我在下面也包括了该代码。

#include 


//
main int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 &=~LOCKLPM5;//解锁电源管理

P1DIR &=~BIT1;
P1REN |= BIT1;
P1OUT |= BIT1;
P1IES |= BIT1
;= BIT1;= BIT1;= BIT1;= BIT1;=~1;PITG;= BIT1
P1IE |= BIT1;

P2DIR |= BIT0; 
P2OUT |= BIT0; __ENABLE_INTERRUPT (); while (1) { __LOW_POWER_MODE_3 (); } 返回0; } /*Button Interrupt*/ #pragma vector=Port1_vector _interrupt void Port_1 (void) { if (P1IFG & BIT1){ P2DIR ^= BIT0;
P2OUT ^= BIT0; } P1IFG &&~BIT1; __LOW_POWER_MODE_OFF_ON_EXIT (); /*switch (__evo_in_range (P1IV、P1IV_P1IFG7)) { 案例 P1IV_NONE:break;//向量0:无中断 案例 P1IV_P1IFG0:中断;//矢量2:P2.0 案例 P1IV_P1IFG1://bit P1IE &=~BIT1;//禁用中断 P1IFG &=~BIT1;//CLEAR 标志 P2DIR ^= BIT0;//切换
P2OUT ^= BIT0; 中断; 案例 P1IV_P1IFG2:中断; 案例 P1IV_P1IFG3:break; 案例 P1IV_P1IFG4:中断; 案例 P1IV_P1IFG5:中断;//矢量12:P2.5 案例 P1IV_P1IFG6:中断;//矢量14:P2.6 案例 P1IV_P1IFG7:中断;//向量16:P2.7 默认值:break; }// /* if (P1IFG & BIT1)//如果按键1导致中断 {P2DIR ^= BIT0;
P2OUT ^= BIT0; P1IFG &&~BIT1; //_LOW_POWER_MODE_OFF_ON_EXIT ();//在选择低功耗模式后重新启用此功能? }*/ //结束中断支架 }
第二位代码:


#include 
#define BUTTON1 BIT1//Globals


unsigned int matrix [5]={0、0、0、0、0};


//=================== ===================
int main (void){
//volatile unsigned int I;

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

P1DIR &=~BUTTON1; //输入
P1OUT |= BUTTON1; //为上拉/下拉电阻器提供'1'以便它上拉
P1REN |=按钮1; //启用上拉/下拉

PM5CTL0 &=~LOCKLPM5; //从电源管理器解锁端口,导致中断!

P1IES |=按钮1; //下降沿上的中断
P1IFG &=~BUTTON1; //清除中断标志
P1IE |=按钮1; //启用中断

_enable_interrupt ();

while (1) //连续循环
{

_low_power_mode_3 (); //将进入睡眠状态,但保持 ACLK 运行
}

返回0;
}







//================================= 中断=========================================
//端口1
#pragma vector=Port1_vector 的中断服务例程 //关联函数。 具有中断矢量
_interrupt void Port_1 (void) // ISR 的名称
{
if (P1IFG & Button1){ //按钮1引起中断
//计数= 0;
矩阵[0]= 0;
矩阵[1]= 0;
矩阵[2]= 0;
矩阵[3]= 0;
矩阵[4]= 0;
P1IFG &=~BUTTON1; //清除 P1 Button1的中断标志
__LOW_POWER_MODE_OFF_ON_EXIT();
}

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

    哦、要添加:矩阵应该以不同的方式初始化。 我错误地复制了它。 它应该是这样的:

       unsigned int matrix [5]={5、5、5、5};

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

    该开关几乎肯定会在关闭和释放时触发多个中断。 这是触点反弹。 这意味着您将对引脚方向进行多次异或。

    按顺序进行一些按钮去抖。 输入引脚上接地的小电容(10nF 左右)将会实现该目的、当然也有软件方法。

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

    我可以验证去抖不是问题。 我尝试了简单的去抖循环、甚至更简单的方法:

       P2DIR = 0x00;//用这个替换 ISR 中的切换。

    这样、即使切换导致了代码的旧版本中的问题、也无法切换此赋值语句、对 ISR 的多次调用也会导致相同的赋值。 因此、我仍然感到卡在板载开关未按预期工作、我猜问题是如何设置它。

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

    好的、我已经解决了这个问题。

    事实上、代码按所写的那样正常运行(搁置无去抖现象)。 当我在调试模式下运行程序时、它根本不会进入 ISR。 我尝试重新刷新程序、但这不起作用。 然后、我切换到我的笔记本电脑、将项目复制到笔记本电脑上、并再次刷写、现在可以正常工作。

    几个月前、当我首次开始使用控制器时、当 CCS 尝试更新控制器时、我遇到了类似的问题。 我不确定是什么原因导致了这种情况-自从返回到我的桌面(刷写程序现在可以正常工作)后、我无法重现此情况。