独立看门狗

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

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值