看门狗(独立看门狗)IWDG

看门狗

功能:当程序没有预定运行时复位。 通过定时投喂确定程序正常运行,当不正常运行时也就不会正常投喂,未投喂达到一定时间后自动复位(重启)程序。

独立看门狗(IWDG):

寄存器版:

介绍:独立看门狗(IWDG),由专用的40Khz低速时钟驱动,当主时钟发生故障时它也能继续工作。和独立看门狗相关的寄存器一共有三个和一个特殊位;(IWDG_KR键值寄存器)(IWDG_PR预分频寄存器) (IWDG_RLR重装载寄存器) (IWDG_SR 的PVU位)。IWDG_RLR是计数器初值存储器当计数器计数到零时产生IWDG_RESET复位信号。

各个寄存器基础功能:

寄存器特点:IWDG_PR,IWDG_RLR两个寄存器含有写保护,第一个寄存器可以控制驱动时钟的分频,第二个寄存器是计数的初值。这两个寄存器的值可以调控看门狗,计数的时间。

  • IWDG_KR键值寄存器(只写寄存器):
image-20220109154226564
写入值 含义
0x5555 解除IWDG_PR和IWDG_RLR寄存器的写保护(下一次写这两个寄存器时还需要重新解除)
0xcccc 启动看门狗
0xAAAA 喂狗,将重装载寄存器中的值,加载到计数器中。

预分频寄存器:可读,但是读的值是否有效需要看那个WIDG_SR 的PVU位是否为0;

image

库函数版:

void IWDG_WriteAccessCmd(uint16_t *IWDG_WriteAccess*);//用于解除PR和RLR寄存器的写保护
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//用于设置PR寄存器的值;
void IWDG_SetReload(uint16_t Reload);//用于设置RLR寄存器的值;
void IWDG_Enable(void);//用于开启看门狗
void IWDG_ReloadCounter(void);//用于喂食;

看门狗间隔时间的计算:

Tout=((4*2^prer) *rlr)/40 单位是ms,prer是写入PR的值,rlr是重装载的值;40是时钟频率单位是KHZ(由于这个时钟不稳定所以这个时间是个大概时间)

看门口使用流程:

  1. 初始化看门狗
    1. 打开PR和RLR寄存器的写保护
    2. 根据情况确定要的间隔时间,根据写入PR,RLR寄存器的prer、rlr的值确定;
    3. 开启看门狗
  2. 定时投喂看门狗
    1. 向KR寄存器中写0xAAAA

事例

// 看门口实验

#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_iwdg.h>
#include "led_my.h"
#include "key_my.h"
#include "delay.h"

void IWDGInitMy(uint8_t pre,uint16_t reload){
    char re=0;
    if(re){
        //寄存器版
        IWDG->KR=0x5555;
        IWDG->PR=pre;
        IWDG->RLR=reload;
        IWDG->KR=0xcccc;
    }else{
        // 库函数版
        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
        IWDG_SetPrescaler(pre);
        IWDG_SetReload(reload);
        IWDG_ReloadCounter();
        IWDG_Enable();
    }
}

int main()
{
    LedInit();
    KeyInit();
    delay_init();
    LedOpen();
    delay_ms(5000);
    IWDGInitMy(4,6250);//定时10s
    while (1)
    {
        if(ScanKey())
            IWDG_ReloadCounter();
        LedOpen();
        delay_ms(200);
        LedClsoe();
        delay_ms(200);
    }
    return 0;
}

窗口看门狗(WWDG):

和看门狗功能相似都是为了防止程序跑飞。特点:使用的是系统时钟,控制更准确。投喂有一个窗口期,只有在这个窗口期间可以投喂。窗口期前投喂会产生MCU复位信号,窗口期后投喂也会产生MCU复位信号,不投喂,当达到一个值时也会产生复位信号。

具体配置和使用参考:《STM32手册库函数编程》STM32窗口看门狗实验。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容