基于平台下载最新的例程CH583EVT,使用的例程是Peripheral,板子使用的是网上购买的最小系统,没有外设,当打开HAL_SLEEP 使能时竟然比不使能功耗还高,默认如果使用3.3V供电,当DCDC_ENABLE使能,HAL_SLEEP不使能,测出来的平均功耗是3.2毫安,继续打开HAL_SLEEP使能时,功耗不降反升,变成平均6毫安。显然不合理吧,如何使用CH58X_LowPower实现LowPower_Halt休眠,尝试修改并不成功,能否提供一个有效例程。且在CH58X_LowPower函数下的睡眠时间检测,似乎永远不满足睡眠?为什么传入唤醒的时间点(RTC绝对值)time要比time_curr大才合理?不应该小吗?
希望能提供一个例程,在蓝牙从机模式下实现睡眠和唤醒,唤醒后蓝牙能正常使用。唤醒一段时间,比如1分钟后再睡眠(此处可以通过蓝牙发送数据,串口数据等建议操作模拟可控睡眠而已)
以下是默认例程的CH58X_LowPower函数
#ifndef DCDC_ENABLE
#define DCDC_ENABLE TRUE
#endif
#ifndef HAL_SLEEP
#define HAL_SLEEP TRUE
uint32_t CH58X_LowPower(uint32_t time)
{
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
uint32_t time_sleep, time_curr;
unsigned long irq_status;
SYS_DisableAllIrq(&irq_status);
time_curr = RTC_GetCycle32k();
// 检测睡眠时间
if (time < time_curr) {
time_sleep = time + (RTC_TIMER_MAX_VALUE - time_curr);
} else {
time_sleep = time - time_curr;
}
// 若睡眠时间小于最小睡眠时间或大于最大睡眠时间,则不睡眠
if ((time_sleep < SLEEP_RTC_MIN_TIME) ||
(time_sleep > SLEEP_RTC_MAX_TIME)) {
SYS_RecoverIrq(irq_status);
return 2;
}
RTC_SetTignTime(time);
SYS_RecoverIrq(irq_status);
#if(DEBUG == Debug_UART1) // 使用其他串口输出打印信息需要修改这行代码
while((R8_UART1_LSR & RB_LSR_TX_ALL_EMP) == 0)
{
__nop();
}
#endif
// LOW POWER-sleep模式
if(!RTCTigFlag)
{
LowPower_Halt();
SetSysClock(CLK_SOURCE_PLL_60MHz);
//LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM30K | RB_PWR_EXTEND);
if(RTCTigFlag) // 注意如果使用了RTC以外的唤醒方式,需要注意此时32M晶振未稳定
{
time += WAKE_UP_RTC_MAX_TIME;
if(time > 0xA8C00000)
{
time -= 0xA8C00000;
}
RTC_SetTignTime(time);
//LowPower_Idle();
}
HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
}
else
{
return 3;
}
#endif
return 0;
}