1、FWDGT是GD32内部的独立看门狗外设,实际上也是递减定时器的一种,不同的地方是看门狗定时器是一旦开启就无法关闭,并且使用的是独立IRC时钟,即便系统完全卡死也不会影响FWDGT的正常工作,而且必须在定时器递减到一定数值前重新赋值定时器,否则就会使系统发生软件重启行为
以下说明GD32F470ZGT6外设FWDGT的使用
FWDGT配置,使用内部FWDGT_PSC_DIV64
//配置FWDGT fwdgt_config(2 * 500, FWDGT_PSC_DIV64); fwdgt_enable();
完整代码
#include "main.h" #include <stdio.h> #include "gd32f4xx.h" #include "systick.h" #include "bsp_uart.h" int main(void) { systick_config(); bsp_uart_init(); if(RESET != rcu_flag_get(RCU_FLAG_FWDGTRST)){ printf("Reset By FWDGT\n"); rcu_all_reset_flag_clear(); } //配置FWDGT //IRC40K) / 64 = 0.625 KHz,定时 (1/0.625K)*1000=1.6s fwdgt_config(2 * 500, FWDGT_PSC_DIV64);//IRC定时效果不精准 fwdgt_enable(); while(1) { delay_1ms(1400); printf("FWDGT1.\n"); delay_1ms(500); printf("FWDGT2.\n"); } }
2、实验结果
测试结果说明:
为什么printf("FWDGT2.\n")没有得到执行呢?是因为看门狗定时器的定时时间是1.6S,超过这个时间系统就会重启
屏蔽第二个延时函数
int main(void) { systick_config(); bsp_uart_init(); if(RESET != rcu_flag_get(RCU_FLAG_FWDGTRST)){ printf("Reset By FWDGT\n"); rcu_all_reset_flag_clear(); } //配置FWDGT //IRC40K) / 64 = 0.625 KHz,定时 (1/0.625K)*1000=1.6s fwdgt_config(2 * 500, FWDGT_PSC_DIV64);//IRC定时效果不精准 fwdgt_enable(); while(1) { delay_1ms(1400); printf("FWDGT1.\n"); //delay_1ms(500); printf("FWDGT2.\n"); } }
系统超时1.6s仍会触发重启,printf("FWDGT2.\n")在看门狗超时触发前得到了执行