独立看门狗(IWDG)

基础知识

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 的框图
image.png


寄存器

IWDG 主要由下面四个寄存器进行控制:键寄存器(IWDG_KR)预分频寄存器(WDG_PR)重装载寄存器(IWDG_RLR)状态寄存器(IWDG_SR)
IWDGSTM32 中寄存器的基地址为:0x4000 3000
image.png

键寄存器 (IWDG_KR)

image.png
需要注意以下对 KEY[15:0] 写入 0xAAAA 能防止复位,写入 0x5555 可以访问后面的 PR 和 RLR 寄存器。写入 0xCCCC 表示启动看门狗

预分频寄存器 (WDG_PR)

image.png

重装载寄存器 (IWDG_RLR)

image.png

状态寄存器 (WDG_SR)

image.png


标准库函数

初始化函数

IWDG 进行初始化的时候需要依次使用以下函数:

  • IWDG_WriteAcessCmd
    image.png
    函数主要是开启或者关闭寄存器的读写权限。
  • IWDG_SetPrescaler
    image.png
    用于设置分频值,如果设置计时 1s 倒计时的时候选择 64 分频
  • IWDG_SetReload
    image.png
    用于设置计数值,如果设置计时 1s 倒计时的时候选择 625
  • IWDG_ReloadCounter
    image.png
  • IWDG_Enable
    image.png
    初始化函数示例:
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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值