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

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

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

, t* u1 A  j" Q" J' U) u独立看门狗是由专门的低速总线进行驱动,即LSI总线(时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作。
( y0 m2 Q8 q; A独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。+ ?9 o* ~+ S! K+ \! V
2. IWDG功能描述. l  `1 g0 x4 }5 G, X
在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
: _  Q( {5 [8 K# X- N无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR中的值就会重新加载到计数器,从而避免产生看门狗复位。, ]6 b& O2 _8 Q9 F" t
如果程序异常,就无法正常喂狗,从而系统复位。0 O. x, X- e# {, `: h; _) L$ M  ^7 j

# d+ ?6 }8 H% c* M3. IWDG寄存器
9 C' I5 ?- R/ d% F$ c/ D  TSTM32中文参考手册中关于IWDG寄存器的介绍如下:
; A- p# n8 x& ]; H+ f; m( d: h. O& K' a& D( T

3 K! O! H6 l2 z8 l3 I" {+ {0 d/ [! R
1Z)KM@Y`}O)D3A]JNCMR5DU.png ) o4 Q: [0 ?9 S6 X3 j

+ @* {! F( `3 P( a3 R I)]9)(%H(3@1IG~5KX9PSWE.png 8 n9 G# F( A4 q0 y: O% B8 X" v- o
5 ?  D( x/ M- L4 X' t" k7 O) s) H% m
OS6U(9@(9@2XU~_[K[GD5BN.png
4 |9 M& Y9 {8 q, @. r6 O% t, J
4 M- @+ \' y% J5 T BBNFH{3V5SKP9Z1_UGYBMZH.png 5 ?3 I- d4 g7 n2 j) x$ y& }/ H  F

/ x8 }' C0 A1 l  k# F, _4. IWDG超时时间
5 M* [9 b4 K# K* {. s; ]STM32中文参考手册中关于IWDG超时时间的介绍如下:  Y' B$ P! P: k3 o8 D* b  a

, Z' h# ]- f) t! @' @9 O _4WQ{BFL)H}EC7VIR@CRXPV.png
# k% |8 R& M3 _# @$ |/ A2 Z: F
* ~- _" U+ D  A# @0 @1 Y溢出时间计算: Tout=((4*2^prer)*rlr)/40 (ms)# O- o# ]" m( i# E6 Z
prer:预分频系数:0~7(只有低3位有效),由预分频寄存器(IWDG_PR)设置。" X& z4 ~# e) s8 e% V6 L6 P$ S+ P# a
rlr:重载值:0~4095(低11位有效),由重装载寄存器(IWDG_RLR)设置。8 @) K3 A) b" |0 v6 E5 x# E0 R& p7 c
9 c6 K+ X' |6 X5 G6 U2 s" K# p; p  e0 n
二、独立看门狗(IWDG)程序实现

$ S" i  m! ^9 J4 p4 D  u1. IWDG相关库函数

, ^- r, F4 ]/ `/ ?' _
  1. void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
    : A. E! u& h/ o! ~# v; d4 V3 G
  2. void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);        //设置预分频系数:写PR
      P! ?/ q4 G+ K* `+ L/ }' q
  3. void IWDG_SetReload(uint16_t Reload);                //设置重装载值:写RLR0 t+ P9 I8 C4 a- ?, C
  4. void IWDG_ReloadCounter(void);                        //喂狗:写0xAAAA到KR+ `% ~. e- G' \
  5. void IWDG_Enable(void);                                //使能看门狗:写0xCCCC到KR
复制代码

9 ]2 M5 z) L. W" h# ^9 b" s2. IWDG控制程序
6 o9 `! s% Z$ d* D8 u  q) Y
iwdg.h( R! e5 A' \- x& A
  1. #ifndef __IWDG_H6 `2 r( a5 O5 B0 k, ~9 F  m/ _
  2. #define __IWDG_H        
    ' g3 m+ x8 \4 S7 }0 }5 P
  3. 6 u" i7 _1 y- r% g# n- x/ D
  4. #include "stm32f10x.h"' y: e+ Q6 A4 {- w1 d9 R1 i, l. L! W

  5. 3 C9 g" R+ |- r1 ?
  6. void IWDG_Init(u8 prer,u16 rlr) ;; `: d) z8 v% E* D
  7. void IWDG_Feed(void);
    - y9 Q8 E& e& V& r% A

  8.   z2 X9 f' k# r* B" Y. T
  9. #endif
复制代码
5 P  v. P# Y# I; J" K, k- F
iwdg.c
; f4 u: ^6 l0 A
  1. #include "iwdg.h": p  h" Y& G" z: E" r# F
  2. ! A0 ?; S6 L& _' ^; K: o$ X) Q# g
  3. /*******************************************************************************5 Z9 C" E+ l7 S1 a. ?- D  l
  4. * 函 数 名         : IWDG_Init- u) L5 ^! v; C, [$ ]. q
  5. * 函数功能                   : IWDG初始化  J; c" g# Z6 J+ e* n
  6. * 输    入         : pre:预分频系数(0-6)- |5 w. ?, O; a- W$ k8 V
  7.                                          rlr:重装载值(12位范围0xfff)2 {3 f; b* n/ p+ B& _# {
  8.                                          独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms); V2 d# Y3 V/ d+ U
  9. * 输    出         : 无
    $ L% f6 }# t5 e# q, [
  10. *******************************************************************************/
    ) V( D! d$ q7 a) F
  11. void IWDG_Init(u8 prer,u16 rlr) * `: J; z8 Y3 P- O! e9 S' n3 M6 Y
  12. {        $ g. F+ r- i! z, J
  13.          IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);          //使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护- {) B! Z* I9 W' ~1 q8 s
  14.         IWDG_SetPrescaler(prer);                                          //设置IWDG预分频值( W0 f' y( `& B/ o1 |8 B% q; g
  15.         IWDG_SetReload(rlr);                                          //设置IWDG重装载值
    ; q8 K2 q  j/ ~: f% k/ t! }) _5 E
  16.         IWDG_ReloadCounter();                                  //按照IWDG重装载寄存器的值重装载IWDG计数器8 L/ g  L* ?: S
  17.         IWDG_Enable();                                  //使能IWDG" G- S! ~# Q  Y2 {- @0 m
  18. }5 t/ ^: o2 s' j; ?" O# q$ F% i

  19. 2 E9 L( v; ~# ]: M
  20. //喂独立看门狗
    , D7 Y0 h7 i' P- x' Y  i
  21. void IWDG_Feed(void)5 l$ a2 i( y; W
  22. {   
    : @+ _! A4 N$ K/ m5 `& \; U3 h
  23.          IWDG_ReloadCounter();//重装载初值                                                                           * _9 G% x, G0 ~6 N. r) a
  24. }
复制代码

  D* ], x/ O  gmain.c
' I7 p7 G% t+ x7 E% \, t
  1. #include "stm32f10x.h": v6 o4 W" J, z
  2. . I" }' L* J  B7 d! R. Y. C/ \! f
  3. #include "iwdg.h"7 V5 Z$ z  E6 C1 y2 J
  4. - F9 O2 v( |7 t: A- y% S
  5. int main()
    3 y1 W7 X4 E. J
  6. {
    ; v* n* K0 b: c+ w" l$ _
  7.         /**
    0 ]8 h8 C6 T) I- q" N5 W
  8.         其它初始化省略
    9 Z7 w% z6 Z- D' I7 D3 A$ _
  9.         **/+ p4 C% j) A/ ~# G$ t6 D
  10.         IWDG_Init(IWDG_Prescaler_64,625);                //独立看门狗初始化,超时时间1s
    * J9 V6 F  ]$ X
  11.         
    ! ?& {5 F% ~/ K' a2 w6 [/ l
  12.         while(1); M, g8 Q: m2 P# Z. a
  13.         {' u; a1 Z) B% l2 b- C% a% p5 a  I
  14.                 /**8 N0 b( b: c- |
  15.                 其它程序省略
    5 T0 v5 L. |0 W2 X
  16.                 如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();# n, d% w* P! J5 R  @
  17.                 **/6 \, I+ ~) D: x- @- ~" P
  18.                 IWDG_Feed();        //喂看门狗
    + N, A& g7 A0 d. v- q- h
  19.         }
    + G5 D3 d4 D/ y8 m
  20. }" [- e* a* F4 T1 u; ^! a. a
复制代码
7 @: N3 ~  Z! u- I

) p* F) Q8 c$ ~, V: @$ H1 s, r* T, \7 l% S

" K7 q2 t5 d! q9 @0 b, A2 K
1 z+ f/ H1 U; @  r
赞 收藏 1 评论0 发布时间:2022-5-4 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版