/*******************************************************************************
- @fn CH58x_LowPower_Light
- [url=home.php?mod=space&uid=2666770]@Brief[/url] 启动浅度睡眠(保持蓝牙功能)
- [url=home.php?mod=space&uid=3142012]@param[/url] time - 唤醒的时间点(RTC绝对值)
- [url=home.php?mod=space&uid=1141835]@Return[/url] state.
*/
__HIGH_CODE
uint32_t CH58x_LowPower_Light(uint32_t time)
{
#if (defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
volatile uint32_t i;
uint32_t time_tign, time_sleep, time_curr;
unsigned long irq_status;
// 提前唤醒
if (time <= WAKE_UP_RTC_MAX_TIME)
{
time_tign = time + (RTC_MAX_COUNT - WAKE_UP_RTC_MAX_TIME);
}
else
{
time_tign = time - WAKE_UP_RTC_MAX_TIME;
}
SYS_DisableAllIrq(&irq_status);
time_curr = RTC_GetCycle32k();
// 检测睡眠时间
if (time_tign < time_curr)
{
time_sleep = time_tign + (RTC_MAX_COUNT - time_curr);
}
else
{
time_sleep = time_tign - time_curr;
}
// 若睡眠时间小于最小睡眠时间或大于最大睡眠时间,则不睡眠
if ((time_sleep < SLEEP_RTC_MIN_TIME) ||
(time_sleep > SLEEP_RTC_MAX_TIME))
{
SYS_RecoverIrq(irq_status);
return 2;
}
RTC_SetTignTime(time_tign);
SYS_RecoverIrq(irq_status);
#if (DEBUG == Debug_UART0) // 使用其他串口输出打印信息需要修改这行代码
while ((R8_UART0_LSR & RB_LSR_TX_ALL_EMP) == 0)
{
__nop();
}
#endif
if (!RTCTigFlag)
{
PRINT("[SLEEP] Light sleep: Entering LowPower_Sleep (BLE functionality maintained)\r\n");
PRINT("[SLEEP] Light sleep: Parameters - RB_PWR_RAM32K=0x%02X, RB_PWR_RAM96K=0x%02X, RB_PWR_EXTEND=0x%02X\r\n",
RB_PWR_RAM32K, RB_PWR_RAM96K, RB_PWR_EXTEND);
sys_safe_access_enable();
R8_SLP_WAKE_CTRL |= RB_SLP_RTC_WAKE;
sys_safe_access_disable();
PRINT("[SLEEP] Light sleep: RTC wake event configured\r\n");
PRINT("[SLEEP] Light sleep: RTC trigger time set to %lu\r\n", time);
PRINT("[SLEEP] Light sleep: RTC mode control = 0x%02X\r\n", R8_RTC_MODE_CTRL);
PRINT("[SLEEP] Light sleep: Sleep wake control = 0x%02X\r\n", R8_SLP_WAKE_CTRL);
LowPower_Sleep(RB_PWR_RAM32K | RB_PWR_RAM96K | RB_PWR_EXTEND);
PRINT("[SLEEP] Light sleep: LowPower_Sleep completed, restoring system\r\n");
R8_RTC_FLAG_CTRL = (RB_RTC_TMR_CLR | RB_RTC_TRIG_CLR);
RTC_SetTignTime(time);
sys_safe_access_enable();
R8_HFCK_PWR_CTRL |= RB_CLK_XT32M_KEEP;
sys_safe_access_disable();
R8_RTC_FLAG_CTRL = (RB_RTC_TMR_CLR | RB_RTC_TRIG_CLR);
HSECFG_Current(HSE_RCur_100);
PRINT("[SLEEP] Light sleep: Completed - BLE functionality preserved\r\n");
return 0;
}
#endif
return 3;
}
为什么我是用CH584F进入了浅度睡眠模式使用LowPower_Sleep(RB_PWR_RAM32K | RB_PWR_RAM96K | RB_PWR_EXTEND);这个函数,还是在进入睡眠后无法实现蓝牙的正常功能