你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103:独立看门狗(IWDG)用法详解

[复制链接]
STMCU小助手 发布时间:2022-5-4 22:00
一、独立看门狗(IWDG)基本知识
1. IWDG简介

独立看门狗是由专门的低速总线进行驱动,即LSI总线(时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作。
独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
2. IWDG功能描述
在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR中的值就会重新加载到计数器,从而避免产生看门狗复位。
如果程序异常,就无法正常喂狗,从而系统复位。

3. IWDG寄存器
STM32中文参考手册中关于IWDG寄存器的介绍如下:



1Z)KM@Y`}O)D3A]JNCMR5DU.png

I)]9)(%H(3@1IG~5KX9PSWE.png

OS6U(9@(9@2XU~_[K[GD5BN.png

BBNFH{3V5SKP9Z1_UGYBMZH.png

4. IWDG超时时间
STM32中文参考手册中关于IWDG超时时间的介绍如下:

_4WQ{BFL)H}EC7VIR@CRXPV.png

溢出时间计算: Tout=((4*2^prer)*rlr)/40 (ms)
prer:预分频系数:0~7(只有低3位有效),由预分频寄存器(IWDG_PR)设置。
rlr:重载值:0~4095(低11位有效),由重装载寄存器(IWDG_RLR)设置。

二、独立看门狗(IWDG)程序实现

1. IWDG相关库函数

  1. void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
  2. void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);        //设置预分频系数:写PR
  3. void IWDG_SetReload(uint16_t Reload);                //设置重装载值:写RLR
  4. void IWDG_ReloadCounter(void);                        //喂狗:写0xAAAA到KR
  5. void IWDG_Enable(void);                                //使能看门狗:写0xCCCC到KR
复制代码

2. IWDG控制程序

iwdg.h
  1. #ifndef __IWDG_H
  2. #define __IWDG_H        

  3. #include "stm32f10x.h"

  4. void IWDG_Init(u8 prer,u16 rlr) ;
  5. void IWDG_Feed(void);

  6. #endif
复制代码

iwdg.c

  1. #include "iwdg.h"

  2. /*******************************************************************************
  3. * 函 数 名         : IWDG_Init
  4. * 函数功能                   : IWDG初始化
  5. * 输    入         : pre:预分频系数(0-6)
  6.                                          rlr:重装载值(12位范围0xfff)
  7.                                          独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms)
  8. * 输    出         : 无
  9. *******************************************************************************/
  10. void IWDG_Init(u8 prer,u16 rlr)
  11. {        
  12.          IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);          //使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护
  13.         IWDG_SetPrescaler(prer);                                          //设置IWDG预分频值
  14.         IWDG_SetReload(rlr);                                          //设置IWDG重装载值
  15.         IWDG_ReloadCounter();                                  //按照IWDG重装载寄存器的值重装载IWDG计数器
  16.         IWDG_Enable();                                  //使能IWDG
  17. }

  18. //喂独立看门狗
  19. void IWDG_Feed(void)
  20. {   
  21.          IWDG_ReloadCounter();//重装载初值                                                                           
  22. }
复制代码

main.c

  1. #include "stm32f10x.h"

  2. #include "iwdg.h"

  3. int main()
  4. {
  5.         /**
  6.         其它初始化省略
  7.         **/
  8.         IWDG_Init(IWDG_Prescaler_64,625);                //独立看门狗初始化,超时时间1s
  9.         
  10.         while(1)
  11.         {
  12.                 /**
  13.                 其它程序省略
  14.                 如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();
  15.                 **/
  16.                 IWDG_Feed();        //喂看门狗
  17.         }
  18. }
复制代码





收藏 1 评论0 发布时间:2022-5-4 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版