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、实验结果
![1737301147657842.png }5OE]52$SL4ZF1%Z90}U8R7.png](http://uphotos.eepw.com.cn/1709346044/pics/1737301147657842.png)
测试结果说明:
为什么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");
}
}![1737301610905535.png 29OAQ])RJTNRVHN]2_}V{HD.png](http://uphotos.eepw.com.cn/1709346044/pics/1737301610905535.png)
系统超时1.6s仍会触发重启,printf("FWDGT2.\n")在看门狗超时触发前得到了执行
我要赚赏金
