1.看门狗的使用环境
在工业的工作环境中设备经常面临一些恶劣的环境,超高温 超低温 强烈的电磁干扰,这些环境都会影响设备的正常工作会造成设备死机,设备中运行的程序直接跑飞
所以可以使用看门狗帮助程序员检测设备是否死机或者程序跑飞,一旦设备死机或者程序跑飞,看门狗可以帮助程序员重启系统
2.看门狗的简介
看门狗属于定时器的资源,既然说看门狗是定时器,那么决定看门狗的定时长短由时钟频率和计数值来决定,和普通定时器不同,普通定时器当定时到了之后,可以去处理程序员指定的事情,但是看门狗不同,当看门狗的定时到了之后,直接重启系统(按reset按键),如果设备本身没有死机或者程序没有跑飞,不需要重启
3.看门狗的喂狗
使用看门狗监测设备系统,如果设备没有死机,程序没有跑飞,是不需要重启的
需要每隔一段时间进行喂狗的操作(给看门狗的计数器重新赋计数值)
4.看门狗外设资源
有些芯片内部集成了看门狗的外设->可以直接使用
有些芯片内部没有看门狗外设->需要硬件工程师在开发板上外接一个看门狗
5.介绍STM32芯片中的看门狗
在STM32F103RBT6芯片中有两个看门狗:独立看门狗(IWDG),窗口看门狗(WWDG)。
注意:一般来说高端芯片中只有一个看门狗,和独立看门狗类似
相同点:
- IWDG和WWDG都是由STM32芯片提供的外设资源
- IWDG和WWDG都会因为设备死机或者程序跑飞,进行重启系统
- IWDG和WWDG都可以自行调节喂狗的时间
不同点:
- 时钟源不同:IWDG使用的是独立的内部RC(LSI 40kHz),不需要通过总线使能时钟,
WWDG使用的是APB1总线提供的时钟,需要通过总线使能时钟
- 产生中断不同:IWDG是没有中断的,只要触发了IWDG,直接重启系统
WWDG是有中断的,当计数器计到超时时可以触发中断
- 计数方式不同:IWDG使用的是12bit的计数器(0~4095)
WWDG使用的是7bit的计数器
- 喂狗时间范围不同:IWDG只要在计数器计到0之前,任意时间喂狗都可以
WWDG中会有一个上阙值和下阙值
详细了解独立看门狗:打开目录下, P276 P280
IWDG_KR : 接受特定的值,做特定的操作,[0-15]有效,[16-31]保留
IWDG_PR : 预分频寄存器,[0-2]有效,[3-31]保留
IWDG_PLR : 重装载值寄存器,[0~11]有效,[12-31]保留,计数值范围[0 - 4095]
![]()
![]()
![]()
/*
用于驱动独立看门狗
是由时钟频率以及计数值决定定时长短
*/
#include "stm32f10x_conf.h"
extern void iwdg_init(int ms);//独立看门狗的初始化
/*
IWDG_KR 0xAAAA喂狗 0x5555关闭写保护 0xCCCC开启看门狗
IWDG_PR 设置预分频
IWDG_RLR设置计数值
*/
extern void iwdg_feed_dog(void);//喂狗的操作
#include "iwdg.h"
void iwdg_init(int ms)//独立看门狗的初始化
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//开启IWDG_PR和IWDG_RLR寄存器的写访问
IWDG_SetPrescaler(IWDG_Prescaler_64);//设置预分频值为64分频,时钟频率 = 40KHz / 64 = 625Hz
IWDG_SetReload(ms);//设置重装载值
IWDG_ReloadCounter();//喂狗
IWDG_Enable();//开启看门狗
}
void iwdg_feed_dog(void)//喂狗的操作
{
IWDG_ReloadCounter();//喂狗
}
测试
int flag = 0;//定义了一个全局变量,用于记录标志
void h0(void)//KEY0按键按下要处理的事情
{
led_on(1);
flag = 1;//改变全局变量flag的状态
}
void h1(void)//KEY1按键按下要处理的事情
{
led_on(2);
}
void h2(void)//KEY2按键按下要处理的事情
{
led_off(1);
led_off(2);
}
int main(void)
{
led_init();//调用LED灯初始化的函数
buzzer_init();//调用蜂鸣器初始化的函数
button_init();//调用功能按键初始化的函数
delay_init();//调用系统定时器初始化的函数
eint_init();//调用按键中断初始化的函数
set_eint_handler(h0, h1, h2);//设置按键中断的回调函数
buzzer_on();//打开蜂鸣器
iwdg_init(625 * 6);//调用独立看门狗初始化的函数,并且设置计数值(6s之内进行喂狗)
delay_ms(4000);//延时4s
buzzer_off();//关闭蜂鸣器
while(!flag)//可以让CPU在死循环中其他事情
{
iwdg_feed_dog();//喂狗
led_on(0);
delay_ms(500);
led_off(0);
delay_ms(500);
}
}