看门狗
功能:当程序没有预定运行时复位。 通过定时投喂确定程序正常运行,当不正常运行时也就不会正常投喂,未投喂达到一定时间后自动复位(重启)程序。
独立看门狗(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(由于这个时钟不稳定所以这个时间是个大概时间)
看门口使用流程:
- 初始化看门狗
- 打开PR和RLR寄存器的写保护
- 根据情况确定要的间隔时间,根据写入PR,RLR寄存器的prer、rlr的值确定;
- 开启看门狗
- 定时投喂看门狗
- 向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窗口看门狗实验。