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.

[参考译文] MSP-EXP430F5529LP:定时器和按钮中断的处理

Guru**** 2616675 points

Other Parts Discussed in Thread: MSP-EXP430F5529LP

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/669923/msp-exp430f5529lp-handling-of-timer-and-button-interruptions

器件型号:MSP-EXP430F5529LP
主题中讨论的其他器件:MSP430WARE

你(们)好 我正在编写一个程序、该程序应通过 MSP430F5529LP 上的按钮来打开和关闭直流/直流转换器。 该按钮与中断例程相关联。 PWM 控制功能在定时器_A5 ISR 内执行。 我的想法是在按钮的 ISR 内暂停和启动计时器。 启动时,定时器计数器不会自动启动,MSP 会获得 LPM0,因此我按下按钮并运行其 ISR,Timer_A_startCounter()触发定时器,而定时器的 ISR 运行。

问题是再次按下按钮不会使按钮的 ISR 执行变为关闭转换器。 我的错误是处理中断。 我不知道这是否是优先事项。

下面是我从中移除某些器件以方便您分析的代码。

谢谢你。

int main (void)
{
//大量初始化和 DRV 代码....
//全局启用中断
_enable_interrupt ();
//Enter LPM0、启用中断
_bis_SR_register (LPM0_bits + GIE);
__no_operation();
while (1)
{
_bis_SR_register (LPM0_bits + GIE);//输入 LPM0并等待中断
__no_operation();

};
}

#pragma vector=TIMER0_A1_vector // Timer0_A5 CC1-4、TA
__interrupt
#elif defined (__GNU__)
__attribute__((interrupt (TIMER0_A0_Vector)))
#endif
void TIMER0_A1_ISR (void)
{
//对 TAIV 寄存器的任何访问、读取或写入都会自动复位
//最高“挂起”中断标志
switch (__evo_in_range (TA0IV、14))
{
情况0:中断; //无中断
案例2:中断; 未使用//CCR1
案例4:中断; 未使用//CCR2
案例6:中断; 未使用//CCR3
案例8:中断; 未使用/CCR4
案例10:中断; 未使用/CR5
案例12:中断; 未使用//CCR6
案例14:
moduladorPWM();
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS + GIE);
中断;
默认值:break;
}
}

#pragma vector=Button1_vector
__interrupt void Button1_ISR (void)
{
字 I;

if (GPIO_getInterruptStatus (Button1_port、Button1_PIN)){
对于(i = 0x23FF;i > 0;I--){//廉价去抖
。}
if (GPIO_getInputPinValue (Button1_port、Button1_PIN)){
bButton1预置= true;
}
}

//打开
Timer_A_startCounter (timer_A0_BASE、timer_A_updown_mode);
//莱格奥莱格2佛得角-4.7
GPIO_setOutputHighOnPin (4、0x80);
//启用 DRV - MSP4305529LP P2.6输出低电平
GPIO_setOutputHighOnPin (2、0x40);

//关闭
//标记治疗
// Timer_A_stop (timer_A0_BASE);

GPIO_clearInterrupt (Button1_port、Button1_PIN);
__BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);//从 LPMx 唤醒主
功能} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我担心您可能会剪切比您预期更多的代码。

    如此处所述、每次按压按钮时所采取的操作相同、不区分备用(开/关)按压操作。

    此外、我猜您的按钮为低电平有效、但只有当引脚在去抖周期内恢复高电平时、bButtonPressed 才会被置位。

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

    [引用用户="Bruce McKenney47378"]如此处所述,每次按键时所采取的操作是相同的,不会区分备用(开/关)按键。 [/报价]

    是的、现在是相同的。 我使用 bButtonPressed 变量和其他标志解压缩信号量实现、以使用断点跟踪代码。  在这种情况下、现在处理开/关并不重要、只需输入按钮的 ISR 以验证它是否正常工作即可。

    [引用用户="Bruce McKenney47378"]此外,我猜您的按钮为低电平有效,但 bButtonPressed 仅在引脚在去抖期间恢复高电平时才会置位。 [/报价]

    我看不到这方面的问题。 在当前版本中、变量 bButtonPressed 不会用作任何语句中的条件。 正如我说过的、在第一次单击按钮的 ISR 时执行、在定时器开始中断运行后、按钮不再进入 ISR。   

    [引用用户="Bruce McKenneny47378"]原始代码有多长时间? 可能合适。  [/报价]

    定时器中断是通过以下示例代码的摘录生成的:MSP430Ware_3_80_00_06 \ driverlib \ examples \ MSP430F5xx_6xx \ timer_A \
    Timer_A_ex3_continedModeOperationWithTAIEInterrupt.c、
    Timer_A_ex4_pwmMultipleUpDown。
     
    我要为专用于 MSP430F5529LP 的代码 OutOfBox_EmulStorageKeyboard 的按钮插入中断函数、以进行 USB 通信:
    MSP430Ware_3_80_01_01 \示例\板\ MSP-EXP430F5529LP \ MSP-EXP430F5529LP_Software_Examples \ Firmware \ Source \ OutOfBox_StorageKeyboard。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Rafael、
    检查 ISR 之后的中断标志、按钮的标志是否仍然为高电平? 如果是这样、您可能需要在退出 ISR 之前尝试将其清除。