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:中断退出未返回到 main ()

Guru**** 2538955 points
Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/925001/msp-exp430f5529lp-interrupt-exit-not-returning-to-main

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

你(们)好!

我使用 CCS 和 MSP430开发板已经有一段时间了、因此我一直在引用我的旧代码来加快速度。 我使用的是 C++。 我当前正在使用 while (1)循环、该循环以 LPM0结束并启用全局中断。 然后、会触发计时器中断、切换 GPIO 引脚、我预期会发生的是 while (1)循环返回到开头、执行所有代码、然后在再次命中 LPM0线路时返回睡眠状态。

以下是 main()函数:

void main (void){
const uint8_t Testdata[]={0x05、0xF1、0x7D、0x18};
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P1DIR |= 0x01;
P1DS |= 0x01;//设置高驱动强度
时钟设置();

i2c 测试(0x50、100e3)



;while tACCLR_+ TA0200_+ tACCLR_+ tACTRL (tACTRUARTAC_0+ tACTRL)
test.transact ((uint8_t *) Testdata、4、write);
console.debugInfo((char *)"测试...\n"、11);
_bis_SR_register (LPM0_bits + GIE);
__NO_OPERATION ();
}


#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMER0_A1_vector
__interrupt void TIMER0_A1_ISR (void)
#Elif defined (__GERISR__)


支持的__attribute TIMER0_a1_vector (void TIMER0_A1_ISR)(void TI_a1_ERROR)(void TI_COMPLETE)(void TI_COMPLETE)#TI_TRISR_(void)(void TI_COMPLE
#endif
{
switch (__evo_in_range (TA0IV、14))
{
案例14://溢出
P1OUT ^= 0x01;
中断;
默认值:break;
}
} 

所以,定时器中断的运行正常(虽然我花了一段时间--我仍然不理解不同的 A0/A1矢量,但这是另一个时间)。 MSP430进入睡眠模式、触发计时器中断、GPIO 切换、但 while (1)循环中不执行任何操作。 基本上、它应该只发送一个 I2C 数据包、然后是"测试..."这一词 发送到 UART。 这是第一次通过循环、所有操作都有效。 但在它进入睡眠状态后、它不会执行。 我是积极的、我错过了一些我忽略过的小东西、但我会尽力去弄清楚它。

我还有一个与计时器中断有关的问题、但我将进行更多的读取、看看我是否无法自行解决。 clockSetup()将 MCLK 设置为以20MHz 运行的 DCO,SMCLK 被4分频以获得5MHz,ACLK 被设置为用于计时器的 REFOCLK。 为了获得更高的时钟速度、它还将 VCORE 置于其最高设置中。 我已经尝试添加_BIC_SR_register (LPM0_BITS);在 ISR 结束时、这没有什么不同(中断不应该自动将其从 LPM0中取出?)。

非常困难、阅读数据表/系列参考指南(以及查看 MSP430F5529示例、如 MSP430F55xx_ta0_04.c、没有帮助、因为它们在 LPM 入口后没有任何代码)。

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

    在 ISR 中退出低功耗模式、但设置该模式的位位于状态寄存器中。 状态寄存器的预中断版本位于栈上、等待通过从中断指令返回来恢复。

    为了在中断后返回以退出 LPM、您必须更改堆栈上状态寄存器的保存值。 不在您尝试过的状态寄存器中。 这在编译器之间有所不同、但您可以尝试 _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS)。

    我使用 gcc 和头文件定义了一些方便的宏、例如我一直使用的 LPM0和 LPM0_EXIT。 (GCC 还具有可用于使其退出的属性、以便 ISR 始终退出低功耗模式。)

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

    啊哈! 我知道我错过了一些小东西。 我正在使用 TI 编译器、但__BIC_SR_REGISTER_ON_EXIT ()是我所需的魔法。

    gcc 的属性是什么、使其始终退出低功耗模式?

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

    唤醒。 参见 slau646。