GD32F103C8T6看门狗
GD32F10x看门狗
- 两个看门狗设备(独立看门狗IWDG和窗口看门狗WWDG)可用来检测和解决由软件错误引起的故障;
当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
一、独立看门狗IWDG
- 特性:
自由运行的递减计数器;
时钟由独立的RC振荡器提供(可在停止和待机模式下工作);
看门狗被激活后,则在计数器计数至0x000时产生复位。
二、窗口看门狗
窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
三、比较
相同点:
目标都是为了防止MCU进入死循环
代码执行超时(或者外部触发)导致没法喂狗就会产生复位
喂狗的具体时间可以设定。
不同点:
1、计数所用的时钟源不同,独立看门狗由内部40KHz低速时钟驱动,窗口看门狗使用PCLK1的时钟;
2、窗口看门狗在使用之前需要先使能时钟,而独立看门狗不需要使能时钟操作;
3、独立看门狗超时直接复位,没有中断;窗口看门狗有中断,超时可以在中断做复位前的函数操作或重新喂狗;
4、独立看门狗一般用于避免程序跑飞或死循环;窗口看门狗用于避免程序不按预定逻辑执行;
5、计数方式不同,独立看门狗是12位递减的,而窗口看门狗的寄存器低8位有效,是6位递减的;
6、超时复位时间范围不同,独立看门狗计数器值(tr)<IWDG重装载值时,进行喂狗;窗口看门狗的计数器值(tr)在0x40和窗口值(wr)之间时进行喂狗。
四、看门狗配置
独立看门狗初始化
/**
*@brief: 初始化独立看门狗
*@param reloadValue:重装载值
* prescaler: 时钟分频值
*@retval NONE
*/
void Drv_FwdgInit(uint16_t reloadValue, uint8_t prescaler)
{
// 开启时钟源(IRC40K)以供看门狗使用
rcu_osci_on(RCU_IRC40K);
while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K)); // 等待IRC40k稳定
fwdgt_write_enable();
fwdgt_config(reloadValue, prescaler);
fwdgt_write_disable();
fwdgt_enable(); // 使能看门狗
}
喂狗
void Drv_FwdgReload(void)
{
fwdgt_write_enable();
fwdgt_counter_reload();
}