原理图已上传。相关代码如下 :
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
这一段程序因为不知道协议栈中的睡眠功能如果配置,用样板程序打印HAL_SLEEP,测试无法进入睡眠模式,所以删除了。
#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); //本来想调用这个函数的,但发现会不断的重启,但调用 LowPower_Sleep(0);就正常,不知道是什么情况,方便的话也麻烦解答一下,谢谢。
}
else {
tmos_start_task(halTaskID, HAL_PM_EVENT, MS1_TO_SYSTEM_TIME(1000));
}
return events ^ HAL_PM_EVENT;
}
#endif
这一段是我自己加的控制进入睡眠模式的代码,应该与这些代码无关。
#if(defined HAL_SLEEP) && (HAL_SLEEP == TRUE)
HAL_SleepInit();
SleepTimer = 0;
tmos_start_task( halTaskID, HAL_PM_EVENT, 1000); // 添加一个监测睡眠任务
#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状态
GPIOA_ITModeCfg( GPIO_Pin_4 |GPIO_Pin_8 |GPIO_Pin_13, GPIO_ITMode_FallEdge ); // 设置下降沿唤醒
PFIC_EnableIRQ( GPIO_A_IRQn ); //开启GPIO中断 PA口
GPIOB_ModeCfg( GPIO_Pin_13, GPIO_ModeIN_PU ); //初始化IO状态
GPIOB_ITModeCfg( GPIO_Pin_13, GPIO_ITMode_FallEdge ); // 设置下降沿唤醒
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; // 触发模式
sys_safe_access_disable(); //
PFIC_EnableIRQ(RTC_IRQn);
#endif
#endif
}
客户希望进入睡眠模式后只能通过按键唤醒,所以RTC部分注释掉了。