一、独立看门狗概述
由专用低速时钟驱动,即便主时钟故障仍然有效。独立于主程序外,适用于对时间精度要求低的场景。
二、独立看门狗库函数
三、独立看门狗操作步骤
四、具体程序
(1)iwdg.c
#include "iwdg.h"
void IWDG_Config(uint8_t prv ,uint16_t rlv)
{
//对应五步
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
IWDG_SetPrescaler( prv );
IWDG_SetReload( rlv );
IWDG_ReloadCounter();
IWDG_Enable();
}
//喂狗
void IWDG_Feed(void)
{
/* 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
当计数器的值减到0的时候会产生系统复位 */
IWDG_ReloadCounter();
}
(2)iwdg.h
#ifndef __IWDG_H__
#define __IWDG_H__
#include <stm32f10x.h>
void IWDG_Feed(void);
void IWDG_Config(uint8_t prv ,uint16_t rlv);
#endif
(3)主函数
#include "stm32f10x.h"
#include "led.h"
#include "key.h"
#include "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部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控
* 如果我们知道这部分代码的执行时间,比如是50ms,那么我们可以设置独立看门狗的
* 溢出时间是60ms,比50ms多一点,如果要被监控的程序没有跑飞正常执行的话,那么
* 执行完毕之后就会执行喂狗的程序,如果程序跑飞了那程序就会超时,到达不了喂狗的程序
* 此时就会产生系统复位。但是也不排除程序跑飞了又跑回来了,刚好喂狗了,歪打正着。
* 所以要想更精确的监控程序,可以使用窗口看门狗,窗口看门狗规定必须在规定的窗口时间内喂狗。
*/
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)
{
//空循环,什么都不做
}
}
}
五、效果
咔咔咔一直按key1,LED1不会灭。