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.

[参考译文] MSP430FR2110:何时退出 LPM0/LPRM3

Guru**** 2516370 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/846658/msp430fr2110-how-to-exit-lpm0-lprm3-when

器件型号:MSP430FR2110

我使用的是 MSP430FR2110。 


我希望 MSP430FR2110在触发 RTC 中断时退出 LPM3/LPM0、否则进入 LPM3/LPM0。 然而、RTC 时钟中断在短时间后停止。 我是否未正确使用 ENTER 和 EXIT LPM (代码的突出显示部分)?

有关我的应用(以下代码)的详细信息、MSP430FR2110会在触发 RTC 中断时通过 SPI 发送数据。 MSP430FR2110应该进入 LPM3/LPM0直到下一个 RTC 中断事件。




#include volatile static uint16_t PIR_DATA[number_of 通道]; int main (void) { WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器 //将 MCLK (CPU 时钟)设置为3MHz // DCOFTRIM = 3、DCO 范围= 8MHz CSCTL1 = DCORSEL_3; //使用默认设置:数字控制器振荡器(DCO)作为 MCLK 和 SMCLK 时钟源 //将默认 REFO (~32768Hz)设置为 ACLK 源 CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK; PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式 //激活先前配置的端口设置 // RTC 计数 RTCMOD = 320-1; //初始化 RTC //源= ACLK = REFO SYSCFG2 |= RTCCKSEL; //选择 ACLK 作为 RTC 时钟 RTCCTL = RTCSS_1 | RTCSR | RTCPS__1 | RTCIE; while (1); } // RTC 中断服务例程 #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__) #pragma vector=RTC_vector __interrupt void RTC_ISR (void) #Elif defined (__GNU__) void 编译器_attribute__(interrupt (RTC_vector)#rTC_ISR (void)#else!错误! #endif { 开关(__evo_in_range (RTCIV、RTCIV_RTCIF)) { 案例 RTCIV_NONE:中断; //无中断 案例 RTCIV_RTCIF: // RTC 溢出 _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); _bis_SR_register (GIE); serial_interface_send_PIR_data (PIR_DATA); _bis_SR_register (LPM3_bits); 中断; 默认值:break; } }

 

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

    这里发生的情况是 RTC ISR 会暂停(中途)、直到下一个(RTC)中断再次调用它(递归)。 这种情况每秒会发生(32768/1/320=~100)次、每次在堆栈溢出之前向上送入更多堆栈。

    I (强烈)建议您不要在 ISR 中设置 GIE 或 LPM3_BITS。 从 ISR 调用到另一个器件驱动程序也是一个很好的主意。

    相反、设置一个标志、执行唤醒("...ON_EXIT")并返回、然后让 main 调用 serial_interface。