打印
[应用相关]

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

[复制链接]
346|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、独立看门狗用途

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

二、独立看门狗时钟源

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

使用特权

评论回复
沙发
renzheshengui|  楼主 | 2021-6-3 16:44 | 只看该作者
三、独立看门狗寄存器分析
看门狗可以理解为是一个定时器,知道其时钟源,再根据想要的触发周期,计算出分频系数和重装载值就可以了。与定时器不同的是独立看门狗是独立于主程序运行的,即使在系统时钟异常,程序无法运行的情况下,独立看门狗仍然能够完全独立工作;
以STM32F10x系列为例:

3.1 预分频寄存器(IWDG_PR):
该寄存器用于存储独立看门狗时钟的分频系数,如期望对独立看门狗时钟40KHz进行64分频,则该寄存器应写入4,有人可能要问了,为啥不写入64呢?no,dear,不是这样的。这里我们就要看寄存器的描述:

在上图中可以看出,32位寄存器IWDG_PR中,只有低3位是可以读写的,由框中的对应关系可知,分频系数为64时,其实际写入寄存器的值为0x04,其余分频系数以此类推;


使用特权

评论回复
板凳
renzheshengui|  楼主 | 2021-6-3 16:44 | 只看该作者
3.2 重装载寄存器(IWDG_RLR)
该寄存器用于存储递减计数器的重装载值,顾名思义,“重装载值”意思就是预先设置一个值,计数启动后,递减计数器从该值开始递减,当递减至0的时候就将该值赋给递减计数器,继续开始下一轮递减,周而复始,直至计时结束;


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


由上图分析得知,该32位寄存器只有低12位支持读写操作,即最大支持的计数值等于2的12次方等于4096。那么这里就要注意了,如果你选则的分频系数比较大,即计数时钟频率较低,受最大计数值的限制,就有可能达不到你所期望的计数周期;

上图是手册中帮大家计算出来了各种分频系数下最大支持的计数周期。比如分频系数选择16,则在最大计数值4096限制下,其支持得到最大计数周期为1638.4ms。如果你期望计数周期是2秒,那么就不能选择16作为分频系数,可选择32、64、128、256作为分频系数;


使用特权

评论回复
地板
renzheshengui|  楼主 | 2021-6-3 16:45 | 只看该作者
3.3 键寄存器(IWDG_KR):
该寄存器用于存储特定值,用于控制其他寄存器使能/失能;
(1)如期望更改预分频值和重装载值,则往该寄存器写入0x5555;
(2)如期望启动看门狗,则往该寄存器写入0xCCCC;
(3)如期望将重装载值传递给递减计数器,即通常所说的“喂狗”,则往该寄存器写入0xAAAA;如下图所示,键寄存器写入0xAAAA后,预装载值将传递给递减寄存器;



使用特权

评论回复
5
renzheshengui|  楼主 | 2021-6-3 16:45 | 只看该作者
四、独立看门狗配置分析
首先确认一下参数:
独立看门狗时钟源: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重装载值

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


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

3938

帖子

2

粉丝