看门狗介绍
STM32有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬,本章我们主要分析独立看门狗的功能框图和它的应用。 独立看门狗用通俗一点的话来解释就是一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。 如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电, 在停止模式和待机模式下仍能工作。
独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。LSI的频率一般在30~60KHZ之间, 根据温度和工作场合会有一定的漂移,我们一般取40KHZ,所以独立看门狗的定时时间并不一定非常精确,只适用于对时间精度要求比较低的场合。
看门狗配置参数
void IWDG_Config(uint8_t prv ,uint16_t rlv)
{
// 使能 预分频寄存器PR和重装载寄存器RLR可写
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
// 设置预分频器值
IWDG_SetPrescaler( prv );
// 设置重装载寄存器值
IWDG_SetReload( rlv );
// 把重装载寄存器的值放到计数器中
IWDG_ReloadCounter();
// 使能 IWDG
IWDG_Enable();
}
喂狗函数
void IWDG_Feed(void)
{
// 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
// 当计数器的值减到0的时候会产生系统复位
IWDG_ReloadCounter();
}
代码函数
1.bsp_iwdg.c
/* 包含头文件 ----------------------------------------------------------------*/
#include "bsp/wdg/bsp_iwdg.h"
void IWDG_Config(uint8_t prv ,uint16_t rlv)
{
/* 使能 预分频寄存器PR和重装载寄存器RLR可写 */
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
/* 设置预分频器值 */
IWDG_SetPrescaler( prv );
/* 设置重装载寄存器值 */
IWDG_SetReload( rlv );
/* 把重装载寄存器的值放到计数器中 */
IWDG_ReloadCounter();
/* 使能 IWDG */
IWDG_Enable();
}
/**
* 函数功能: 喂狗
*/
void IWDG_Feed(void)
{
/* 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
当计数器的值减到0的时候会产生系统复位 */
IWDG_ReloadCounter();
}
2.bsp_iwdg.h
#ifndef __BSP_IWDG_H__
#define __BSP_IWDG_H__
/* 包含头文件 ----------------------------------------------------------------*/
#include <stm32f10x.h>
/* 类型定义 ------------------------------------------------------------------*/
/* 宏定义 --------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/
/* 函数声明 ------------------------------------------------------------------*/
void IWDG_Feed(void);
void IWDG_Config(uint8_t prv ,uint16_t rlv);
#endif /* __BSP_IWDG_H__ */
3.main
/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"
#include "bsp/key/bsp_key.h"
#include "bsp/delay/delay.h"
#include "bsp/systick/bsp_SysTick.h"
#include "bsp/GeneralTIM/bsp_GeneralTIM.h"
#include "bsp/wdg/bsp_iwdg.h"
/* 函数体 --------------------------------------------------------------------*/
//static uint16_t timecount;
__IO uint16_t timer_count=0;
/**
* 函数功能: 主函数.
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
int main(void)
{
/* 初始化板载LED灯 */
LED_GPIO_Init();
/* 初始化按键 */
KEY_GPIO_Init();
Delay(1000);
/* IWDG 1s 超时溢出 */
IWDG_Config(IWDG_Prescaler_64 ,625);
LED1_OFF;
LED2_OFF;
LED3_OFF;
while (1)
{
KEY_lwdg();
}
}