基于平臺下載最新的例程CH583EVT,使用的例程是Peripheral,板子使用的是網(wǎng)上購買的最小系統(tǒng),沒有外設(shè),當(dāng)打開HAL_SLEEP 使能時竟然比不使能功耗還高,默認(rèn)如果使用3.3V供電,當(dāng)DCDC_ENABLE使能,HAL_SLEEP不使能,測出來的平均功耗是3.2毫安,繼續(xù)打開HAL_SLEEP使能時,功耗不降反升,變成平均6毫安。顯然不合理吧,如何使用CH58X_LowPower實現(xiàn)LowPower_Halt休眠,嘗試修改并不成功,能否提供一個有效例程。且在CH58X_LowPower函數(shù)下的睡眠時間檢測,似乎永遠(yuǎn)不滿足睡眠?為什么傳入喚醒的時間點(RTC絕對值)time要比time_curr大才合理?不應(yīng)該小嗎?
希望能提供一個例程,在藍(lán)牙從機模式下實現(xiàn)睡眠和喚醒,喚醒后藍(lán)牙能正常使用。喚醒一段時間,比如1分鐘后再睡眠(此處可以通過藍(lán)牙發(fā)送數(shù)據(jù),串口數(shù)據(jù)等建議操作模擬可控睡眠而已)
以下是默認(rèn)例程的CH58X_LowPower函數(shù)
#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晶振未穩(wěn)定
? ? ? ? {
? ? ? ? ? ? time += WAKE_UP_RTC_MAX_TIME;
? ? ? ? ? ? if(time > 0xA8C00000)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? time -= 0xA8C00000;
? ? ? ? ? ? }
? ? ? ? ? ? RTC_SetTignTime(time);
? ? ? ? ? ? //LowPower_Idle();
? ? ? ? }
? ? ? ? HSECFG_Current(HSE_RCur_100); // 降為額定電流(低功耗函數(shù)中提升了HSE偏置電流)
? ? }
? ? else
? ? {
? ? ? ? return 3;
? ? }
#endif
? ? return 0;
}