CH579/CH573/CH57x低功耗處理


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會丟失數據,使用時候格外注意.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM