一、独立看门狗(IWDG)基本知识
1. IWDG简介
独立看门狗是由专门的低速总线进行驱动,即LSI总线(时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作。
独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
2. IWDG功能描述
在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR中的值就会重新加载到计数器,从而避免产生看门狗复位。
如果程序异常,就无法正常喂狗,从而系统复位。
3. IWDG寄存器
STM32中文参考手册中关于IWDG寄存器的介绍如下:
4. IWDG超时时间
STM32中文参考手册中关于IWDG超时时间的介绍如下:
溢出时间计算: Tout=((4*2^prer)*rlr)/40 (ms)
prer:预分频系数:0~7(只有低3位有效),由预分频寄存器(IWDG_PR)设置。
rlr:重载值:0~4095(低11位有效),由重装载寄存器(IWDG_RLR)设置。
二、独立看门狗(IWDG)程序实现
1. IWDG相关库函数
- void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
- void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置预分频系数:写PR
- void IWDG_SetReload(uint16_t Reload); //设置重装载值:写RLR
- void IWDG_ReloadCounter(void); //喂狗:写0xAAAA到KR
- void IWDG_Enable(void); //使能看门狗:写0xCCCC到KR
复制代码
2. IWDG控制程序
iwdg.h
- #ifndef __IWDG_H
- #define __IWDG_H
- #include "stm32f10x.h"
- void IWDG_Init(u8 prer,u16 rlr) ;
- void IWDG_Feed(void);
- #endif
复制代码
iwdg.c
- #include "iwdg.h"
- /*******************************************************************************
- * 函 数 名 : IWDG_Init
- * 函数功能 : IWDG初始化
- * 输 入 : pre:预分频系数(0-6)
- rlr:重装载值(12位范围0xfff)
- 独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms)
- * 输 出 : 无
- *******************************************************************************/
- void IWDG_Init(u8 prer,u16 rlr)
- {
- IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护
- IWDG_SetPrescaler(prer); //设置IWDG预分频值
- IWDG_SetReload(rlr); //设置IWDG重装载值
- IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器
- IWDG_Enable(); //使能IWDG
- }
- //喂独立看门狗
- void IWDG_Feed(void)
- {
- IWDG_ReloadCounter();//重装载初值
- }
复制代码
main.c
- #include "stm32f10x.h"
- #include "iwdg.h"
- int main()
- {
- /**
- 其它初始化省略
- **/
- IWDG_Init(IWDG_Prescaler_64,625); //独立看门狗初始化,超时时间1s
-
- while(1)
- {
- /**
- 其它程序省略
- 如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();
- **/
- IWDG_Feed(); //喂看门狗
- }
- }
复制代码
|