赞
踩
可以理解为对于一只狗的定时投喂,如果不给它吃东西就会狂叫,因此可以通过观察狗的状态来判断喂它的人有没有正常工作。
本质是一个 12 位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复 位信号,即 IWDG_RESET
如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们 经常说的喂狗。
独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。启用 IWDG后,LSI时钟会自动开启。LSI时钟频率并不精确,F1用40kHz。
LSI经过一个8位的预分频器得到计数器时钟。
低三位有效,因此可以组成8组分频组合 分频系数算法:
prer是IWDG_PR 的值;PSC就是就是预分频因子的值
比如IWDG_PR = 000,值为0,PSC=预分频因子=4*2^0=4*1=4
重装载寄存器是一个12位的寄存器,用于存放重装载值,低12位有效,即最大值为4096,这个值 的大小决定着独立看门狗的溢出时间。
键寄存器IWDG_KR可以说是独立看门狗的一个控制寄存器,主要有三种控制方式,往这个寄存器 写入下面三个不同的值有不同的效果。
溢出时间计算公式:
计数一次,经过的时间就是PSC/fiwdg
Tout 单位为秒
f 是固定的,为40k赫兹
PSC 是通过预分频寄存器设置的,需要算
RLR 是通过重装载寄存器设置的,需要算
开启独立看门狗,溢出时间为1秒,使用按键1进行喂狗。
将PSC = 64; RLR = 625时,Tout为1秒(不止这一种组合,只要能凑成1秒且符合寄存器限制的值都可以)(64*625/40=1000ms=1s)
1.常规配置
SYS->Debug->Serial Wire
RCC->High Speed Clock(HSE)->Crystal/Ceramic Resonator
时钟树HSE、PLLCLK打开,HCLK设置成72MHz
2.打开串口1,打开IWDG(独立看门狗),设置PSC、RLR
1. 在main.c中的main函数中,可以看到自动生成的 对于看门狗的初始化:
2.程序代码
- #include "string.h"
-
- int main(void)
- {
-
- HAL_UART_Transmit(&huart1, "start start\r\n", strlen("start start\r\n"), 100);
-
- while (1)
- {
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){
- HAL_IWDG_Refresh(&hiwdg); //喂狗
- HAL_UART_Transmit(&huart1,"喂狗成功……\n",strlen("喂狗成功……\n"),100);
- }
- HAL_Delay(50);
- }
- }
串口助手中:
可见,没有写在WHILE(1)里的串口信息在一直显示,这说明由于没有喂狗,程序在不停的一直重启;此时如果能每秒按一下KEY1,串口就显示“喂狗成功”,程序会正常运行,但只要超过一秒没按按钮,看门狗就会使得程序重启。{由于用的是轮询法检测按键,所以按键会有抖动,故显示多次“喂狗成功”}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。