基础知识
在 STM32
中有两个看门狗,独立看门狗 (IWDG) 和窗口看门狗 (WWDG)。本文主要介绍独立看门狗的相关知识。
独立看门狗 (IWDG) 由专用的低速时钟 LSI 驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从 APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。这就代表 IWDG
最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。WWDG
最适合那些要求看门狗在精确计时窗口起作用的应用程序。
IWDG
需要注意其是 LSI 时钟驱动,其频率一般为 30~60KHZ, 并没有固定准确的值,一般按照 40KHZ 进行计算。所以必须使用在对于时间要求并不很准确的场景。
在键寄存器 (IWDG_KR) 中写入 0xCCCC, 开始启用独立看门狗:此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号 (IWDG RESET). 无论何时,只要在键寄存器 IWDG KR 中写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器,从而避免产生看门狗复位。
所以 IWDG
的作用一般用于程序出现跑飞情况下的自动复位。一般在程序中的操作只有两个:初始化和喂狗操作。初始化后将开启 IWDG
,在倒计时到位后就会复位程序,但是在正常情况下我们并不希望程序进行复位,所以我们还需要一个喂狗操作,这样在程序正常情况下程序会进行喂狗防止复位,当程序出现跑飞情况后喂狗操作无法执行后就会进行程序复位。
以下是 IWDG
的框图
寄存器
IWDG
主要由下面四个寄存器进行控制:键寄存器(IWDG_KR)
,预分频寄存器(WDG_PR)
,重装载寄存器(IWDG_RLR)
,状态寄存器(IWDG_SR)
IWDG
在 STM32
中寄存器的基地址为:0x4000 3000
键寄存器 (IWDG_KR)
需要注意以下对 KEY[15:0] 写入 0xAAAA 能防止复位,写入 0x5555 可以访问后面的 PR 和 RLR 寄存器。写入 0xCCCC 表示启动看门狗
预分频寄存器 (WDG_PR)
重装载寄存器 (IWDG_RLR)
状态寄存器 (WDG_SR)
标准库函数
初始化函数
对 IWDG
进行初始化的时候需要依次使用以下函数:
IWDG_WriteAcessCmd
函数主要是开启或者关闭寄存器的读写权限。IWDG_SetPrescaler
用于设置分频值,如果设置计时 1s 倒计时的时候选择 64 分频IWDG_SetReload
用于设置计数值,如果设置计时 1s 倒计时的时候选择 625IWDG_ReloadCounter
IWDG_Enable
初始化函数示例:
void IWDG_Configuration(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_64);
IWDG_SetReload(625);
IWDG_ReloadCounter();
IWDG_Enable();
}
喂狗操作
喂狗操作其实就是让 IWDG
重新装载计数值。示例程序如下:
void IWDG_FeedDog()
{
IWDG_ReloadCounter();
}
示例
IWDG.h
#ifndef IWDG_IWDG_H
#define IWDG_IWDG_H
#include "stm32f10x.h"
/// @brief 初始化独立看门狗,默认1s,如需请修改函数中 IWDG_SetReload() 中的值
void IWDG_Configuration(void);
/// @brief 独立看门狗喂狗操作,防止复位。
void IWDG_FeedDog(void);
#endif //IWDG_IWDG_H
IWDG.c
#include "IWDG.h"
void IWDG_Configuration(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_64);
IWDG_SetReload(625);
IWDG_ReloadCounter();
IWDG_Enable();
}
void IWDG_FeedDog()
{
IWDG_ReloadCounter();
}