我這邊嘗試在使用LSI的情況下運行低功耗,但似乎進入睡眠后沒法被RTC喚醒,不知道是不是哪里需要改正?
我在數(shù)據(jù)手冊中看到了CK32K這一低功耗配置項目,但是沒有找到對應的寄存器,不知道是不是這個配置出現(xiàn)了問題?
然后就是 RB_PWR_LDO_EN 這個定義,在SDK里面也被注釋掉了,請問是否是需要手動開啟這一個呢?
我這邊嘗試在使用LSI的情況下運行低功耗,但似乎進入睡眠后沒法被RTC喚醒,不知道是不是哪里需要改正?
我在數(shù)據(jù)手冊中看到了CK32K這一低功耗配置項目,但是沒有找到對應的寄存器,不知道是不是這個配置出現(xiàn)了問題?
然后就是 RB_PWR_LDO_EN 這個定義,在SDK里面也被注釋掉了,請問是否是需要手動開啟這一個呢?
盡量提供能復現(xiàn)問題的 工程,
官方的藍牙工程都有用到RTC,在使能宏: HAL_SLEEP=TRUE? 后, 都會用到rtc的觸發(fā)喚醒.
可以參考ble的工程看看.
睡眠模式,RTC喚醒,在BLE例子都有使用,參考MCU.C例子。
/** ?*?@brief?初始化藍牙協(xié)議棧 ?*? ?*/ static?void?BLE_Init(void) { ????bleConfig_t?cfg?=?{ ????????.MEMAddr?=?(uint32_t)BLE_Stack_Heap, ????????.MEMLen?=?BLE_MEMHEAP_SIZE, ????????.SNVAddr?=?BLE_SNV_ADDR, ????????.SNVBlock?=?0,?//?Default:?512 ????????.SNVNum?=?0,?//?Default:?1 ????????.BufMaxLen?=?BLE_BUFF_MAX_LEN, ????????.BufNumber?=?BLE_BUFF_NUM, ????????.TxNumEvent?=?BLE_TX_NUM_EVENT, ????????.TxPower?=?BLE_TX_POWER, ????????.RxNumEvent?=?0,?//?Default:?same?as?BufNumber ????????.readFlashCB?=?Lib_Read_Flash, ????????.writeFlashCB?=?Lib_Write_Flash, #if?(CLK_OSC32K) ????????.SelRTCClock?=?(uint32_t)CLK_OSC32K, #else ????????.SelRTCClock?=?0,?//?Use?LSE,?BLE?use?RTC?Timer #endif ????????.ConnectNumber?=?(PERIPHERAL_MAX_CONNECTION?&?3)?|?(CENTRAL_MAX_CONNECTION?<<?2), ????????.WindowWidening?=?0,?//?Default ????????.WaitWindow?=?0,?//?Default ????????.srandCB?=?SYS_GetSysTickCnt,?//?HAL提供的函數(shù) ????????.tsCB?=?HAL_GetInterTempValue,?//?根據(jù)溫度變化校準RF和內(nèi)部RC(?大于7攝氏度?) #if?(CLK_OSC32K) ????????.rcCB?=?Lib_Calibration_LSI,?//?HAL提供的函數(shù) #else ????????.rcCB?=?NULL,?//?使用外部時鐘,不需要校準 #endif ????????.staCB?=?NULL,?//?無狀態(tài)Callback #if?(defined(HAL_SLEEP))?&&?(HAL_SLEEP?==?TRUE) ????????.WakeUpTime?=?WAKE_UP_RTC_MAX_TIME, ????????.sleepCB?=?CH57X_LowPower,?//?啟用睡眠,HAL提供的函數(shù) #else ????????.WakeUpTime?=?0, ????????.sleepCB?=?NULL, #endif ????}; ????if?(tmos_memcmp(VER_LIB,?VER_FILE,?strlen(VER_FILE))?==?FALSE)?{ ????????PRINT("BLE?Library?version?is?not?compatable.?Require?%s,?but?%s.\r\n",?VER_FILE,?VER_LIB); ????????while?(1) ????????????; ????} ????SysTick_Config(SysTick_LOAD_RELOAD_Msk); ????PFIC_DisableIRQ(SysTick_IRQn); ????//?填充芯片的MacAddr ????uint8_t?MacAddr[6]; ????GetMACAddress(MacAddr); ????for?(uint8_t?i?=?0;?i?<?6;?i++) ????????cfg.MacAddr[i]?=?MacAddr[i];?//?使用芯片mac地址 ????//?Sanity?Check ????if?(!cfg.MEMAddr?||?cfg.MEMLen?<?4?*?1024) ????????while?(1) ????????????; ????FLASH_ROM_LOCK(0); ????uint8_t?ret?=?BLE_LibInit(&cfg); ????if?(ret)?{ ????????PRINT("LIB?init?error.?Code:?%x?...\r\n",?ret); ????????while?(1) ????????????; ????} } /** ?*?@brief?主函數(shù) ?*? ?*?@return?int? ?*/ int?main(void) { ????PWR_DCDCCfg(ENABLE); ????SetSysClock(CLK_SOURCE_PLL_32MHz); #ifdef?DEBUG ????GPIOA_SetBits(bTXD1); ????GPIOA_ModeCfg(bTXD1,?GPIO_ModeOut_PP_5mA); ????UART1_DefInit(); ????uint8_t?str[]?=?"Hello?world.\r\n"; ????UART1_SendString(str,?sizeof(str)); #endif ????PRINT("Build?on?%s?%s\r\n",?__DATE__,?__TIME__); ????PRINT("%s\r\n",?VER_LIB); ????BLE_Init(); ????HAL_Init();?//?HAL提供的函數(shù) ????//?... ????Main_Circulation(); }
部分初始化代碼見上方,如果需要完整工程的話我這邊也可以提供。
我這邊觀察到的問題是,如果設置了CLK_OSC32K=1或2的話,就會出現(xiàn)睡眠下去后沒辦法自動喚醒;而如果保持CLK_OSC32K=0,那么在睡眠喚醒幾次后也會無法自動喚醒。
請右擊工程,修改內(nèi)置低頻32K晶振,參考下圖。
你好,我就是這么修改的,也是不行。
在CH573的EVT內(nèi)的BLE文件內(nèi)的工程Peripheral,如果開啟內(nèi)置晶振,即在工程中定義宏CLK_OSC32K=2
同時工程中定義宏HAL_SLEEP=TRUE,開啟休眠模式,則BLE喚醒通過RTC喚醒的。
你可以研究一下此工程,然后再修改自己的工程。
如果后續(xù)還有問題,可以提供工程,并告知基于哪個工程修改,修改點列出來。
并告知具體自己的需求點。這樣芯片原廠會告知此芯片最優(yōu)實現(xiàn)辦法。
OK,我這邊現(xiàn)在定位問題到了USB上,好像是啟用了USB之后就出現(xiàn)了這種問題,我把USB相關的代碼注釋掉后就沒有這種問題了。請問一下USB和睡眠是否有沖突需要手動處理呢?
是的,BLE的休眠喚醒源是RTC,在休眠過程中,USB無法運行。
你可以給我私發(fā)一下郵箱,給你一個BLE和USB共同運行的例程。
你好,郵箱已經(jīng)私發(fā)了。也就是說,開著USB的情況下是沒辦法進入低功耗模式的對嗎?
-------
更新:是我USB中斷處理的問題。我在USB BUS Reset的時候添加了PRINT打印事件。我關掉這個之后就能正常喚醒了。多謝上面的幾位技術人員幫我一起找BUG
@zpf_wch 你好,你們的USB和藍牙同時工作的案例是沒有低功耗管理的,請問有帶低功耗管理的例子嗎?
用USB功能是沒法低功耗的,開了低功耗USB這邊就沒法工作了。
那么,有什么辦法能在低功耗的時候檢測USB插入然后退出低功耗模式嗎?
用USB功能是沒法低功耗的,開了低功耗USB這邊就沒法工作了。
--------------------------------------------------
實際產(chǎn)品里同時用到USB和BLE,還得需要低功耗怎么辦?
使用場景是:USB接入的時候不需要低功耗,但是USB斷開,BLE工作的時候需要低功耗模式,那么當USB再次接入的時候,
如果判斷USB插入了呢?需要在判斷出USB插入后,退出低功耗模式,同時還要保證BLE工作在低功耗模式下,當USB插入時可以正常枚舉、識別。
我的使用是:當USB斷開的時候,進入到低功耗,USB如果連接的話不進低功耗的。
但是現(xiàn)在遇到一個問題,我把HAL_SLEEP宏打開之后,USB斷開之后,沒有suspend中斷產(chǎn)生,這樣就沒法判斷出usb斷了這個動作,請問是什么原因? 我測試發(fā)現(xiàn),如果HAL_SLEEP宏不打開,USB斷開之后,有suspend中斷產(chǎn)生,我是能判斷出斷開這種狀態(tài)的。
suspend 中斷來判斷USB連接和移除是不夠的,在枚舉過程中都會多次參數(shù)suspend,甚至電腦休眠,也會產(chǎn)生suspend。
除了判斷suspend外,判斷USB是否在正常工作,可以根據(jù)設備是否有規(guī)律的周期通訊。
開啟HAL_SLEEP ,實際要休眠的時候會進sleep睡眠函數(shù),如果不需要休眠,加上判斷條件。直接退出,不執(zhí)行休眠即可。如果需要休眠,就可以正常執(zhí)行休眠。