独立看门狗配置及计算详解

一、独立看门狗用途

独立看门狗通常用于防止软件意外卡死,在软件故障之后能够重启程序;

二、独立看门狗时钟源

独立看门狗使用的是专用的低速时钟,以GD32为例,其独立看门狗使用的是IRC40K时钟,以STM32为例,其独立看门狗使用的是LSI(40KHz);

三、独立看门狗寄存器分析

看门狗可以理解为是一个定时器,知道其时钟源,再根据想要的触发周期,计算出分频系数和重装载值就可以了。与定时器不同的是独立看门狗是独立于主程序运行的,即使在系统时钟异常,程序无法运行的情况下,独立看门狗仍然能够完全独立工作;
以STM32F10x系列为例:
在这里插入图片描述
3.1 预分频寄存器(IWDG_PR):
该寄存器用于存储独立看门狗时钟的分频系数,如期望对独立看门狗时钟40KHz进行64分频,则该寄存器应写入4,有人可能要问了,为啥不写入64呢?no,dear,不是这样的。这里我们就要看寄存器的描述:
在这里插入图片描述
在上图中可以看出,32位寄存器IWDG_PR中,只有低3位是可以读写的,由框中的对应关系可知,分频系数为64时,其实际写入寄存器的值为0x04,其余分频系数以此类推;

3.2 重装载寄存器(IWDG_RLR)
该寄存器用于存储递减计数器的重装载值,顾名思义,“重装载值”意思就是预先设置一个值,计数启动后,递减计数器从该值开始递减,当递减至0的时候就将该值赋给递减计数器,继续开始下一轮递减,周而复始,直至计时结束;
在这里插入图片描述

如期望计数器计数达到500,则该寄存器应写入0x1F4。有同学可能要问了,如果我要计数达到5000呢?那我告诉你,是不行的。我们仍然来看该寄存器的描述:

在这里插入图片描述
由上图分析得知,该32位寄存器只有低12位支持读写操作,即最大支持的计数值等于2的12次方等于4096。那么这里就要注意了,如果你选则的分频系数比较大,即计数时钟频率较低,受最大计数值的限制,就有可能达不到你所期望的计数周期;
在这里插入图片描述
上图是手册中帮大家计算出来了各种分频系数下最大支持的计数周期。比如分频系数选择16,则在最大计数值4096限制下,其支持得到最大计数周期为1638.4ms。如果你期望计数周期是2秒,那么就不能选择16作为分频系数,可选择32、64、128、256作为分频系数;

3.3 键寄存器(IWDG_KR):
该寄存器用于存储特定值,用于控制其他寄存器使能/失能;
(1)如期望更改预分频值和重装载值,则往该寄存器写入0x5555;
(2)如期望启动看门狗,则往该寄存器写入0xCCCC;
(3)如期望将重装载值传递给递减计数器,即通常所说的“喂狗”,则往该寄存器写入0xAAAA;如下图所示,键寄存器写入0xAAAA后,预装载值将传递给递减寄存器;
在这里插入图片描述

四、独立看门狗配置分析

首先确认一下参数:
独立看门狗时钟源:40KHz
期望看门狗触发周期:1s
由上述3.2章节可知,满足周期1s,可选择16、32、64、128、256分频;我们举例进行计算分析:
(1)16分频:
独立看门狗计数时钟频率f=40KHz/16=2500Hz;
计数一次耗时t=1/f=1/2500s;
计时1s时,需要计数次数n=2500;
即看门狗配置为:
预分频为16,重装载值为2500;
IWDG_SetPrescaler(2); //设置IWDG预分频值为16
或者IWDG_SetPrescaler(IWDG_Prescaler_16); //设置IWDG预分频值为16
IWDG_SetReload(2500); //设置IWDG重装载值

(2)32分频:
独立看门狗计数时钟频率f=40KHz/32=1250Hz;
计数一次耗时t=1/f=1/1250s;
计时1s时,需要计数次数n=1250;
即看门狗配置为:
预分频为32,重装载值为1250;
IWDG_SetPrescaler(3); //设置IWDG预分频值为32
或者IWDG_SetPrescaler(IWDG_Prescaler_32); //设置IWDG预分频值为32
IWDG_SetReload(1250); //设置IWDG重装载值

(3)64分频:
独立看门狗计数时钟频率f=40KHz/64=625Hz;
计数一次耗时t=1/f=1/625s;
计时1s时,需要计数次数n=625;
即看门狗配置为:
预分频为64,重装载值为625;
IWDG_SetPrescaler(4); //设置IWDG预分频值为64
或者IWDG_SetPrescaler(IWDG_Prescaler_64); //设置IWDG预分频值为64
IWDG_SetReload(625); //设置IWDG重装载值

独立看门狗实际使用

初始化配置好独立看门狗并启用后,需要在程序中定期喂狗,否则将导致程序重启;注意:“定期”的意思是在看门狗触发周期内;

  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
配置GD32F303独立看门狗之前,首先需要确保你已经有一个包含其对应标准库的Keil工程。这个工程可以使用官方的例程,或者按照GD32F303调试小记(零)之工程创建与编译创建。[1] 对于独立看门狗定时器的配置,可以按照以下步骤进行: 1. 首先,根据需要,在某种条件触发的情况下执行下面的代码: ``` if(something) { fwdgt_write_enable(); // 允许写入看门狗寄存器 fwdgt_config(5, FWDGT_PSC_DIV64); // 配置看门狗计数值和预分频值,例如设置为5和FWDGT_PSC_DIV64,表示计数器时钟为0.625KHz,计数值为5,即8ms fwdgt_counter_reload(); // 重新装载计数值 fwdgt_enable(); // 开启看门狗定时器 } ``` 这段代码的作用是重新配置看门狗计数值,并开启看门狗定时器。 另外,如果需要更详细的配置信息或者参考代码,可以查看GD32303E-EVAL的相关链接,该链接提供了GD32303E-EVAL的BSP代码,其中包含了看门狗配置的示例代码。 总结起来,GD32F303的独立看门狗定时器是一个硬件计时电路,用于监测由软件故障导致的系统故障。它提供了灵活的配置选项,并提供了高安全水平和精确的时间控制。在内部计数值达到预设门限时,它会触发复位。在调试模式下,看门狗定时器的计数器可以停止计数。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *2* *4* [GD32F303调试小记(七)之独立看门狗](https://blog.csdn.net/qq_37554315/article/details/124540476)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [(实测可用)GD32F303RCT6开发板移植RT-Thread操作系统(添加idle空闲线程驱动独立看门狗fwdgt)](https://blog.csdn.net/zhej2014/article/details/124872104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值