ARM学习 看门狗

看门狗介绍

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();
    }
 
}
 

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值