初学stm32对独立看门狗的一些理解

首先来介绍下看门狗是个神魔东西,在现实工业设备设计中需要考虑环境中电磁干扰等一系列干扰,这些干扰会影响单片机的正常工作(会出现程序莫名跑飞),我们改变不了环境就只好从自身这里下手,于是有了一个检测单片机自身运行状态的东西,看看程序是不是正常跑完。这个东西就叫看门狗。看门狗分两类:独立看门狗和窗口看门狗。这俩的区别就是独立看门狗用的是独立的时钟LSI,这样可以在系统时钟不工作的时候继续工作,窗口看门狗是用的系统时钟,所以和系统时钟共存亡。
好了开启正题,独立看门狗是被LSI时钟驱动的,LSI时钟是一个不准确的时钟(30-60GHZ),因为看门狗是个检测工具不需要太准确的时钟,只要可以驱动就可以。

控制独立看门狗需要几个寄存器,我们来一一介绍。第一个IWDG_KR键值寄存器,它的功能更像是一个总开关控制另外几个寄存器的读写与开关。eg:向IWDG_KR中输入0XCCCC,开启独立看门狗;写入0xAAAA,IWDG_RLR寄存器中的数会到计数器中;写入0x5555,会打开IWDG_PR和IWDG_RLR的写入保护。 第二个是IWDG_RLR寄存器,这个寄存器可以当作一个存数的功能。 第三个是IWDG_PR分频寄存器,为什么要用分频器呢,我们不是已经有好几个时钟了吗(HSE,LSI等),是这样的,下面是一张时钟树图。初学stm32对独立看门狗的一些理解
我们可以看到外设都挂在AHB 和APB总线上,这个总线上的频率是由HSI,HSE,PLL时钟共同提供的,他们的频率有72MHZ 或者64MHZ,但是每个外设的适用频率是不一样的,这里就用到了分频器,把主线上的频率变化成外设适用的,这里的看门狗也需要分频才可工作。
第四个是重载寄存器,该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的。
以上就是我们需要用到的寄存器,现在我们可以启动 STM32 的独立看门狗, 通过对
寄存器的讲解我们大致了解了独立看门狗原理和配置方法。接下来我们通过库函数方法教大家
一步一步配置独立看门狗。 独立看门狗相关的库函数和定义分布在文件 stm32f10x_iwdg.h 和
stm32f10x_iwdg.c 中
1,取消寄存器写入保护,向IWDG_KR中写入0x5555,代码为IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);这个函数非常简单,顾名思义就是开启/取消写保护,也就是使能/失能写权限。
2)设置独立看门狗的预分频系数和重装载值

wdg.c部分
#include “wdg.h”
//初始化独立看门狗
//prer:分频数:0~7(只有低 3 位有效!)
//分频因子=42^prer.但最大值只能是 256!
//rlr:重装载寄存器值:低 11 位有效.
//时间计算(大概):Tout=((4
2^prer)*rlr)/40 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//使能对寄存器 IWDG_PR 和 IWDG_RLR 的写操作
IWDG_SetPrescaler(prer); //设置 IWDG 预分频值:设置 IWDG 预分频值为 64
IWDG_SetReload(rlr); //设置 IWDG 重装载值
IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
IWDG_Enable(); //使能 IWDG}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG->KR=0XAAAA;//reload
}

main部分
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组 2
uart_init(9600); //串口初始化为 9600
LED_Init(); //初始化与 LED 连接的硬件接口
KEY_Init(); //按键初始化
delay_ms(300); //让人看得到灭
IWDG_Init(4,625); //与分频数为 64,重载值为 625,溢出时间为 1s
LED0=0; //点亮 LED0
while(1)
{
if(KEY_Scan(0)==WKUP_PRES)IWDG_Feed();//如果 WK_UP 按下,则喂狗
delay_ms(10);
};
}