GD32F303窗口看门狗在待机模式下运行

1.窗口看门狗

GD32F303窗口看门狗在待机模式下运行_第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.待机模式

GD32F303窗口看门狗在待机模式下运行_第2张图片

低功耗模式我选择的是待机模式。我是用的是WKUP(PA0)唤醒方式,有两个细节需要注意。

(1)WKUP引脚的上升沿才可以唤醒设备,所以PA0需要设置成下拉输入中断状态。

GD32F303窗口看门狗在待机模式下运行_第3张图片

(2)退出待机模式时,会发生复位,也就是单片机会重启。

GD32F303窗口看门狗在待机模式下运行_第4张图片

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);                    //待机
        }
    }
}

你可能感兴趣的:(单片机,单片机,KEIL,嵌入式硬件)