一、独立看门狗(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
) o4 Q: [0 ?9 S6 X3 j
+ @* {! F( `3 P( a3 R
8 n9 G# F( A4 q0 y: O% B8 X" v- o
5 ? D( x/ M- L4 X' t" k7 O) s) H% m
4 |9 M& Y9 {8 q, @. r6 O% t, J
4 M- @+ \' y% J5 T
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
# 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 ]/ `/ ?' _- void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
: A. E! u& h/ o! ~# v; d4 V3 G - void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置预分频系数:写PR
P! ?/ q4 G+ K* `+ L/ }' q - void IWDG_SetReload(uint16_t Reload); //设置重装载值:写RLR0 t+ P9 I8 C4 a- ?, C
- void IWDG_ReloadCounter(void); //喂狗:写0xAAAA到KR+ `% ~. e- G' \
- 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
- #ifndef __IWDG_H6 `2 r( a5 O5 B0 k, ~9 F m/ _
- #define __IWDG_H
' g3 m+ x8 \4 S7 }0 }5 P - 6 u" i7 _1 y- r% g# n- x/ D
- #include "stm32f10x.h"' y: e+ Q6 A4 {- w1 d9 R1 i, l. L! W
3 C9 g" R+ |- r1 ?- void IWDG_Init(u8 prer,u16 rlr) ;; `: d) z8 v% E* D
- void IWDG_Feed(void);
- y9 Q8 E& e& V& r% A
z2 X9 f' k# r* B" Y. T- #endif
复制代码 5 P v. P# Y# I; J" K, k- F
iwdg.c; f4 u: ^6 l0 A
- #include "iwdg.h": p h" Y& G" z: E" r# F
- ! A0 ?; S6 L& _' ^; K: o$ X) Q# g
- /*******************************************************************************5 Z9 C" E+ l7 S1 a. ?- D l
- * 函 数 名 : IWDG_Init- u) L5 ^! v; C, [$ ]. q
- * 函数功能 : IWDG初始化 J; c" g# Z6 J+ e* n
- * 输 入 : pre:预分频系数(0-6)- |5 w. ?, O; a- W$ k8 V
- rlr:重装载值(12位范围0xfff)2 {3 f; b* n/ p+ B& _# {
- 独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms); V2 d# Y3 V/ d+ U
- * 输 出 : 无
$ L% f6 }# t5 e# q, [ - *******************************************************************************/
) V( D! d$ q7 a) F - void IWDG_Init(u8 prer,u16 rlr) * `: J; z8 Y3 P- O! e9 S' n3 M6 Y
- { $ g. F+ r- i! z, J
- IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护- {) B! Z* I9 W' ~1 q8 s
- IWDG_SetPrescaler(prer); //设置IWDG预分频值( W0 f' y( `& B/ o1 |8 B% q; g
- IWDG_SetReload(rlr); //设置IWDG重装载值
; q8 K2 q j/ ~: f% k/ t! }) _5 E - IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器8 L/ g L* ?: S
- IWDG_Enable(); //使能IWDG" G- S! ~# Q Y2 {- @0 m
- }5 t/ ^: o2 s' j; ?" O# q$ F% i
2 E9 L( v; ~# ]: M- //喂独立看门狗
, D7 Y0 h7 i' P- x' Y i - void IWDG_Feed(void)5 l$ a2 i( y; W
- {
: @+ _! A4 N$ K/ m5 `& \; U3 h - IWDG_ReloadCounter();//重装载初值 * _9 G% x, G0 ~6 N. r) a
- }
复制代码
D* ], x/ O gmain.c' I7 p7 G% t+ x7 E% \, t
- #include "stm32f10x.h": v6 o4 W" J, z
- . I" }' L* J B7 d! R. Y. C/ \! f
- #include "iwdg.h"7 V5 Z$ z E6 C1 y2 J
- - F9 O2 v( |7 t: A- y% S
- int main()
3 y1 W7 X4 E. J - {
; v* n* K0 b: c+ w" l$ _ - /**
0 ]8 h8 C6 T) I- q" N5 W - 其它初始化省略
9 Z7 w% z6 Z- D' I7 D3 A$ _ - **/+ p4 C% j) A/ ~# G$ t6 D
- IWDG_Init(IWDG_Prescaler_64,625); //独立看门狗初始化,超时时间1s
* J9 V6 F ]$ X -
! ?& {5 F% ~/ K' a2 w6 [/ l - while(1); M, g8 Q: m2 P# Z. a
- {' u; a1 Z) B% l2 b- C% a% p5 a I
- /**8 N0 b( b: c- |
- 其它程序省略
5 T0 v5 L. |0 W2 X - 如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();# n, d% w* P! J5 R @
- **/6 \, I+ ~) D: x- @- ~" P
- IWDG_Feed(); //喂看门狗
+ N, A& g7 A0 d. v- q- h - }
+ G5 D3 d4 D/ y8 m - }" [- 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 |