独立看门狗

一、看门狗是什么?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值