一、IWDG简介
' R+ G. E# I1 ~8 O' ^4 n, e独立看门狗(Independent Watchdog, IWDG),什么是看门狗?字面意思——看门的,有陌生人来,就会叫。实际在嵌入式领域里,看门狗也是这种作用,当软件程序发生故障或者程序跑飞时,看门狗会产生复位信号,复位系统。' X' [5 k, Z$ c8 A" w0 M6 u
: y+ I# g6 k) k* ^" P# \
二、STM32的IWDG
2 H% [' M" N/ d: e% U, H2.1 STM32的IWDG简介
% @; B/ P; v$ eSTM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。2 q: O: v9 m) Q
! P0 J2 |/ }6 U. B/ q4 M2 I* w
IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。
% `. x( n$ S5 C, U$ A
- W4 g9 X9 F% X4 ]. r• 自由运行的12位递减计数器5 P; j ^ N! r3 @, u$ u! t
• 时钟由独立的RC振荡器提供(可在停止和待机模式下工作) N# N6 s) |8 T1 G- h
• 看门狗被激活后,则在计数器计数至0x000时产生复位8 ^9 z. p& J( s& D5 ?/ R# E4 \
/ h& \7 G; p* k# K一旦使能IWDG,就无法关闭。只有等到复位之后,才能将IWDG关闭。
, z! [ G# ?6 N3 x( O7 f' Z _
: Q$ T9 g# o d2.2 喂狗
6 V. f$ D& Y3 z/ J0 n9 k/ K通过上面的简介可以知道,独立看门狗实际就是一个12位的递减计数器,当计数器的值递减到0的时候,就会产生复位。但是,如果我们在计数值递减到0之前,重新给计数器赋值,那么就不会再产生复位。这个操作叫做喂狗。
* I- H( n0 @$ R- R1 ~0 O
6 V* `4 b7 ~; n( x: \% V. q( g+ j3 d1 y* A& Y6 K# G
2.3 IWDG框图$ M/ U0 m- v: C' H6 Z, [; Z
( h7 }- T6 h# X' {
" X! t5 l) k. g
7 o4 ?+ k/ d2 s; K) `, }IWDG框图
N8 x; I3 w+ v9 H4 h6 K
+ h& X5 B9 E* g) w X, y! @IWDG的框图很好理解,IWDG由一个由独立的RC振荡器提供时钟。经过一个8位的预分频器对时钟信号进行分频。12位递减计数器按照设置好的初始值和输入时钟递减。当递减计数器递减到0时,产生独立看门狗复位。
& Y# H$ S0 o. L+ a/ C
3 u2 z$ K, L) p9 {在产生复位之前,如果将重装载寄存器传递给递减计数器,那么就会重新开始递减,这叫做喂狗。
( ]) R( h8 c$ H. ~5 I: l' ^
@' W7 d( H, x0 z5 ?, T R键寄存器也叫做关键字寄存器,往该寄存器写入不同的值,有不同的作用
* x) G' n3 t) E
8 z; T2 h7 w0 o% R8 S; Z• 写入0x5555——表示允许访问IWDG_PR和IWDG_RLR寄存器3 j6 ?7 i4 b8 w
• 写入0xAAAA——将重载寄存器的值传递到递减计数器,也就是喂狗
; w7 W! F# X1 l2 C; `6 M# t7 q• 写入0xCCCC——启动独立看门狗功能( i# U9 Y! I% [( t
$ K2 T9 x1 w4 J4 u4 O ^中文参考手册中给出了一个时间表6 q; h: d0 M( g; I- F% M' b4 @
7 v+ b3 l7 t d8 J: z+ e
1 w% W8 o" f9 R, s, J# c- N$ zIWDG的溢出时间表
" P8 o( P/ y3 |3 ]& G8 Z# F' S2 U( l8 L
0 R! `% d/ N: l+ x4 A8 C时间的计算方法是,时间 = 重装载寄存器值 / (输入时钟频率 / 4 * 2^预分频系数)% y1 B4 d8 f7 z
/ _3 P! \, I) G为什么是4 * 2^预分频系数,可以看一下中文参考手册对于预分频寄存器的描述
( B2 u7 k# v ~6 k Z P. P, A- X
4 X' B6 q1 m& z& o; b7 B
- |. _1 U9 P' L8 h* ]# e预分频寄存器描述
5 v/ z: {5 r: @
( a+ o+ h% B8 a" e* V3 z o8 O' j' n
# e- U o' {5 c7 V三、IWDG配置步骤: Y T& w9 v- V
• 开启寄存器访问(允许访问IWDG_PR和IWDG_RLR寄存器); D* ]4 s( { c
• 设置IWDG预分频系数和重装载值$ C0 l; d6 {* y( _( ~4 ^( r. x' I
• 将重装载寄存器的值传递到递减计数器(喂狗)9 q5 i' ?1 l( k3 K
• 开启IWDG
+ U6 \2 d& Z& t" x
) U1 G$ m4 k) a+ p& C: S, V/ ?; b+ ~4 h" H! {; G _, f
四、IWDG配置程序
, V6 Q8 {2 X; p" `1 t/ N4 V44.1 IWDG初始化程序0 l9 r4 S1 H; H" u# x
- /*/ n+ y* T$ M2 g3 j! G$ \& Q' Z
- *==============================================================================
( [. ?4 e' i8 P- t0 |8 b: N - *函数名称:IWDG_Init6 H4 [4 h3 l0 j6 v7 R
- *函数功能:初始化IWDG) x4 e1 E; x& @3 ^6 o
- *输入参数:pre:预分频系数(0~6);rlr:重装载值(0~0xFFF)' b; U; C. M% `; x
- *返回值:无
, ]/ Z) I7 p W3 ~& L: a- e - *备 注:独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40(ms)6 b2 K7 }: a" S( I7 W7 i9 G
- *==============================================================================
, J6 R& Q% `2 t, z - */
" l6 T) G" ^1 v - void IWDG_Init (u8 pre,u16 rlr)& A$ {+ D) Z% {1 `- E+ P
- {' {, l+ i* B4 l+ h1 I: T
- IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 取消寄存器写保护
{' L8 b6 \$ A& D - IWDG_SetPrescaler(pre); // 设置预分频系数 0-62 v9 \4 r7 L( g. f
- IWDG_SetReload(rlr); // 设置重装载值
3 `2 \$ p) M" S0 W5 J: r - IWDG_ReloadCounter(); // 重装载初值/ q) N% a! `3 S* o1 k1 @
- IWDG_Enable(); // 打开独立看门狗
9 Z; Y5 f3 L7 d- A' _3 T - }
复制代码
( H. ]' D; Q9 b1 D, o5 u) x9 M. C5 n. J2 }/ z! J
4.2 喂狗* t% |: A4 P( z
- /*
' _; z. {4 p4 y7 \) z3 v$ }+ J2 z - *==============================================================================' ^# U: {& C+ K2 ^% I' n
- *函数名称:IWDG_FeedDog# c7 E8 @0 S$ m. g [# C
- *函数功能:喂狗
% C" [, _: x# Z1 ~1 X- v - *输入参数:无1 b( l! a4 T9 h5 S/ f$ Z1 i
- *返回值:无
' ?9 f6 O! A; }2 p - *备 注:无
3 I7 ^( G; j0 Q7 i6 b0 O- l - *==============================================================================0 ^7 W2 A$ `5 c5 f6 |
- */: z7 Q/ ~/ c! M0 q# F Y1 I
- void IWDG_FeedDog (void)
0 O7 v) K& Z. F. B# R2 y( E - {
5 I* v* ~8 U1 S; W - IWDG_ReloadCounter(); // 重装载初值
. p4 l6 H. @. m - }
复制代码 4 Z' p7 b0 o' Z4 Y% B" C
五、应用实例) {" r, o' f( h. @3 A% ?$ A
初始化IWDG,配置2s内不及时喂狗就会复位。通过按下按键WK UP喂狗。串口打印复位和喂狗信息。IWDG初始化程序如下
9 s2 i" c$ _! t. B* D: q6 w- IWDG_Init(4,1250); // 看门狗初始化,2s不及时喂狗,复位
复制代码
, d5 F2 O; [) T- @2 R1 ~8 ]( x8 ymain函数如下9 l+ ]) ?# k& C8 f2 q0 z2 N
- u8 gKeyValue = 0; // 记录按键键值变量
+ p. u6 ?6 H9 e7 H- k7 c7 a) u
+ ]3 a/ b$ y. @9 Y1 u7 v, o7 ]- int main(void)! _9 [& I" N* u m
- {
8 _/ b2 O& ^, R- e! j - Med_Mcu_Iint(); // 系统初始化
4 p* L7 \! V( L# g% @ - printf("复位系统\r\n");
5 F3 F# K- S6 L& y2 H -
2 X2 P/ h" i' N7 B9 t - while(1)
' x }" R2 ?0 Y' M - {
/ X8 @5 l8 L8 T; @ h - gKeyValue = Med_KeyScan(); // 获取按键键值
( `$ ?0 b |0 e9 d; u! p -
7 B5 M" {6 W7 F/ e - // WK UP按下) O4 ^% V6 K4 p+ ]* X
- if (gKeyValue == 1)
# ]0 s: ~8 p* Z# f# K0 N* I% X - {' N+ o+ b' r6 ~7 T. k
- IWDG_FeedDog(); // 喂狗( N1 v6 R1 @4 V. V
- printf ("喂狗\r\n");5 ?5 d) q. `" L0 m$ Z
- }; ~" k% D4 j, Z6 I& Q7 n. y
- }
) R7 |3 D( L! E6 S e - }
复制代码
1 A8 l5 E2 F& M h' e t& b2 _' x效果如下* ~: l; f& V/ m( j" N5 @
) T) w8 Z, b) [* }9 N! q2 R- W
6 ?+ m) {6 m% R( P
IWDG效果 1 u6 ]1 d2 @) U$ l( F
" Q/ B/ O+ L5 b1 S) L. p" D1 l
- k( U5 Y+ r' z! x n# L: j0 M" }' L0 D按下WK UP喂狗,不会产生系统复位。
2 X; ^! [7 d9 A5 m, L. b. E% Y9 j5 a7 j4 w
一旦2s内,未按下WK UP,就会产生系统复位。
! D9 x' Y! @$ `* u" G5 q5 k; _7 v( J8 ^
! c' d' w B# ]
7 ]+ ?9 X0 j- v9 Q( L' Q) H, g- d4 y转载自: 二土电子/ c& k2 V3 K; s9 D E
如有侵权请联系删除
( d9 Q" R/ o+ N1 a, |; b+ ^+ {1 W. F0 Q# f; L; V8 a6 L
; J8 I( ]! s# s1 z+ N3 y! | |