GD32E230休眠唤醒后不能再次进入休眠

 使用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);
					}
    }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值