stm32看门狗详细介绍

独立看门狗(IWDG)

独立看门狗由内部专门的 40Khz 低速时钟(内部 RC 时钟)驱动,即使主时钟发生故障,它也仍然有效。

作用
单片机系统万一在外界干扰死循环,看门狗可以复位。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。


相关寄存器
键值寄存器 IWDG_KRMarkdown
在这里插入图片描述
启动
写入 0xCCCC
产生复位信号
计数器开始从其复位值 0xFFF 递减计数计数器计数到末尾 0x000。(IWDG_RESET)
喂狗
写入 0xAAAA

注意:IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。

操作流程:

  1. 取消寄存器 写保护 (向 IWDG_KR 写入 0X5555 )
  2. 设置独立看门狗的预分频系数和重装载值
  3. 重载计数值喂狗 (向 向 IWDG_KR 写入 0XAAAA )
  4. 启动看门狗(向 向 IWDG_KR 写入 0XCCCC)
//1
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//2
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值 
void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
//3
IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
//4
IWDG_Enable(); //使能 IWDG

注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启。

窗口门狗(WWDG )

窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。

递减计数器需要在一个有限的时间窗口中被刷新。
在这里插入图片描述
T[6:0]就是 WWDG_CR 的低七位,W[6:0]即是 WWDG->CFR 的低七位。T[6:0]
就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。

就是只能再窗口期喂狗。

上窗口值(W[6:0])是由用户自己设定的,确保窗口值大于 0X40.
在这里插入图片描述
在这里插入图片描述
假设 Fpclk1=36Mhz,则可以计算超时时间表。
在这里插入图片描述

相关寄存器

控制寄存器(WWDG_CR)

只有低八位有效,T[6:0]用来存储看门狗的计数器值,随时更新的,每个窗口看门狗计数周期(4096×2^ WDGTB)减 1。
当该计数器的值从 0X40 变为 0X3F 的时候,将产生看门狗复位。
WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该位一旦设置,就只能在硬件复位后才能清零了。

配置寄存器(WWDG_CFR)
在这里插入图片描述
该位中的 EWI 是提前唤醒中断,也就是在快要产生复位的前一段时(T[6:0]=0X40)来提醒我们,需要进行喂狗了,否则将复位!

我们一般就是利用这个位设置中断


当窗口看门狗的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。


注意:这里在进入中断后,必须在不大于 1 个窗口看门狗计数周期的时间(在 PCLK1 频率为 36M 且 WDGTB 为 0 的条件下,该时间为 113us)内重新写 WWDG_CR,否则,看门狗将产生复位!

状态寄存器(WWDG_SR)
该寄存器用来记录当前是否有提前唤醒的标志。该寄存器仅有位 0 有效,其他都是保留位。

当计数器值达到 40h 时,此位由硬件置 1。
它必须通过软件写 0 来清除。对此位写 1 无效。

操作步骤

  1. 使能 WWDG
  2. 设置窗口值和分频值
  3. 开启WWDG中断并分组
  4. 设置计数器初始值并使能看门狗
  5. 编写中断服务函数
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能
//WWDG 不同于 IWDG,IWDG 有自己独立的 40Khz 时钟,不存在使能问题。
// WWDG使用的是 PCLK1 的时钟
void WWDG_SetWindowValue(uint8_t WindowValue)// WindowValue 用来设置看门狗的上窗口值
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)//设置分频数
WWDG_EnableIT(); //开启窗口看门狗中断
//接下来是进行中断优先级配置,这里就不重复了,使用 NVIC_Init()函数即可。
void WWDG_Enable(uint8_t Counter)//该函数既设置了计数器初始值,同时使能了窗口看门狗。

/*最后,编写服务函数*/
//通过该函数来喂狗
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值