1.窗口看门狗
独立看门狗的时钟关闭不了,所以低功耗模式下需要定期唤醒喂狗,否则就会重启,比较麻烦。窗口看门狗使用的是APB1时钟,低功耗模式下时钟就停止了,所以不需要定期唤醒喂狗。但是窗口看门狗有喂狗的时间窗口,必须在这个窗口下喂狗才有效。我把窗口设置成了全部时间。
void WwdgInit()
{
// /* check if the system has resumed from WWDGT reset */
// if(RESET != rcu_flag_get(RCU_FLAG_WWDGTRST)) {
// /* clear the WWDGTRST flag */
// rcu_all_reset_flag_clear();
// while(1);
// }
/* enable WWDGT clock */
rcu_periph_clock_enable(RCU_WWDGT);
/*
* set WWDGT clock = (PCLK1 (60MHz)/4096)/8 = 1831Hz (~546 us)
* set counter value to 127
* set window value to 127
* refresh window is: ~546 * (127-127)= 0ms < refresh window < ~546 * (127-63) =34.9ms.
*/
wwdgt_config(127, 127, WWDGT_CFG_PSC_DIV8);
wwdgt_enable();
//喂狗
wwdgt_counter_update(127);
}
2.待机模式
低功耗模式我选择的是待机模式。我是用的是WKUP(PA0)唤醒方式,有两个细节需要注意。
(1)WKUP引脚的上升沿才可以唤醒设备,所以PA0需要设置成下拉输入中断状态。
(2)退出待机模式时,会发生复位,也就是单片机会重启。
void TestTask(void* parameter)
{
vTaskDelay(500);
WwdgInit(); //窗口看门狗
printf("TestTask\n");
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_PMU);
while(1)
{
vTaskDelay(20);
wwdgt_counter_update(127); //喂狗
if(usart_test ==0x01)
{
usart_test =0;
printf("go sleep\n");
pmu_wakeup_pin_enable(); //使能wkup唤醒
pmu_to_standbymode(WFI_CMD); //待机
}
}
}