1、简介
看门狗定时器(WDGT)是一个硬件计时顶啊路,用于检测由软件故障导致的系统故障。其片上有两个看门狗定时器外设,分别是独立看门狗定时器(FWDGT)和窗口看门狗定时器(WWDGT),看门狗定时器再内部计时器达到了预设的门限的时候,会触发一个复位,调试模式的时候可以停止计时。
独立看门狗,有独立的时钟源(IRC40K),即使主时钟失效,FWDGT仍然可以正常工作,一般适用于独立环境且对于计时精度要求不高的场合。当内部向下的计时值达到0后,看门狗会产生一个系统复位,可以使能独立看门狗的寄存器写保护功能避免寄存器的值被意外的配置篡改。
窗口看门狗,其定时器开启后,7位向下递减计数器值不断减小,再计数值达到0x3F时会产生系统复位(CNT(6)位的被清零)。在计数器计数值达到窗口寄存器值之前,计数器的更新也会产生系统复位,因此需要在给定的区间内更新计数器。如果使能窗口看门狗的提前唤醒中断标志,会在计数器的值达到0x40时,产生一个提前唤醒标志中断。
2、独立看门狗(FWDGT)
2.1 主要特性
1. 自由运行的12向下计数器
2. 使能看门狗定时器后,会在向下计数器的值达到0时产生系统复位
3. 拥有独立时钟源,独立看门狗可以在主时钟故障的情况(如待机和深度睡眠模式)下正常工作。
4. 独立看门狗有硬件控制位,可以控制是否在上电时自动运行独立看门狗定时器。
5. 可以配置独立看门狗定时器在调试模式下是否工作
2.2 功能
独立看门狗定时器带有8级预分频器和12位向下递减计数器,这是独立看门狗定时器框图:
在其中的控制寄存器(FWDGT_CT)当中写入0xCCCC可以开启独立看门狗定时器,计数器开始向下计数,计数器的值为0的时候系统复位。
可以在任何时候向FWDGT_CT中写0xAAAA都可以重装载计数器,重装载值来源于重装载寄存器(FWDGT_RLD),在计数器计数值达到0之前,可以通过向重装载计数器写入0x0000来阻止看门狗定时器产生系统复位。
可以在选项字节中选择“硬件看门狗定时器”功能,那么在上电的时候看门狗定时器就会被自动打开。
写数据到FWDGT_PSC和FWDGT_RLD中前,需要先写0x5555到FWDGT_CTL中关闭写保护,之后才可以进行写数据,写其他任何值到FWDGT_CTL中将会再次启动对这些寄存器的写保护。
如果DBG控制寄存器0(DBG_CTL0)中的FWDGT_HOLD位被清0,那么在调试模式下独立看门狗定时器依然工作。如果FWDGT_HOLD位置1,独立看门狗定时 器将在调试模式下停止工作。
2.3 代码验证
wdgt.h
#define _WDGT_H
void FWDGT_Init(void);
void FWDGT_Reload(void);
wdgt.c
#include "wdgt.h"
#include "uart.h"
#include "systick.h"
#include "gd32f30x.h"
void FWDGT_Init(void)
{
rcu_osci_on(RCU_IRC40K);
while(SUCCESS!=rcu_osci_stab_wait(RCU_IRC40K));
fwdgt_write_enable();
fwdgt_config(1000,FWDGT_PSC_DIV64);
fwdgt_write_disable();
fwdgt_enable();
}
/* 看门狗喂狗函数 */
void FWDGT_Reload(void)
{
fwdgt_write_enable();
/* 喂狗 */
fwdgt_counter_reload();
u1_printf("我复位了");
}
其中的uart.h和uart.h在DMA双向通信文章中有
main.c
#include 'gd32f30x.h'
#include 'uart.h'
#include 'wdgt.h'
int main(){
int i=1;
systick_config(); //初始化时钟
uart0_init(115200); //初始化串口
u1_printf("我运行第 %d 次\r\n",i); //DMA打印,在uart.c中定义的
i++;
FWDGT_Init();
while(1){
// FWDGT_Reload();
}
}
可以取消while循环当中喂狗的注释,观察函数的运行结果,更好的理解独立看门狗
3、窗口看门狗(WWDGT)
3.1 主要特征
1. 可编程的7位自由运行向下递减计数器;
2. 有两种情况下看门狗会复位:当计数器达到0x3F时产生复位;当计数器的值大于窗口寄存器的值时,更新计数器会产生复位。
3. 提前唤醒中断(EMI):看门狗定时器打开,中断使能,计数值达到0x40会产生中断;
4. 可以配置窗口看门狗定时器在调试模式下选择停止还是继续工作。
3.2 功能
如果窗口看门狗定时器使能(将WWDGT_CTL寄存器的WDGTEN位置1),计数值达到0x3F 的时候产生系统复位(CNT[6]位被清0)或是在计数值达到窗口寄存器值之前,更新计数器也 会产生复位
3.3 代码验证
wwdgt.h
#define _WWDGT_H
void WWDGT_Init(void);
wwdgt.c
#include 'wwdgt.h'
#include 'gd32f30x.h'
#include 'systick.h'
/* 初始化窗口看门狗 */
void WWDGT_Init(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
rcu_clock_freq_get(CK_APB1);
rcu_periph_clock_enable(RCU_WWDGT);
wwdgt_deinit();
wwdgt_config(0x7F,0x50,WWDGT_CFG_PSC_DIV4);
wwdgt_enable();
}
main.c
#include 'gd32f30x.h'
#include 'systick.h'
#include 'wwdgt.h'
int main(){
int i=1;
systick_config();
uart0_init(115200);
u1_printf("我运行第 %d 次\r\n",i);
i++;
WWDGT_Init();
while(1)
{
// i++;
delay_1ms(13);
wwdgt_counter_update(0x7F);
// u1_printf("data = %d\r\n",i);
}
}
可以修改while循环中delay的时间,观察运行结果,更好的理解窗口看门狗。