原理圖已上傳。相關(guān)代碼如下 :
int main(void)
{
#if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)
? ? PWR_DCDCCfg(ENABLE);
#endif
? ? SetSysClock(CLK_SOURCE_PLL_60MHz);
#if (defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
? ? GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
? ? GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
#endif
……
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
//? cfg.WakeUpTime = WAKE_UP_RTC_MAX_TIME;
//? cfg.sleepCB = CH58X_LowPower; // 啟用睡眠
#endif????????????
這一段程序因?yàn)椴恢绤f(xié)議棧中的睡眠功能如果配置,用樣板程序打印HAL_SLEEP,測(cè)試無(wú)法進(jìn)入睡眠模式,所以刪除了。
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
? ? if(events & HAL_PM_EVENT)
? ? {
? ? ? uint32_t sleep_time_cnt;
? ? ? if (BLEConnected == BLE_PAIRING)
? ? ? ? sleep_time_cnt = PAIRSLEEP_TIME_CNT;
? ? ? else {
? ? ? ? sleep_time_cnt = SLEEP_TIME_CNT;
? ? ? }
//? ? ? ? PRINT("* \n");
//? ? ? if (BLEConnected != BLE_CONNECTING)
? ? ? SleepTimer ++;
? ? ? if (SleepTimer >= sleep_time_cnt)
? ? ? {
? ? ? ? LowPower_Sleep(0);
//? ? ? ? LowPower_Shutdown(0);? ?//本來(lái)想調(diào)用這個(gè)函數(shù)的,但發(fā)現(xiàn)會(huì)不斷的重啟,但調(diào)用?LowPower_Sleep(0);就正常,不知道是什么情況,方便的話也麻煩解答一下,謝謝。
? ? ? }
? ? ? else {
? ? ? ? tmos_start_task(halTaskID, HAL_PM_EVENT, MS1_TO_SYSTEM_TIME(1000));
? ? ? }
? ? ? return events ^ HAL_PM_EVENT;
? ? }
#endif
這一段是我自己加的控制進(jìn)入睡眠模式的代碼,應(yīng)該與這些代碼無(wú)關(guān)。
#if(defined HAL_SLEEP) && (HAL_SLEEP == TRUE)
? ? HAL_SleepInit();
? ? SleepTimer = 0;
? ? tmos_start_task( halTaskID, HAL_PM_EVENT, 1000);? ? // 添加一個(gè)監(jiān)測(cè)睡眠任務(wù)
#endif
void HAL_SleepInit(void)
{
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
? GPIOA_ModeCfg( GPIO_Pin_4 |GPIO_Pin_8 |GPIO_Pin_13, GPIO_ModeIN_PU );? ? ? ? ? ? ? ? //初始化IO狀態(tài)
? GPIOA_ITModeCfg( GPIO_Pin_4 |GPIO_Pin_8 |GPIO_Pin_13, GPIO_ITMode_FallEdge );? ? ? ? // 設(shè)置下降沿喚醒
? PFIC_EnableIRQ( GPIO_A_IRQn );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //開啟GPIO中斷 PA口
? GPIOB_ModeCfg( GPIO_Pin_13, GPIO_ModeIN_PU );? ? ? ? ? ? ? ? //初始化IO狀態(tài)
? GPIOB_ITModeCfg( GPIO_Pin_13, GPIO_ITMode_FallEdge );? ? ? ? // 設(shè)置下降沿喚醒
? PFIC_EnableIRQ( GPIO_B_IRQn );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //開啟GPIO中斷 PA口
? PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE, Long_Delay );//開啟GPIO喚醒使能
#if 0
? ? sys_safe_access_enable();
? ? R8_SLP_WAKE_CTRL |= RB_SLP_RTC_WAKE; // RTC喚醒
? ? sys_safe_access_enable();
? ? R8_RTC_MODE_CTRL |= RB_RTC_TRIG_EN;? // 觸發(fā)模式
? ? sys_safe_access_disable();? ? ? ? ? ? ? //
? ? PFIC_EnableIRQ(RTC_IRQn);
#endif
#endif
}
客戶希望進(jìn)入睡眠模式后只能通過(guò)按鍵喚醒,所以RTC部分注釋掉了。