独立看门狗

来源:互联网 发布:卖血哥玩的软件是什么 编辑:程序博客网 时间:2024/05/01 03:57

经常听到同事说起看门狗,当时心里就想,我见过狮子狗,哈巴狗,就从没见过看门狗,难道这世上居然还有这样一种狗,听得我一头雾水,还以为他们在聊宠物呢。现在终于知道这是只什么狗了,哈哈,和我想像中的差别有点大。

STM32 独立看门狗简介
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。

原理
这个百度百科里面有很详细的解释。 我们总结一下:
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环, 看门狗电路就是为了避免这种情况的发生。 看门狗的作用就是在一定时间内(通过定时计数器实现) 没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。

实验内容
在看门狗开启后马山点亮 LED0( DS0),并进入死循环等待按键的输入,一旦 WK_UP 有按键,则喂狗,否则等待 IWDG 复位的到来。

实验步骤:
1、取消寄存器写保护:
IWDG_WriteAccessCmd();
2、设置独立看门狗的预分频系数,确定时钟:
IWDG_SetPrescaler();
3、 设置看门狗重装载值,确定溢出时间:
IWDG_SetReload();
4、使能看门狗
IWDG_Enable();
5、应用程序喂狗:
IWDG_ReloadCounter();

溢出时间计算:
Tout=((4×2^prer) ×rlr) /40 (M3)

代码:
main.c

#include "led.h"#include "key.h"#include "beep.h"#include "delay.h"#include "iwdg.h"int main(){    u8 key;    delay_init();    LED_Init();    KEY_Init();    BEEP_Init();    delay_ms(200);    LED0 = 0;    IWDG_Init(4,625); // 最大喂狗时间;    while(1)    {        key = KEY_Scan(0);        if (key == WKUP_PRES)        {            IWDG_ReloadCounter();        }    }}

iwdg.h

#ifndef __WGD_H#define __WGD_H#include "sys.h"void IWDG_Init(u8 prer,u16 rlr);#endif

iwdg.c

#include "iwdg.h"void IWDG_Init(u8 prer,u16 rlr){    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器写操作    IWDG_SetPrescaler(prer); //设置 IWDG 预分频值    IWDG_SetReload(rlr);  //设置 IWDG 重装载值    IWDG_ReloadCounter();  //重装载 IWDG 计数器    IWDG_Enable();  //使能 IWDG}
0 0
原创粉丝点击