运行模式管理
运行状态
系统的运行状态分为: 正常工作状态, 睡眠状态(STOP模式), 关机状态。
- 工作状态,系统功耗最大,屏幕正常亮,此时功耗大概在80+mA.
- 睡眠状态,屏幕熄灯,MCU进入STOP模式,MPU6050仍在记步数,此时功耗大概<1mA.
- 关机状态,TPS63020直接关闭使能,此时无3V3供电,只有Vbat供电给RTC.
状态切换逻辑
正常工作状态与睡眠状态的切换逻辑, 详见user_RunModeTask.c
,
- 首先当收到
Stop_MessageQueue
信号量时, 进入睡眠前的操作, 息屏等操作. - 再挂起其他任务挂起系统调度, 保护资源, 关闭外部看门狗, 否则进入了STOP模式没有clk喂狗会导致reset导致直接关机。然后让MCU进入STOP模式.
- 进入STOP后, 没有中断发送, 则运行停止在
HAL_PWR_EnterSTOPMode
语句后, 当中断发生后则继续向下执行代码。 - 中断发生例如RTC定时中断后(RTC中断设置详见/Core/Src/rtc.c),退出STOP模式,重新配置CLK,然后喂狗一次。再执行
xTaskResumeAll
,恢复系统调度。 - 判断唤醒条件, 中断发生后, 不一定是需要退出睡眠模式, 所以需要判断是否满足唤醒条件, 不满足则
goto sleep
跳转到睡眠初始的地方, 继续重复上诉流程。满足唤醒条件则继续向下执行。
if(osMessageQueueGet(Stop_MessageQueue,&Stopstr,NULL,0)==osOK)
{
/****************** operations before sleep ***************/
sleep:
// ...
// ...
/**********************************************************/
/********************* enter sleep mode *******************/
vTaskSuspendAll();
//Disnable Watch Dog
WDOG_Disnable();
//systick int
CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
//enter stop mode
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);
//here is the sleep period
/**********************************************************/
/********************* quit sleep mode ********************/
//resume run mode and reset the sysclk
SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk);
HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq));
SystemClock_Config();
WDOG_Feed();
xTaskResumeAll();
/**********************************************************/
/****************** your wakeup operations ****************/
// wake条件check
// 如果不满足则继续重新进入sleep, goto sleep;
// 满足唤醒条件, 例如翻腕动作或者按键动作发生, 则继续向下执行
// ...
}
/**********************************************************/