独立看门狗(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 }

猜你喜欢

转载自www.cnblogs.com/zhj868/p/12661236.html