本篇文章将讲述独立看门狗的相关知识,如果只想看代码的话,可以直接翻到最后。
目录
一、独立看门狗的概述
(1)为什么需要看门狗?
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生一种专门用于监测单片机程序的运行状态的模块或芯片,俗称“看门狗”。
(2)解决的问题:
(1)在启动正常运行的时候,系统不能复位,在系统跑飞的情况或者程序异常执行的情况,系统复位,程序重新执行。
(3)STM32的内置两个看门狗:
1.独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效(适用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合)
2.窗口看门狗由APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。(最适合那些要求看门狗在精确计时窗口起作用的程序)
(4)独立看门狗功能的描述
1.在键值寄存器(IWDG_KR)中写入0XCCCC,开始启用独立看门狗。此时计数器开始从其复位值0XFFF递减,当计数器值技术到尾值0X000时会产生一个复位信号(IWDG_RESET)。
2.无论何时,只要在键值寄存器IWDG_KR中写入0XAAAA(通常说的喂狗),自动重装载寄存器IWDG_KR中写入0XAAAA(通常说的喂狗),自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。
3.如果程序异常,就无法正常喂狗,从而系统复位。
二、独立看门狗实验
(1)整体思路:
1.取消寄存器写保护(向 IWDG_KR 写入 0X5555)
在库函数中的实现函数是:
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
2.设置独立看门狗的预分频系数和重装载值
设置看门狗的分频系数的函数是:
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值
设置看门狗的重装载值的函数是:
void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间(也就是看门狗溢
出时间),该时间的计算方式为:
Tout=((4×2^prer) ×rlr) /40
3.重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
库函数里面重载计数值的函数是:
IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
4.启动看门狗(向 IWDG_KR 写入 0XCCCC)
库函数里面启动独立看门狗的函数是:
IWDG_Enable(); //使能 IWDG
[注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。]
(2)现象:在配置看门狗后,DS0 将常亮,如果 WK_UP 按键按下,就喂狗,只要 WK_UP 不停的按,看门狗就一直不会产生复位,保持 DS0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 DS0 熄灭一次。
(5)看门狗实验
在main.c的文件里:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "wdg.h"
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LED_Init();
KEY_Init();
delay_ms(300);
IWDG_Init(4,625);
LED0=0;
while(1)
{
if(KEY_Scan(0)==WKUP_PRES)IWDG_Feed();
delay_ms(10);
};
}
在wdg.c里的文件是:
#include "wdg.h"
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG->KR=0X5555;
IWDG->PR=prer;
IWDG->RLR=rlr;
IWDG->KR=0XAAAA;
IWDG->KR=0XCCCC;
}
void IWDG_Feed(void)
{
IWDG->KR=0XAAAA;//reload
}