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

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

[复制链接]
STMCU小助手 发布时间:2022-5-4 22:00
一、独立看门狗(IWDG)基本知识
2 m" m! @3 _( \1. IWDG简介
2 V5 C7 T& x: _
独立看门狗是由专门的低速总线进行驱动,即LSI总线(时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作。& k! N' o& ?) U
独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。! H% @+ q! Q* C; j- C  I) D. @
2. IWDG功能描述
( @/ {! \. U: C6 v$ @- Z在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。) q7 k: c9 J  _
无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR中的值就会重新加载到计数器,从而避免产生看门狗复位。
0 D! U; g% L% ~& q& d0 x0 B如果程序异常,就无法正常喂狗,从而系统复位。
' ^8 i9 R; J1 u; A* D1 ~& k
& [- }( g0 W# q& _8 ^. L3. IWDG寄存器
- m* ?2 W& j6 K% B+ i7 {STM32中文参考手册中关于IWDG寄存器的介绍如下:
3 m) F, A3 ?' M: C2 e
) B2 L0 i1 k! i; u7 c6 J, w
) `8 D+ X, ?- U7 N. l+ g+ G6 P1 O
; F( |( o$ W$ ^; z/ y 1Z)KM@Y`}O)D3A]JNCMR5DU.png 0 V! y; x, D1 z6 J+ |0 z, ]3 ]$ ?, V

1 }, U- d1 v: }, Q- o9 U I)]9)(%H(3@1IG~5KX9PSWE.png
  s* b4 O" j- `# S8 |  M, K! a& @( |  v* z% {
OS6U(9@(9@2XU~_[K[GD5BN.png
/ B; `2 Q1 |" c+ f, W1 h; ?  \9 Y
BBNFH{3V5SKP9Z1_UGYBMZH.png
9 w0 _4 e1 q8 P/ f5 j" A3 B% f& I6 W) ~6 e: P
4. IWDG超时时间
" |& ^' q7 u, z8 mSTM32中文参考手册中关于IWDG超时时间的介绍如下:
4 L) p! m1 U/ Y
& ^* v) K1 n' C& ^ _4WQ{BFL)H}EC7VIR@CRXPV.png
; B# L  X5 ?( i% ^
  H& c; W* p6 ?4 U溢出时间计算: Tout=((4*2^prer)*rlr)/40 (ms)4 V! f( a+ m% @6 t. k2 i1 ?
prer:预分频系数:0~7(只有低3位有效),由预分频寄存器(IWDG_PR)设置。& Y/ U) H1 @3 B1 C' v% L# Z" P
rlr:重载值:0~4095(低11位有效),由重装载寄存器(IWDG_RLR)设置。, z8 u# B) C% Y
( T/ t( @! d0 z" v& D
二、独立看门狗(IWDG)程序实现

8 N( Z1 z& s$ i/ E0 H1. IWDG相关库函数

" m& L4 I- n8 X9 A* j
  1. void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能: l7 q, l2 P& r6 b' [$ i
  2. void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);        //设置预分频系数:写PR  A, R% y' L+ m' g2 k
  3. void IWDG_SetReload(uint16_t Reload);                //设置重装载值:写RLR) ?& ]0 J5 r" c. ]) a3 u' Y9 ~
  4. void IWDG_ReloadCounter(void);                        //喂狗:写0xAAAA到KR
    . G+ @) _" C/ R5 J+ ~
  5. void IWDG_Enable(void);                                //使能看门狗:写0xCCCC到KR
复制代码
; u, O8 E( p+ b- F/ R' n( X8 Q+ y
2. IWDG控制程序
. }1 T* F0 F: n! N9 c
iwdg.h
8 \8 A8 ]0 ]) g* Y7 x$ }
  1. #ifndef __IWDG_H, P% C- f" S( J
  2. #define __IWDG_H        2 Y- `8 l( Y5 p: T8 K0 Y* p% ~
  3. 0 A9 R" ^9 T4 n  B9 s# A
  4. #include "stm32f10x.h"3 s7 K" f- M5 q) u% Y
  5. - C$ u& \1 E7 T7 s/ l
  6. void IWDG_Init(u8 prer,u16 rlr) ;5 @4 E  x3 m6 R( r
  7. void IWDG_Feed(void);4 u% Y4 r& z5 c

  8. 1 y" X- r; a( k/ x# W2 X# n
  9. #endif
复制代码

( V. O7 _) g' {0 ^4 L9 viwdg.c
) J; d+ F" o4 C5 m! y
  1. #include "iwdg.h"
    4 A# r8 f0 b$ Q/ O5 K

  2. ; A' }$ o5 S) T# {  o) s2 H8 w! B
  3. /*******************************************************************************
    3 F8 Y, R0 b: C4 }
  4. * 函 数 名         : IWDG_Init" u* h, w$ k, d4 g
  5. * 函数功能                   : IWDG初始化
    3 D! H  L: F. R
  6. * 输    入         : pre:预分频系数(0-6)
      J2 G! S0 z8 L; t/ N9 ^
  7.                                          rlr:重装载值(12位范围0xfff)
    2 |$ d4 _" K* y+ l: K. V. `/ Y) z, u! M
  8.                                          独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms)
    1 g/ |! I, d/ o1 g
  9. * 输    出         : 无
    6 i3 m$ w- j% F, X2 f. a3 ?7 _
  10. *******************************************************************************/+ [. V$ b4 p' A
  11. void IWDG_Init(u8 prer,u16 rlr) $ \& w( U; T1 \
  12. {        
    4 @. I* W' p% l- f) T$ s) @: r: U0 u2 F
  13.          IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);          //使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护+ V) N" T6 C8 O
  14.         IWDG_SetPrescaler(prer);                                          //设置IWDG预分频值, P( z( J3 @# l7 |% i
  15.         IWDG_SetReload(rlr);                                          //设置IWDG重装载值
    & ^- M; E# R- ~7 s4 E
  16.         IWDG_ReloadCounter();                                  //按照IWDG重装载寄存器的值重装载IWDG计数器4 h1 D+ E- F+ c1 d  V+ _- }
  17.         IWDG_Enable();                                  //使能IWDG' f2 K, l1 d  \2 w  Y* N
  18. }8 o  D; W: j5 f- c
  19. * I/ G/ A. b! a; V+ U
  20. //喂独立看门狗* f$ h7 [) M1 G! G2 Q7 w5 k
  21. void IWDG_Feed(void)- C, T# f' o! d
  22. {   
    / A  w# M4 a. F. m: n
  23.          IWDG_ReloadCounter();//重装载初值                                                                           
    - ]8 ]9 b' y2 x, R
  24. }
复制代码

$ r. b3 |4 W1 n7 z( Bmain.c
, Z0 F0 v" I3 a1 K
  1. #include "stm32f10x.h"- ~# U. |- Q* A
  2. 8 G! o6 s8 k) h% h4 R6 ]/ G& Z
  3. #include "iwdg.h"
    + f: \  i5 ~: v( c. A) e

  4. % E" I; D4 Q; l! L5 Y/ l. l+ M5 c- }. v
  5. int main()
    ; }2 M& F' T0 T- Q
  6. {# d, {' d- \* U- x7 x$ v
  7.         /**$ @2 j& f# {6 ]/ |
  8.         其它初始化省略% j" ]% ~. O4 O+ q! I' l, y* b
  9.         **/
    9 H6 n, _1 Z# b0 s, R
  10.         IWDG_Init(IWDG_Prescaler_64,625);                //独立看门狗初始化,超时时间1s0 K( Z- Q( V% X0 E8 W) _
  11.         
    6 U5 L: y  B5 f0 V  R) I& I( v/ C6 F
  12.         while(1)6 k; m5 q1 d+ Y  h( P
  13.         {
    2 P7 k1 M  H/ p7 C
  14.                 /**
    % `: @2 a5 m1 {- f2 w
  15.                 其它程序省略7 G7 j( `4 x  G
  16.                 如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();
      n/ Q' {" T2 y/ U' }" a4 b2 [
  17.                 **/
    . e3 l9 w, t9 v
  18.                 IWDG_Feed();        //喂看门狗
    ) M: O9 C9 ^' w8 |4 v* `  R
  19.         }6 O1 @3 U9 m0 d! S/ ?
  20. }( E- l) i5 R# z& N3 \/ }! a8 k) @* ^
复制代码

& c: M1 V  n; Z/ B4 a' t+ |5 }# `6 u) ^2 v' J
  S+ c. R9 Q4 t& S

2 A1 X, t" d0 {: j* `( N$ q  R7 T3 a+ I7 Z( V
收藏 1 评论0 发布时间:2022-5-4 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版