CH573使用內(nèi)置RC振蕩器的低功耗問題

我這邊嘗試在使用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例子。

image.png


/**
?*?@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晶振,參考下圖。

image.png


你好,我就是這么修改的,也是不行。


在CH573的EVT內(nèi)的BLE文件內(nèi)的工程Peripheral,如果開啟內(nèi)置晶振,即在工程中定義宏CLK_OSC32K=2

同時工程中定義宏HAL_SLEEP=TRUE,開啟休眠模式,則BLE喚醒通過RTC喚醒的。

你可以研究一下此工程,然后再修改自己的工程。

image.png


如果后續(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í)行休眠。


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频