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.

[参考译文] MSP430FR2355:首次睡眠后、禁用/启用 RTC LPM3.5不能#39;t SLEEP 达到预定时间

Guru**** 2553260 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/829807/msp430fr2355-disable-enable-rtc-lpm3-5-doesn-t-sleep-for-predetermined-time-after-first-sleep

器件型号:MSP430FR2355

大家好、感谢您花时间阅读我的问题。  

我已经编写了一个同时使用定时器 B0和 RTC 的程序。  当主主体处于激活状态时、B0计时器假定只以1秒的间隔闪烁 LED。 我投了一个 while 循环、以使系统保持活动状态10秒。 在它退出 HOLD 后、它将禁用 TIMER_B0并启用 RTC。 然后、我启用低功耗模式、它将休眠11秒。 一旦它退出低功耗模式、RTC 被禁用并且 Timer_B0被重新启用。 它会重复。  

#include 

void initGpio (void);

unsigned int IIIII;
unsigned int my_seconds;

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
my_seconds = 0;

initGpio(); //配置 GPIO

//初始化 XT1 32kHz 晶振
P2SEL1 |= BIT6 | BIT7; // P2.6~P2.7:晶振引脚
操作
{
CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1和 OFIFG); //测试振荡器故障标志

_enable_interrupt (); // RTC 中断应立即触发...

RTCMOD=(10*32)-1;
RTCCTL = RTCSS_2 | RTCSR | RTCPS_7;

//配置 Timer_A
TB0CTL = TBSSEL_1 | CNTL_1 | MC_2 | ID_3 | TBCLR | TBIE; // ACLK、计数模式、清除 TBR、启用中断

while (1)
{

IIIII = 0;

while (IIIII < 10)
{}

TB0CTL &=~TBIE;
P1OUT &=~BIT0;
RTCCTL |= RTCSR | RTCIE;
P6OUT &=~BIT6;
bis_SR_register (LPM3_bits| GIE);
RTCCTL &=~RTCIE;
TB0CTL |= TBIE | TBCLR;
}
}

void initGpio(void){

P1DIR = 0xFF;P2DIR = 0xFF;P6DIR = 0xFF;
P1REN = 0xFF;P2REN = 0xFF;
P1OUT = 0x00;P2OUT = 0x00;P6OUT = 0x00;

//配置 GPIO
P1DIR |= BIT0;
P1OUT |= BIT0;
P6DIR |= BIT6;
P6OUT |= BIT6;

//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
}

// Timer0_B3中断矢量(TBIV)处理程序
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMER0_B1_vector
_ interrupt void TIMER0_B1_ISR (void TI_B1_ISR)
(#TI_NOT_BIST_TRIB1)
(#TIMER0_B1)(void TI_TRIB1)(#TI_TRIB1)(TI_INCE_NOT_ERROR (TI_NOT_BIST_TRIB1)#TIMER0_NOT_VER_TRIB1)#TI_NOT_


#endif
{
switch (__evo_in_range (TB0IV、TB0IV_TBIFG))
{
案例 TB0IV_NONE:
中断; //无中断
案例 TB0IV_TBCCR1:
中断; // CCR1未使用
案例 TB0IV_TBCCR2:
中断; //未使用 CCR2
案例 TB0IV_TBIFG:
P1OUT ^= BIT0; //溢出
IIIII++;
my_seconds++;
中断;
默认值:
中断;
}
}

#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)#error!
#endif
{
switch (__evo_in_range (RTCIV、RTCIV_RTCIF))
{
案例 RTCIV_NONE:break; //无中断挂起
案例 RTCIV_RTCIF: // RTC 溢出
//在 P1.0上切换 LED
P6OUT ^= BIT6;
//TB0CTL ^= TBIE;

//将 P1OUT 值存储在备用存储器寄存器中
*(unsigned int *) BKMEM_BASE = P1OUT;
low_power_mode_off_in_exit ();
中断;
默认值: 中断;
}
}

这是问题、上面的代码只是我对实现双定时器、启用禁用过程的测试。 我已经将代码移到了实际程序中、我看到的是、在我第一次退出低功耗模式后、工作正常、我的系统重新启用 TIMER_B0并进行计数、但当它进入低功耗模式时、它会立即跳转到 ISR。 无延迟。  

我检查了寄存器、RTCMOD 仍然显示15F (351或11秒)。 在第一次进入 lpm 之前和之后、寄存器之间没有差异。  

第一个 LPM 之前

在第一个下午之后

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

    只要 RTCSS 不为零、RTC 就会继续计数。 发生这种情况时、RTC 周期与 TB0-10倍周期相同、因此当您设置 RTCIE 时、RTCIFG (如寄存器转储中所示)已经被置位。

    TB0也一直在计数(因为你没有设置 MC=0)、但其效果可能不太明显。

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

    Bruce、  

    你好!!  

    >TB0也一直在计数(因为您没有设置 MC=0),但其效果可能不太明显。

    是的、当我研究这个问题时、我注意到我需要改变 MC=0、这样我在睡觉时就不会消耗能量。 另一个方面是尽可能节省能源。 但它完全让我的想法下滑了。 感谢您指出这一点!!

    >>只要 RTCSS 不为零,RTC 就会继续计数。 发生这种情况时,RTC 周期与 TB0-10倍周期相同,因此当您设置 RTCIE 时,RTCIFG (如寄存器转储中所见>>)已经被置位。

    好的、那么、如果我理解正确的话。

    即使我在做  

    RTCCTL |= RTCSR | RTCIE; 

    我显然正在启用中断、但更重要的是、我认为 RTCSR 正在重置计数器。 提供了参考

    RTCCNT 可由溢出事件清除、也可以通过软件将逻辑1写入
    RTCCTL 寄存器的 RTCSR 位来复位。 

    在任何情况下、我都进行了这些更改

    TB0CTL &=~TBIE;
    TB0CTL &=~MC_2;//设置 MC=0
    P1OUT &=~BIT0;
    RTCCTL |= RTCSR | RTCIE | RTCSS_2;//将 RTCSS 设置为 XT1CLK
    P6OUT &=~BIT6;
    _BIS_SR_register (LTCIE
    
    和 RTCCTL = RTCCTI_2;//将 RTCSS 设置为 XT2|~~RTCCTI_RTCCTI_RTCCTL;RTCCTI_RTCCTI_RTCCTI_2;RTCCTI_RTCCTI_RTCCTI_RTCCTIM| //将 RTCSS 设置为无时钟
    TB0CTL |= TBIE | TBCLR | MC_2;//设置 MC=2 

    它现在似乎工作正常。 再次感谢你们的支持!!!!  

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

    但是 RTCSR 不会清除 RTCIFG、这正是我希望您遇到的情况。

    此外、RTCCNT 清除操作需要一个 XT1CLK 周期(~30US)、这可能足够长、从而在寄存器转储中产生幻象。  

    无论如何、我很高兴您能让它正常工作。