做网站最简单,娄底网站优化,徐州企业网站模板建站,竞价托管公司1. 简介
看门狗从本质上来说也是一个定时器#xff0c;它是用来监测硬件或软件的故障的#xff1b;它的工作原理大概就是开启后内部定时器会按照设置的频率更新#xff0c;在程序运行过程中我们需不断地重装载看门狗#xff0c;以使它不溢出#xff1b;如果硬件或软件发生…1. 简介
看门狗从本质上来说也是一个定时器它是用来监测硬件或软件的故障的它的工作原理大概就是开启后内部定时器会按照设置的频率更新在程序运行过程中我们需不断地重装载看门狗以使它不溢出如果硬件或软件发生故障没有及时重装载看门狗就会引发中断或复位。
在GD32中看门狗分为独立看门狗FWDGT和窗口看门狗WWDGT。
2. 独立看门狗 独立看门狗使用独立的内部时钟频率为32kHz因此即使在低功耗模式中它也是能够运行的适用于需要独立环境且对计时精度要求不高的场合。它的内部有一个12位的向下计数的定时器运行时当计时器的计数值达到0独立看门狗会产生一个系统复位。
看门狗的内部还自带一个预分频器可以对内部时钟再分频下面列出了不同的分频系数对应的最小和最大超时时间。
预分频系数最小超时ms最大超时ms1/40.03125511.906251/81023.78121/162047.531251/324095.031251/648190.031251/12816380.031251/25632760.03125
使用独立看门狗时要注意当执行完喂狗reload操作之后如需要立即进入deepsleep / standby模式时必须通过软件设置在reload命令及deepsleep / standby模式命令中间插入3个以上IRC32K时钟间隔。
3. 窗口看门狗 窗口看门狗使用PCLK分频而来的时钟它内部是一个7位的向下计数的计数器同样运行时计数器的值变为0时会引发中断或系统复位。
若配置为中断使能那么计数器的值达到0x40时会触发中断若想产生复位有以下几种方式一种是在计数值达到窗口寄存器值之前更新计数器另一种是将WWDGT_CTL寄存器的WDGTEN位置1计数器的值达到0x3F时。 窗口看门狗的超时时间可以使用下面的公式计算 这里也提供一个表格列出不同分频系数下的最小和最大超时时间。
预分频系数 最小超时时间us CNT[6:0]0x40 最大超时时间ms CNT[6:0]0x7F 1/168.274.371/2136.548.741/4273.0817.481/8546.1634.96
4. 例程
4.1 独立看门狗
例程中会配置独立看门狗运行在程序中定期对其正常重装载5次然后不操作等待看门狗溢出引起系统复位。
int main(void)
{systick_config();debug_init();printf(fwdgt demo\r\n);/* 看门狗超时时间 1 / (32kHz / 32) * 3000 3s */fwdgt_config(3000, FWDGT_PSC_DIV32);fwdgt_enable();if (RESET ! rcu_flag_get(RCU_FLAG_FWDGTRST)) {/* clear the FWDGT reset flag */rcu_all_reset_flag_clear();}for (uint8_t i 0; i 5; i) {delay_1ms(1000);printf(reload fwdgt\r\n);fwdgt_counter_reload();}while (1) {}
}初始化非常简单调用fwdgt_config函数传入重装载值和分频系数即可我设置的是32分频重装载值3000那么超时时间就是大约3秒。最后调用fwdgt_enable即可开启看门狗那么需要注意的是看门狗一旦开启就关闭不了了除非系统复位。
下面的循环会每隔1秒重装载看门狗一次5次过后就不再操作。
从程序的输出可以看到看门狗的确发生了溢出并导致了系统复位。 4.2 窗口看门狗
这个例程配置窗口看门狗并使能同样定期重装载5次然后不操作使看门狗产生系统复位。
int main(void)
{systick_config();debug_init();printf(wwdgt demo\r\n);/* 检查系统是否由WWDGT复位中唤醒 */if(RESET ! rcu_flag_get(RCU_FLAG_WWDGTRST)) {/* 清除复位标志 */rcu_all_reset_flag_clear();}/* 使能WWDGT时钟 */rcu_periph_clock_enable(RCU_WWDGT);/* 看门狗超时时间 1 / (60MHz / 4096 / 8) * (127 - 63) 34.96ms *//* 窗口范围 26.22ms-34.96ms */wwdgt_config(127, 79, WWDGT_CFG_PSC_DIV8);wwdgt_enable();for (uint8_t i 0; i 5; i) {delay_1ms(28); // 在窗口范围更新才不会复位printf(reload wwdgt\r\n);wwdgt_counter_update(127);}while (1) {}
}因为窗口看门狗使用PCLK时钟所以使用前需要使能时钟。
接下来初始化调用wwdgt_config即可传入重装载值、窗口值和预分频系数因为时钟频率较高、计数器位数小还有它基于窗口的这个特性可以发现窗口看门狗对重装载的时间要求还是蛮高的用户必须在窗口范围内重装载才不会引发系统复位。初始化后调用wwdgt_enable可使能窗口看门狗。
下面还是一样重装载5次之后等待系统复位。