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

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

[复制链接]
STMCU小助手 发布时间:2022-5-4 22:00
一、独立看门狗(IWDG)基本知识+ y) K5 g+ J& N# @; E2 A
1. IWDG简介

# s* \# b+ g, b- W7 n. U% h6 r独立看门狗是由专门的低速总线进行驱动,即LSI总线(时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作。
( m# \0 {. n, z) X+ f* W1 S独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
2 y) h2 }9 x( f+ x1 }2. IWDG功能描述3 e# h; J& B4 D
在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。" R7 I2 S/ C& ]2 x! e3 L# v& Z& d% ]: X
无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR中的值就会重新加载到计数器,从而避免产生看门狗复位。! M, c+ p, {9 L! ]7 O6 r
如果程序异常,就无法正常喂狗,从而系统复位。7 u: `  b! g2 i( i4 ?9 o8 s

* h$ y" O5 C% \* O3. IWDG寄存器& B' w) i8 a. l9 o- j
STM32中文参考手册中关于IWDG寄存器的介绍如下:
. _! D  X6 |- Y" h0 B- C, R8 Z  p
9 c0 ~7 k, H3 v  |" P% C

9 {( N( Z* x( A3 R  [ 1Z)KM@Y`}O)D3A]JNCMR5DU.png ( B4 z0 A$ a5 O& F- Q6 m
6 h' U; U# l( u- P
I)]9)(%H(3@1IG~5KX9PSWE.png
7 }" ~9 D& y+ f
' ?* F& L* n7 J0 J, W' p OS6U(9@(9@2XU~_[K[GD5BN.png , `* H" p4 n5 k
8 @( \5 T9 Z3 e9 |7 ^" B
BBNFH{3V5SKP9Z1_UGYBMZH.png
8 ?) o: }+ P) p- r! g, {; x
  q/ ~+ ]4 m0 Y% E. U4. IWDG超时时间
2 N9 p% j+ R3 |, s9 uSTM32中文参考手册中关于IWDG超时时间的介绍如下:4 U6 E* z$ Q+ K4 F7 y- M9 {

0 w. A  l# h) ^# N. T7 {4 {' ^4 u. } _4WQ{BFL)H}EC7VIR@CRXPV.png ; c/ B, {+ {3 H- A" h
& P7 y+ S1 B: y2 I1 X+ E
溢出时间计算: Tout=((4*2^prer)*rlr)/40 (ms)
7 l0 B: _) O, b% T% y* Pprer:预分频系数:0~7(只有低3位有效),由预分频寄存器(IWDG_PR)设置。
- ]' T  A' P+ k: @% krlr:重载值:0~4095(低11位有效),由重装载寄存器(IWDG_RLR)设置。
, \# A6 `5 D1 R) `; i/ ?
: K% L2 i7 J4 B3 L2 K# E二、独立看门狗(IWDG)程序实现

. V" R5 W9 E5 V1. IWDG相关库函数

, ]8 }% x$ K3 z9 R) I' a0 i
  1. void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
    ; T" Y" G3 s! i4 w  @
  2. void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);        //设置预分频系数:写PR+ d- S" A# ?3 K6 K
  3. void IWDG_SetReload(uint16_t Reload);                //设置重装载值:写RLR/ h  P( S9 A! {& n: Q, K& V
  4. void IWDG_ReloadCounter(void);                        //喂狗:写0xAAAA到KR
    4 F3 A5 O% a4 ^5 z. Z3 |
  5. void IWDG_Enable(void);                                //使能看门狗:写0xCCCC到KR
复制代码

. A" E7 }5 B( {7 a1 p% J2. IWDG控制程序

. s# W5 z3 U; hiwdg.h
0 T3 `% \6 R# y/ e% \' e$ _/ P" z; C
  1. #ifndef __IWDG_H: B$ U$ }* B) _" @
  2. #define __IWDG_H        1 G/ }* d9 y5 |5 A" \* a
  3. 0 R; U8 o% b( B, m- a5 d
  4. #include "stm32f10x.h"  @# v- b$ r$ a& \( C6 V
  5. 6 k$ ~! R% d5 O+ ^
  6. void IWDG_Init(u8 prer,u16 rlr) ;
    , `1 _/ K3 T! y: g9 S/ e
  7. void IWDG_Feed(void);/ {/ d4 R$ o0 ~8 u7 m& `' f

  8. ( t" i# s9 D# d6 N5 }0 R# b
  9. #endif
复制代码

4 |6 @5 a6 k9 v4 biwdg.c
6 G, _% L4 c7 y& y
  1. #include "iwdg.h"8 t7 g# F' D. z3 E6 t6 F2 w

  2. " f# l2 ?1 R: W+ k( I0 B
  3. /*******************************************************************************5 Y1 I* P5 }: L
  4. * 函 数 名         : IWDG_Init
    ( l8 i" w1 Y2 o4 B( E, g
  5. * 函数功能                   : IWDG初始化
    ( m1 z, K0 B5 r5 F4 n0 {
  6. * 输    入         : pre:预分频系数(0-6)
      H! O  ?( Y0 ]& a7 l0 G" D1 o
  7.                                          rlr:重装载值(12位范围0xfff)* P) ?; J; C5 c4 q3 _) M8 j% t) p
  8.                                          独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms)
    ( q8 N5 u0 x. c2 V
  9. * 输    出         : 无4 t# n& t, P- U  E. A
  10. *******************************************************************************/
    : t5 ^2 S( J& [! Y/ z
  11. void IWDG_Init(u8 prer,u16 rlr) 6 l. Z; x* `9 n3 L
  12. {        $ C: B: f5 u) p( U6 x% y" [
  13.          IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);          //使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护
    % a# w/ m- [" b
  14.         IWDG_SetPrescaler(prer);                                          //设置IWDG预分频值3 l, K! B& V: {. a. C
  15.         IWDG_SetReload(rlr);                                          //设置IWDG重装载值
    - n( ?2 ~3 N/ G4 p( H
  16.         IWDG_ReloadCounter();                                  //按照IWDG重装载寄存器的值重装载IWDG计数器7 R( U( R6 d4 d: H* R" \
  17.         IWDG_Enable();                                  //使能IWDG2 L. y% S4 W& w' t5 `9 R
  18. }
    ' q* x/ n+ c( n# ^( ]. [
  19. 3 l9 }2 z/ N+ ^5 P" l- |3 o
  20. //喂独立看门狗) {. c( f# u, ^  G; P+ V
  21. void IWDG_Feed(void)6 g) s% ~# }2 _8 Z2 y. c4 [
  22. {   
    8 j) g3 e" A; j* N. N: g' \
  23.          IWDG_ReloadCounter();//重装载初值                                                                           
    & M; D: Q8 j- B& o3 h" s0 k
  24. }
复制代码

2 J9 D( G+ _- k3 L3 @; U  Ymain.c

" M8 }9 s" Y% c/ P' C2 c# f$ x. W/ `/ J
  1. #include "stm32f10x.h"
    3 J# X: l* \. l

  2. 5 P0 ^9 \* u6 A' W; C1 ~( u
  3. #include "iwdg.h"
    " J8 `% |/ [$ l$ E2 j, F" s9 `
  4. & q3 G2 K5 H# Q0 L1 ?; {% j& Z$ X
  5. int main()' }5 J5 b( N7 @$ L8 W6 }7 i. |
  6. {
    ; q7 N2 i1 }0 j  q" B. ?+ L" G
  7.         /**
    5 e4 o& s2 _7 V( e4 X' T
  8.         其它初始化省略6 ^# I. Q5 X: K7 c7 r# t3 n3 h
  9.         **/9 G( G1 \0 ?2 j- s6 n5 Q
  10.         IWDG_Init(IWDG_Prescaler_64,625);                //独立看门狗初始化,超时时间1s
    ) p) \# ?7 ?* U' f% M
  11.         
    / g7 A( I8 b/ |. g: m
  12.         while(1)
    3 C: ^$ r6 y3 Z/ M
  13.         {
    # p) ]7 ]' |3 o9 q% x* K6 o0 Y4 n
  14.                 /**, m* b& e  \% K* R3 M
  15.                 其它程序省略6 t/ w$ K% u( ]. E, X2 b0 z
  16.                 如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();7 r. _9 t8 Z; _1 ]8 k
  17.                 **/, |, H( q5 T8 B" Z1 ]. @
  18.                 IWDG_Feed();        //喂看门狗
    : i0 d, X  X- }  x2 u' w, E
  19.         }! @0 r! r7 `, ?6 v9 G( Z
  20. }# X6 t: w! s% o8 C) Y
复制代码

, D7 A4 w- B  G/ W5 H: Y: Z% w+ g9 p4 Q! D# S

- F, w" d. ~4 v% o4 a% x+ O8 d$ v' J& _

4 J0 A" P( y# I0 S, s
赞 收藏 1 评论0 发布时间:2022-5-4 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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