使用GD32E230C8T6测试休眠功能,发现第一次进入休眠正常,在次进入休眠就会失败,测试代码如下:
int main(void)
{
/* nvic configuration */
nvic_configuration();
/* LED configuration */
led_config();
/* systick configuration */
systick_config();
gd_eval_led_on(LED4);
delay_1ms(2000U);
gd_eval_led_off(LED4);
/* RTC configuration */
rtc_configuration();
/* FWDGT configuration */
fwdgt_configuration();
while(1){
/* PMU enters deepsleep mode */
if(rtc_wake_up_flag)
{
rtc_wake_up_flag = 0;
gd_eval_led_toggle(LED2);
pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD);
}
}
}
通过RTC定时进入休眠
void RTC_IRQHandler(void)
{
if(RESET != rtc_flag_get(RTC_FLAG_ALARM0)){
/* clear the RTC alarm and EXTI_17 interrupt flags */
rtc_flag_clear(RTC_FLAG_ALARM0);
exti_flag_clear(EXTI_17);
/* configure RTC alarm time */
rtc_alarm_time_configuration();
/* feed dog */
fwdgt_counter_reload();
rtc_wake_up_flag = 1;
}
}
调试发现就第一次正常进入,后面LED2就不会闪烁了,而且会触发重启。
然后翻看用户手册发现,因为使用了独立看门狗,在喂狗后,需要增加3个以上时钟周期延时,不然会导致喂狗失败,引发复位。
按手册介绍,增加延时后测试正常,代码如下:
while(1){
/* PMU enters deepsleep mode */
if(rtc_wake_up_flag)
{
rtc_wake_up_flag = 0;
gd_eval_led_toggle(LED2);
delay_1ms(1);// -----进入休眠前增加一点延时-----//
pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD);
}
}