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.待机模式

低功耗模式我选择的是待机模式。我是用的是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);                    //待机
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值