CH582低功耗问题

1.使用的是 BackupUpgrade_OTA 例程

2.预编译把 HAL_SLEEP=1,开启了睡眠 

3.初始化调用了下面的代码

void HAL_SleepInit(void)
{
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
    sys_safe_access_enable();
    R8_SLP_WAKE_CTRL |= RB_SLP_RTC_WAKE; // RTC唤醒
    sys_safe_access_enable();
    R8_RTC_MODE_CTRL |= RB_RTC_TRIG_EN;  // 触发模式
    sys_safe_access_disable();              //
    PFIC_EnableIRQ(RTC_IRQn);
#endif
}

4.HAL_SLEEP=1对应的是哪一种模式?

e469a2caca680eada69ab96130ecddd8.png

5.HAL_SLEEP=1实测发现蓝牙一直有在广播,手机连接收发也正常,TMOS的定时事件也有在运行,但是串口无法接收(中断),感觉是运行的是空闲模式



1.当我想接收串口数据时,如何停止休眠? 2.数据接收完了,如何恢复休眠?

串口数据是一问一答的,所以不需要那种IO触发唤醒的方式


HAL_SLEEP=1对应的是睡眠模式

系统的休眠是由协议栈管理的,在进行休眠时无法进行数据接收,因此会收不到数据。

可以参考这篇博客CH582芯片Sleep模式串口唤醒接收数据 - SweetTea_lllpc - 博客园 (cnblogs.com)


我的应用需要每隔120s执行一个动作,开了一个定时器来记秒数

但是开启休眠HAL_SLEEP=1后,定时器中断就没有执行了,有什么办法解决吗?

TMR1_TimerInit(FREQ_SYS);//设置定时时间1s
TMR1_ITCfg(ENABLE,TMR0_3_IT_CYC_END);//开启中断
PFIC_EnableIRQ(TMR1_IRQn);




void TMR1_IRQHandler(void) //TMR1定时中断,
{
? ?static uint32_t count=0;

? ?if(TMR1_GetITFlag(TMR0_3_IT_CYC_END))
? ?{
? ? ? ?count++;
? ?} ? ?
}



您好,HAL_SLEEP配置的是sleep等级的休眠,休眠期间主频是停掉的,会影响定时器的工作。

“每隔120s执行一个动作”的功能,可以直接使用TMOS系统,配置每120s循环执行事件,在休眠中也可以唤醒MCU并执行逻辑。


只有登录才能回复,可以选择微信账号登录