一、独立看门狗概述:
独立看门狗其实就是一个独立于主时钟的定时复位狗。一旦开启独立看门狗,它就会根据自己设定的时间不断倒数,倒数到0后就开始复位。
二、关于喂狗:
喂狗就是让狗去吃东西,分心后,这只狗就得重新倒数。
三、stm32看门狗示例程序:
#include “led.h”
#include “delay.h”
#include “key.h”
#include “sys.h”
#include “usart.h”
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作
IWDG_SetPrescaler(prer); //设置IWDG预分频值:设置IWDG预分频值为64
IWDG_SetReload(rlr); //设置IWDG重装载值
IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG_Enable(); //使能IWDG} int main(void)
{
//延时函数初始化 delay_init()
//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//初始化与LED连接的硬件接口 LED_Init();
//按键初始化 KEY_Init();
delay_ms(500); //与分频数为64,重载值为625,溢出时间为1s
IWDG_Init(4,625); //点亮LED0 LED0=0;
while(1)
{
if(KEY_Scan(0)==WKUP_PRES)
{
IWDG_ReloadCounter();
//如果WK_UP按下,则喂狗
}
}
}
从主程序main的第一行开始运行到下面的代码时,开启看门狗
//与分频数为64,重载值为625,溢出时间为1s IWDG_Init(4,625);
此时,键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。
所以我们会看到等一亮一灭。
此时,如果检测到按键按下,那么就会运行喂狗程序:
if(KEY_Scan(0)==WKUP_PRES)
{
IWDG_ReloadCounter();
//如果WK_UP按下,则喂狗
}
喂狗后, 键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器,也就是对应到初始化设置的计数值,我们设置的1S,那么计数器就将重1s处开始递减,如果我们持续按按键,那么计数器就会持续保持在那个值,不会倒数到0,也就不会产生复位,那么灯就会始终保持亮的状态。
从而验证了看门狗和喂狗的功能。
一、独立看门狗概述:
独立看门狗其实就是一个独立于主时钟的定时复位狗。一旦开启独立看门狗,它就会根据自己设定的时间不断倒数,倒数到0后就开始复位。
二、关于喂狗:
喂狗就是让狗去吃东西,分心后,这只狗就得重新倒数。
三、stm32看门狗示例程序:
#include “led.h”
#include “delay.h”
#include “key.h”
#include “sys.h”
#include “usart.h”
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作
IWDG_SetPrescaler(prer); //设置IWDG预分频值:设置IWDG预分频值为64
IWDG_SetReload(rlr); //设置IWDG重装载值
IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG_Enable(); //使能IWDG} int main(void)
{
//延时函数初始化 delay_init()
//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//初始化与LED连接的硬件接口 LED_Init();
//按键初始化 KEY_Init();
delay_ms(500); //与分频数为64,重载值为625,溢出时间为1s
IWDG_Init(4,625); //点亮LED0 LED0=0;
while(1)
{
if(KEY_Scan(0)==WKUP_PRES)
{
IWDG_ReloadCounter();
//如果WK_UP按下,则喂狗
}
}
}
从主程序main的第一行开始运行到下面的代码时,开启看门狗
//与分频数为64,重载值为625,溢出时间为1s IWDG_Init(4,625);
此时,键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。
所以我们会看到等一亮一灭。
此时,如果检测到按键按下,那么就会运行喂狗程序:
if(KEY_Scan(0)==WKUP_PRES)
{
IWDG_ReloadCounter();
//如果WK_UP按下,则喂狗
}
喂狗后, 键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器,也就是对应到初始化设置的计数值,我们设置的1S,那么计数器就将重1s处开始递减,如果我们持续按按键,那么计数器就会持续保持在那个值,不会倒数到0,也就不会产生复位,那么灯就会始终保持亮的状态。
从而验证了看门狗和喂狗的功能。
举报