初学stm32 --- 窗口看门狗

STM32F1 窗口看门狗

窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位(WWDG->CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。

在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个 MCU 复位。

这表明递减计数器需要在一个有限的时间窗口中被刷新。 他们的关系可以用图 12.1.1 来说明:
图1 窗口看门狗工作示意图

T[6:0]就是 WWDG_CR 的低七位, W[6:0]即是 WWDG->CFR 的低七位。 T[6:0]就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。

上窗口值(W[6:0]) 是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保窗口值大于 0X40 ,否则窗口就不存在了。

窗口看门狗的超时公式如下:

其中:

: WWDG 超时时间(单位为 ms)

: APB1 的时钟频率(单位为 Khz)

: WWDG 的预分频系数

:窗口看门狗的计数器低 6 位

根据上面的公式,假设 =36Mhz,那么可以得到最小-最大超时时间表如图2 所示
图2 36M 时钟下窗口看门狗的最小最大超时表

窗口看门狗相关寄存器

控制寄存器(WWDG_CR)

可以看出,这里我们的 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 无效。 即使中断未被使能, 在计数器的值达到 0X40。的时候, 此位也会被置 1。

启动过程

窗口看门狗库函数相关源码和定义分布在文件stm32f10x_wwdg.c 文件和头文件 stm32f10x_wwdg.h 中。步骤如下:

1) 使能 WWDG 时钟

WWDG 不同于 IWDG, IWDG 有自己独立的 40Khz 时钟,不存在使能问题。而 WWDG使用的是 PCLK1 的时钟,需要先使能时钟。 方法是:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能

2) 设置窗口值和分频数

设置窗口值的函数是:

cpp 复制代码
void WWDG_SetWindowValue(uint8_t WindowValue);

这个函数的入口参数 WindowValue 用来设置看门狗的上窗口值。

设置分频数的函数是:

cpp 复制代码
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

这个函数同样只有一个入口参数,用来设置看门狗的分频值。

3) 开启 WWDG 中断并分组

开启 WWDG 中断的函数为:

cpp 复制代码
WWDG_EnableIT(); //开启窗口看门狗中断

接下来是进行中断优先级配置,这里就不重复了,使用 NVIC_Init()函数即可。

4) 设置计数器初始值并使能看门狗

这一步在库函数里面是通过一个函数实现的:

cpp 复制代码
void WWDG_Enable(uint8_t Counter);

该函数既设置了计数器初始值,同时使能了窗口看门狗。

5) 编写中断服务函数

在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。在中断服务函数里面也要将状态寄存器的 EWIF 位清空。

总结

① 使能看门狗时钟:RCC_APB1PeriphClockCmd();

② 设置分频系数: WWDG_SetPrescaler*();*

③ 设置上窗口值: WWDG_SetWindowValue*();*

④ 开启提前唤醒中断并分组(可选): WWDG_EnableIT(); NVIC_Init*();*

⑤ 使能看门狗和设置计数器初始值: WWDG_Enable*();*

⑥ 喂狗: WWDG_SetCounter*();*

⑦编写中断服务函数: WWDG_IRQHandler*();*

相关推荐
Qingniu013 分钟前
D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。
科技·单片机·电脑·笔记本电脑·电视摄像机·摇头机·白色家电
美式小田3 小时前
Cadence学习笔记 8 添加分页符
笔记·嵌入式硬件·学习·cadence
跟着杰哥学嵌入式3 小时前
stm32中有哪些库?其中标准库和HAL库有什么区别?
stm32·单片机·嵌入式硬件
美式小田3 小时前
Cadence学习笔记 9 器件封装匹配
笔记·嵌入式硬件·学习·cadence
学习噢学个屁5 小时前
基于51单片机的交通灯设计—夜间、紧急、复位、可调时间、四个数码管显示
c语言·单片机·嵌入式硬件·51单片机
电子绿洲6 小时前
DCDC Buck模式的电感值参数计算
单片机·嵌入式硬件
xxxx1234456 小时前
Linux-ubuntu之主频和时钟配置
linux·c语言·单片机·ubuntu
end_SJ6 小时前
初学stm32 --- NVIC中断
stm32·单片机·嵌入式硬件
东辰芯力6 小时前
探索未来物联网开发——HiSpark平台与海思IDE安装指南
人工智能·单片机·嵌入式硬件·算法·risc-v
小A1596 小时前
STM32完全学习——CRC校验
stm32·嵌入式硬件·学习