【GD32H757Z海棠派开发板使用手册】第七讲 FWDG-看门狗实验

发布者:CuriousTraveler最新更新时间:2024-12-13 来源: elecfans关键字:看门狗实验 手机看文章 扫描二维码
随时随地手机看文章

7.1实验内容

通过本实验主要学习以下内容:

  • 独立看门狗的原理

  • 独立看门狗功能介绍

  • 实现独立看门狗功能

7.2实验原理

7.2.1看门狗的原理

一般来说,搭配MCU的产品都需要有长期运行的需求,特别像一些工业设备,可能要求运行个几年都不关机,但谁也不能保证在这几年里,MCU里面的代码不出任何问题,更何况自然环境中还存在很多电磁干扰、静电等,都可能会导致MCU出现运行异常的情况,比如程序卡死啦,进入错误状态啦等等,这个时候,我们就可以通过一个非常可爱的外设——看门狗,来帮助MCU从异常状态复位,让程序重新开始从头运行。

看门狗实际上是一个定时器,它的工作原理是:将看门狗定时器的计数器设定一个初始值,看门狗开始运行后,定时器中的计数值会在每一个计数器时钟来的时候减1,如果这个计数值减到0,看门狗就会内部给MCU一个复位信号使MCU复位。所以应用程序中必须每隔一段时间要对看门狗的计数值进行一次重载(看门狗计数器恢复到初始值),这样看门狗的计数器就不会减到0了,而当程序出现卡死的情况时,由于不再对看门狗计数器重载,看门狗就会让MCU复位,使MCU从卡死状态恢复出来。这种工作方式是不是就像一条狗,你要每隔一段时间去喂它,否则它就不给你“看门”了,“看门狗”的名字,就是这么来的。

GD32H757片上有两个看门狗外设——独立看门狗(FWDGT)和窗口看门狗(WWDGT),本章我们只讲独立看门狗。

7.2.2独立看门狗(FWDGT)的时钟

前面讲到,看门狗的计数值在每一个计数器时钟来的时候减1,那么这个时钟是什么呢,我们来看一下GD32H757的时钟树:

wKgZomY9eTmAfNFMAABg30nrbgg563.png?imageView2/2/w/1000

从时钟树可以看到,FWDGT的时钟来源于IRC32K,这是GD32H757的内部时钟,典型的频率值是32KHz。但要注意,这个IRC32K不是直接连到FWDGT计数器的,而是需要经过一个预分频器,这个分频器大小通过FWDGT_PSC进行设定。

预分频寄存器(FWDGT_PSC):

wKgaomY9eV-AOG5kAABcFQ1QEEw925.png?imageView2/2/w/1000wKgZomY9eWiAWv51AAFYY6ZfqBc364.png?imageView2/2/w/1000wKgaomY9eY6ASl7jAAFQREG8aQk297.png?imageView2/2/w/1000

如设定PS[2:0]为001b,那么计数器的时钟频率就为32K/8 = 4KHz,即每隔250us计数值减1。

7.2.3独立看门狗(FWDGT)的重装载

说完时钟,我们来说下FWDGT的计数器和重装载。计数器就是按照前面说的,每来一个计数器时钟,计数器减1,而计数器的初始值,来自于重装载寄存器。

重装载寄存器(FWDGT_RLD):

wKgaomY9eYaAVRGMAABaHu93Q8g730.png?imageView2/2/w/1000wKgZomY9eaCAClk4AAJfPNzGgew320.png?imageView2/2/w/1000

从“描述”中我们可以看出,向FWDGT_CTL写入0xAAAA(即喂狗,详见用户手册FWDGT_CTL寄存器),重装载寄存器中的数值就会自动加载到FWDGT的计数器中。

重装载寄存器(FWDGT_RLD)是一个12位的计数器,这就意味着重装载最大值为65535,再结合上一节的时钟分频,FWDGT设定的最大/最小超时周期见下表:

wKgZomY9ea2AWJemAACCZdb8CSA202.png?imageView2/2/w/1000wKgZomY9ebKAOeLxAABnxbQ4giQ363.png?imageView2/2/w/1000

注意: 当执行完喂狗reload操作之后,如需要立即进入deepsleep / standby模式时,必须通过软件设置,在reload命令及deepsleep / standby模式命令中间插入(3个以上)IRC32K时钟间隔,否则可能导致喂狗不成功。

7.2.4独立看门狗的使用注意事项

独立看门狗的时钟源来自于IRC32K,这个内部时钟实际上不是非常的准确,所以在设定看门狗重载值和分配器时需要留有一定的余量,防止应用程序由于IRC32K频率偏差而来不及喂狗,导致不必要的MCU复位。

7.3硬件设计

本实验我们通过海棠派开发板LED1的状态来指示MCU复位情况,用LED2来指示喂狗的情况。

7.4代码解析

在driver_wdgt.c中定义了独立看门狗的配置函数drive_fwdgt_config和喂狗函数Feed_fwdgt:

C
void drive_fwdgt_config(uint16_t reload_value, uint8_t prescaler_div)
{
/* 开启内部32K时钟 */
rcu_osci_on(RCU_IRC32K);
/* 等待时钟ready */
while(SUCCESS != rcu_osci_stab_wait(RCU_IRC32K)){
}
/*配置看门狗参数*/
fwdgt_config(reload_value,prescaler_div);
/*开启看门狗*/
fwdgt_enable();
}

void Feed_fwdgt(void)
{
/* 重装载计数器 */
fwdgt_counter_reload();
}

以下为main函数代码:

C
int main(void)
{
uint8_t i;
driver_init();//delay函数初始化
bsp_led_group_init();//LED初始化
bsp_led_on(&LED1);//点亮LED0
delay_ms(2000); //延时2s
bsp_led_off(&LED1);//熄灭LED0
drive_fwdgt_config(625,FWDGT_PSC_DIV64);//独立看门狗配置
/*闪烁LED1 5次,并每闪烁一次进行喂狗*/
for(i = 0;i<5;i++)
{
delay_ms(500);
bsp_led_toggle(&LED2);
Feed_fwdgt();
printf_log('Feed_fwdgt!/r/n')
}
while (1)
{
}
}

本例程main函数首先进行了延时函数初始化,再初始化LED0和LED1,并将LED0点亮2s钟后熄灭,然后配置独立看门狗时钟预分频为64分频,重载值为1000,即超时时间为625/(32K/64)= 1.25s,再每500ms翻转一次LED1,同时进行喂狗,最后进入while(1)循环。


7.5实验结果

海棠派开发板上电后,LED2灯亮,2s钟后熄灭,随后LED3闪烁5次,再经过一段时间后LED2灯灭,LED1复亮,周而复始。


关键字:看门狗实验 引用地址:【GD32H757Z海棠派开发板使用手册】第七讲 FWDG-看门狗实验

上一篇:【GD32F470紫藤派开发板使用手册】第十二讲 SDIO-SD卡读写实验
下一篇:【GD32H757Z海棠派开发板使用手册】第十五讲 TFT-8080电阻屏屏触摸实验

推荐阅读最新更新时间:2026-03-20 20:12

GD32H757Z海棠开发板使用手册】第三讲 EXTI-按键中断检测实验
3.1实验内容 通过本实验主要学习以下内容: EXTI中断原理; 按键中断检测原理; 3.2实验原理 3.2.1NVIC中断向量控制器 介绍EXTI之前,首先为各位读者介绍NVIC中断向量控制器,NVIC为M7内核组件,用于实现高效的异常和中断处理。NVIC可以支持抢占以及咬尾中断,具有多达217种外设中断以及4位中断优先等级配置(最多支持16个中断有限等级),当中断或异常产生时,系统自动将当前处理器工作状态压栈,在执行完中断服务子程序(ISR) 后自动将其出栈。 有关NVIC中断相关配置函数可参考gd32h7xx_misc.c,其中主要有以下几个函数,其功能简介如下表所示。 3.2.2EXTI中断原理 EXTI为外部中
[单片机]
【<font color='red'>GD32H757Z</font><font color='red'>海棠</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第三讲 EXTI-按键中断检测<font color='red'>实验</font>
【GD32 MCU 入门教程】GD32 MCU 常见外设介绍(9)FWDG 模块介绍
9.1.FWDG 简介 本章我们主要分析独立看门狗(FWDG)的功能框图和它的应用。独立看门狗用通俗一点的话来解释就是一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即FWDGTRSTF。如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。独立看门狗定时器有独立的时钟源(IRC40K) 。 即使主时钟失效, FWDGT依然 能保持正常工作状态, 适用于需要独立环境且对计时精度要求不高的场合。 9.2.GD32 FWDG 外设原理简介 因篇幅有限,本文无法详细介绍GD32所有系列F
[单片机]
【GD32 MCU 入门教程】GD32 MCU 常见外设介绍(9)<font color='red'>FWDG</font> 模块介绍
STM32入门学习笔记之看门狗实验(下)
14.4.2 窗口看门狗实验 功能:程序一运行使得接在PB5上的LED1亮300ms后关闭,进入死循环。等待WWDG中断的到来,在中断里面,喂狗,并对PE5上的LED2进行翻转操作。可以看到LED2不停的闪烁,LED1只在刚启动的时候闪一下。 (1)在上一个实验的wdg.h文件的函数列表区域添加以下代码。 void WWDG_Init( u8 tr, u8 wr, u8 fprer ) ; //窗口看门狗初始化 (2)在上一个实验的wdg.c文件末尾添加以下代码。 /*************************************************** Name :WWDG_IRQHandler
[单片机]
STM32独立看门狗介绍_STM32单片机独立看门狗实验
  STM32独立看门狗简介   单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)。   STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的40Khz,而是在30~60Khz之间的一个可变化的时钟,只是我们在估算的时候,以40Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。   涉及的寄存器有:键寄存器
[单片机]
STM32学习日志——窗口看门狗实验
程序的调试有时候很令人头痛,但找出原因并解决的一刻是真的爽。 下午继续STM32的学习,接下来是窗口看门狗实验,之所以叫做窗口,是因为它的喂狗时间有一个上下限范围,可以通过寄存器去配置。而它的下限是固定的,为0x3F(0x001111111),上限通过寄存器WWDG_CFR配置,如果在上限之前喂狗则会复位,到达下限后系统也会自动复位。 从看门狗框图中可以看出,复位的与门输出要为1,则两个输入必须都为1,说明WDGA启动位必须置1,或门的输出也要为1这两个条件必须满足。而要想或门的输出为1,有两个条件之一满足即可,1)T6为0,即0x40减至0x3F的一瞬间触发复位。2)比较器的输出为1,即T6:0 W6:0,也就是计数器的当
[单片机]
窗口看门狗实验——WWDG
概述: 什么是窗口看门狗? 之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。 而独立看门狗限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。 为什么要窗口看门狗? 对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了; 如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按
[单片机]
窗口<font color='red'>看门狗</font><font color='red'>实验</font>——WWDG
STM32之独立看门狗实验
实验现象: 开始LED1亮,LED2熄灭,若不隔时间按KEY1则发现LED2因独立看门狗的作用使系统复位而不断闪烁,若间断的按KEY1则发现LED2不会闪烁,表明没有复位。 实验平台: 基于STM32F103C8T6的彩屏开发板 操作步骤: 1)向IWDG_KR 写入0X5555。 通过这步,我们取消IWDG_PR 和IWDG_RLR 的写保护,使后面可以操作这两个寄存器。 设置 IWDG_PR 和IWDG_RLR 的值。 这两步设置看门狗的分频系数,和重装载的值。由此,就可以知道看门狗的喂狗时间(也 就是看门狗溢出时间),该时间的计算方式为: Tout=((4×2^prer) ×rlr) /40 其中Tout 为看门狗溢
[单片机]
stm32正点原子学习笔记(29)独立看门狗实验
iwdg.c 1 #include iwdg.h 2 3 void iwdg_init(uint8_t IWDG_Prescaler,uint16_t Reload) 4 { 5 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 6 IWDG_SetPrescaler(IWDG_Prescaler); 7 IWDG_SetReload(Reload); 8 IWDG_ReloadCounter(); 9 IWDG_Enable(); 10 11 } iwdg.h 1 #ifndef __IWDG_H 2
[单片机]
stm32正点原子学习笔记(29)独立<font color='red'>看门狗</font><font color='red'>实验</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved