CH579/CH573支持多種功耗模式,實際上常用的無非就是RAM保持和RTC運行以及是否廣播之間的各種組合罷了
由於CH57x 只有一個RTC 且只有一個觸發值可以設置,而BLE等 做休眠時候,需要用到這個值
CH57x的BLE是通過其“tmos”操作系統實現,需要休眠時候,每次協議棧需要睡多久tmos都是知道的,比如下個event是什么時候(藍牙事件也是tmos的event)然后把要睡多久傳遞給休眠函數,休眠函數去設置一個RTC的觸發中斷,然后就進行休眠了(RTC在跑,RAM保持),直到RTC或者其他中斷喚醒MCU。休眠期間其功耗睡眠期間在2.0uA左右,
通過TMOS管理(推薦,RAM保持,rtc運行 休眠時候CH577/578/579=2uA,CH573/571=6uA,CH581/582/583=3uA )
工程的全局宏里面加上HAL_SLEEP=TRUE 即可
- BLE下休眠強烈建議使用
- RF_PHY下強烈建議使用
- 只當普通mcu,不用無線,也可以用
不通過TMOS管理(需要自己管理,不推薦,rtc喚醒可選,按鍵可喚醒,喚醒后繼續運行)
直接sleep
- 可以通過rtc/gpio 等喚醒,喚醒后芯片繼續運行
用戶無需去停掉ble的協議棧,只要關掉ble的事件就行(連接狀態就斷開連接,廣播狀態就關閉廣播);實際上這就是上面BLE在跑的休眠
也可以手動直接調用下面用休眠即可,用戶調用,而不是交由協議棧調用
LowPower_Sleep(RB_PWR_RAM2K|RB_PWR_RAM14K|RB_PWR_EXTEND );
如果用了BLE,並不推薦這樣用,比如連接期間調用這個,會導致對方設備產生超時斷開.
關機模式(喚醒會導致復位, 最低0.2uA,rtc喚醒可選,開rtc要加上rtc的功耗,按鍵可喚醒,喚醒后重啟)
直接調用下面函數,就會關掉ram 電源並休眠
這里務必注意,rtc寄存器內容shutdown后會保持的,如果這里關掉了,在代碼開始運行的時候,一定要手動再開啟,而不是用芯片的上電默認值,切記!
//以下代碼 在ch579 上運行
GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
//開啟上升沿中斷
GPIOB_ITModeCfg(GPIO_Pin_8,GPIO_ITMode_FallEdge);
//使能gpio 喚醒
PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE );
//開啟GPIO中斷
NVIC_EnableIRQ( GPIO_IRQn );
//關掉內外32768.0
R8_SAFE_ACCESS_SIG = 0x57;
R8_SAFE_ACCESS_SIG = 0xa8;
R8_CK32K_CONFIG = 0;
R8_SAFE_ACCESS_SIG = 0;
//關機,對於ch577/578/579 571/573 建議寫個標志位,在主循環 判斷標志位進行調用此函數
//ch573/571 調用此函數前,需要降頻到6.4Mhz
LowPower_Shutdown( NULL );
//這里也要加上,shutdown 是需要一定的過程的,短時間內喚醒,會接着運行,所以這里需要處理繼續運行的情況
//開啟時鍾,使用外部時鍾,這里先設置內部時鍾是必須的
SetSysClock( CLK_SOURCE_HSI_32MHz );
DelayMs(1);
SetSysClock( CLK_SOURCE_HSE_32MHz );
//打開rtc,這里使用外部32768
R8_SAFE_ACCESS_SIG = 0x57;
R8_SAFE_ACCESS_SIG = 0xa8;
R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT | RB_CLK_XT32K_PON;
R8_SAFE_ACCESS_SIG = 0;
高級使用 程序中動態屏蔽BLE的休眠:
可以在下面這個代碼中添加一個全局變量做標識,如果標識有效,直接 return 0即可,這樣就可以做到動態使能低功耗模式與否了.
static volatile bool block_sleep = false;
void ch57x_block_sleep_request(void) {
block_sleep = true;
}
void ch57x_block_sleep_release(void) {
block_sleep = false;
}
u32 CH57X_LowPower( u32 time ) {
if( true == block_sleep) {
return 0;
}
<...>
};
注意事項:
- 沁恆mcu的gpio 都沒有內部斷開模式,上電后的默認狀態是浮空輸入的,所以休眠時候所有的IO都需要有確定的電平,對於不同的封裝的芯片,引腳少的只是部分gpio沒有引出來,實際上這些沒有引出來IO也是需要初始化為確定的電平.
- 對於模擬引腳,有專門的寄存器,可以把對應IO的數字部分斷開,否者功耗可能會降不下去
- 休眠后SWD會被禁用,swd的一且操作都會失效.
- 對於ch577/ch578/ch579 在休眠模式下(2uA的那種),前面16KB的ram 會斷電,如果啟用了低功耗,休眠模式下這部分RAM會丟失數據,使用時候格外注意.