一、看门狗是什么?
STM32有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬,本章我们主要分析独立看门狗的功能框图和它的应用。 独立看门狗用通俗一点的话来解释就是一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。 如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电, 在停止模式和待机模式下仍能工作。
二、实验代码
1.main.c
#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"
#include "bsp/key/bsp_key.h"
#include "bsp/wdg/bsp_iwdg.h"
static void Delay(uint32_t time);
int main(void)
{
/* 初始化板载LED灯 */
LED_GPIO_Init();
/* 初始化按键 */
KEY_GPIO_Init();
Delay(1000);
/* IWDG 1s 超时溢出 */
IWDG_Config(IWDG_Prescaler_64 ,625);
LED1_ON;
while(1)
{
/* 这里添加需要被监控的代码,如果有就去掉按键模拟喂狗,把按键扫描程序去掉 */
/*------------------------------------------------------------------------*/
if( KEY1_StateRead() == KEY_DOWN )
{
/*喂狗,如果不喂狗,系统则会复位,LD1则会灭一次,如果在1s
时间内准时喂狗的话,则LED1会常亮 */
IWDG_Feed();
}
}
/*------------------------------------------------------------------------*/
}
static void Delay(uint32_t time)
{
uint32_t i,j;
for(i=0;i<time;++i)
{
for(j=0;j<10000;++j)
{
//空循环,什么都不做
}
}
}
2.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();
}
3、idwg.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