(stm32f103学习总结)—独立看门狗(IWDG)


一、IWDG介绍

1.1 IWDG简介

   STM32F1芯片内部含有两个看门狗外设,一个是独立看门狗IWDG,另 一个是窗口看门狗WWDG。两个看门狗外设(独立和窗口)均可用于检测 并解决由软件错误导致的故障。独立看门狗简单理解其是就是一个12位 递减计数器,当计数器从某一个值递减到0时(如果看门狗已激活),系 统就会产生一次复位。如果在计数器递减到0之前刷新了计数器值,那么 系统就不会产生复位。这个刷新计数器值过程我们称之为“喂狗”。看 门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作

1.2 IWDG结构框图

  要更好的理解独立看门狗,就需要了解它内部的结构

 

 

 

二、IWDG配置步骤

(1)开启寄存器访问(给IWDG_KR寄存器写入0X5555)

   IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

2)设置IWDG预分频系数和重装载值

  void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);

  void IWDG_SetReload(uint16_t Reload);

Tout = (4*2^pre) / 40 * rlr

其中Tout为独立看门狗溢出时间,单位是ms。pre是预分频器系数(0-6),rlr 是重装载寄存器的值,公式内的40是独立看门狗的时钟。

(3)重载计数器值(喂狗)(给IWDG_KR寄存器写入0XAAAA)

   IWDG_ReloadCounter();

(4)开启IWDG(给IWDG_KR寄存器写入0XCCCC)(外设开启)

  IWDG_Enable();

4.编写独立看门狗控制程序

  本章所要实现的功能是:通过K_UP按键进行喂狗,喂狗的时候D2指示 灯亮,同时串口输出“喂狗”提示信息,超过喂狗时间系统重启D2指示 灯灭,同时串口输出“复位系统”提示信息,同时使用D1指示灯闪烁表 示系统运行。程序框架如下:

(1)初始化IWDG(开启IWDG,设置溢出时间)

(2)编写主函数

 

 

1 #ifndef _iwdg_H 2 #define _iwdg_H
3 
4 #include "system.h"
5 void IWDG_Init(u8 pre,u16 rlr); 6 void IWDG_FeedDog(void);  //喂狗
7 
8 #endif

 

 

 1 #include "iwdg.h"
 2 
 3 /*******************************************************************************  4 * 函 数 名 : IWDG_Init  5 * 函数功能 : IWDG初始化  6 * 输 入 : pre:预分频系数(0-6)  7  rlr:重装载值(12位范围0xfff)  8  独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40  9 * 输 出 : 无 10 *******************************************************************************/
11 void IWDG_Init(u8 pre,u16 rlr) 12 { 13     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
14     IWDG_SetPrescaler(pre);//设置预分频系数 0-6
15     IWDG_SetReload(rlr);//设置重装载值
16     IWDG_ReloadCounter();  //重装载初值
17     IWDG_Enable(); //打开独立看门狗
18     
19 } 20 
21 /******************************************************************************* 22 * 函 数 名 : IWDG_FeedDog 23 * 函数功能 : 喂狗 24 * 输 入 : 无 25 * 输 出 : 无 26 *******************************************************************************/
27 void IWDG_FeedDog(void)  //喂狗
28 { 29     IWDG_ReloadCounter();  //重装载初值
30 }

 

 

 1 #include "system.h"
 2 #include "SysTick.h"
 3 #include "led.h"
 4 #include "usart.h"
 5 #include "key.h"
 6 #include "iwdg.h"
 7 
 8 
 9 /******************************************************************************* 10 * 函 数 名 : main 11 * 函数功能 : 主函数 12 * 输 入 : 无 13 * 输 出 : 无 14 *******************************************************************************/
15 int main() 16 { 17     u8 i=0; 18         
19     SysTick_Init(72); 20     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
21  LED_Init(); 22     USART1_Init(9600); 23     
24  KEY_Init(); 25     IWDG_Init(4,800); //只要在1280ms内进行喂狗就不会复位系统
26     
27     led2=1; 28     printf("复位系统\r\n"); 29     
30     while(1) 31  { 32         if(KEY_Scan(0)==KEY_UP) 33  { 34             IWDG_FeedDog();//喂狗
35             led2=0; 36             printf("喂狗\r\n"); 37  } 38         
39         i++; 40         if(i%20==0) 41  { 42             led1=!led1; 43             
44  } 45         delay_ms(10); 46  } 47 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM