一、IWDG简介
: I7 i4 R' H1 c+ l l独立看门狗(Independent Watchdog, IWDG),什么是看门狗?字面意思——看门的,有陌生人来,就会叫。实际在嵌入式领域里,看门狗也是这种作用,当软件程序发生故障或者程序跑飞时,看门狗会产生复位信号,复位系统。
4 k, H. l! I9 q. ^1 F0 k# Y4 J. F& d0 o
二、STM32的IWDG
E' L; G( b: m2 B7 E2.1 STM32的IWDG简介$ E5 [- ?2 M" U7 L, t$ x& X
STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
9 K, H8 n; t4 N/ z2 d% V$ r3 [8 ?8 Y2 f% }5 q0 H5 @& B) F) l
IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。
) I, T D2 I$ T) o' k6 G* ]* ] @( Y' Z4 Y# N: |5 J
• 自由运行的12位递减计数器
7 G+ Z) f9 R- n% _3 G _ e• 时钟由独立的RC振荡器提供(可在停止和待机模式下工作)
; F: k3 w6 R( U2 H, f9 Q5 [$ d• 看门狗被激活后,则在计数器计数至0x000时产生复位7 h: \' Z: `) z0 A
6 S- |& n; \1 E# @7 ?3 _5 Y9 L8 ?
一旦使能IWDG,就无法关闭。只有等到复位之后,才能将IWDG关闭。5 \6 ]/ L& |4 o( x
5 ~& k0 r( {; y/ J2.2 喂狗- Y: |1 Y- y% q2 F6 U
通过上面的简介可以知道,独立看门狗实际就是一个12位的递减计数器,当计数器的值递减到0的时候,就会产生复位。但是,如果我们在计数值递减到0之前,重新给计数器赋值,那么就不会再产生复位。这个操作叫做喂狗。
8 N* [" U4 {( \/ T* \$ O/ V+ a& s: i8 V6 k" s0 Z
W* n* y& x' S. C: K4 K
2.3 IWDG框图
. L5 \# _2 |7 s) F3 |* |2 ?2 p2 J! c; ?+ p9 E3 ]! m/ L
( L6 ^+ j- x7 L4 ~) Y/ v
* p( z0 e; I. z. AIWDG框图
# [6 Y g7 N. v. v$ y- E3 p3 a' ?, v4 U
IWDG的框图很好理解,IWDG由一个由独立的RC振荡器提供时钟。经过一个8位的预分频器对时钟信号进行分频。12位递减计数器按照设置好的初始值和输入时钟递减。当递减计数器递减到0时,产生独立看门狗复位。
: S \; D* V+ V4 i
6 b& T6 Y& o9 O9 }+ z# Q在产生复位之前,如果将重装载寄存器传递给递减计数器,那么就会重新开始递减,这叫做喂狗。8 Z6 d3 `0 q- l0 n% c/ a& t7 A1 a
0 C* m8 x l+ W+ n' Q
键寄存器也叫做关键字寄存器,往该寄存器写入不同的值,有不同的作用0 Y5 Z: }: O+ ]0 I1 Q7 D
4 n* x3 s; F$ ^! A& |. j0 b$ o, b1 a, e• 写入0x5555——表示允许访问IWDG_PR和IWDG_RLR寄存器 t, D2 {- f$ I: @5 T
• 写入0xAAAA——将重载寄存器的值传递到递减计数器,也就是喂狗9 z3 v. j3 Y: `; w3 \( m/ w
• 写入0xCCCC——启动独立看门狗功能
; Z) A A! O; b( Y' L! q) V# x* b5 T' V a6 l' v) ^$ J! B
中文参考手册中给出了一个时间表
! }5 J2 E2 Z$ o/ N8 I0 M9 Y! a2 g5 D J" z5 ^
7 j* G' S J% b' j$ U& v# oIWDG的溢出时间表
' P1 z/ P/ R/ I9 v2 g* L+ h$ Y9 K5 x! C' f6 l7 b" s
5 E6 ?5 w( G9 b; Q6 ~2 M时间的计算方法是,时间 = 重装载寄存器值 / (输入时钟频率 / 4 * 2^预分频系数), \) m: _+ V( y, A6 |
6 j9 b( U+ R, B5 B7 T" _为什么是4 * 2^预分频系数,可以看一下中文参考手册对于预分频寄存器的描述
/ k" ^0 X/ M% U/ i i6 y! \5 f3 o5 z( q" R) X7 d
- n8 p- f. n4 A
预分频寄存器描述
. a0 u8 b3 l+ ]# b0 e6 H2 w4 u! F# R9 Y
- |! R$ E( p# V7 u2 ]; R
3 w/ P: B: I( a. j三、IWDG配置步骤
8 N' E. J/ z& ?8 U: Q• 开启寄存器访问(允许访问IWDG_PR和IWDG_RLR寄存器)
5 k9 j i: D' ]• 设置IWDG预分频系数和重装载值 e* i9 T! _! Z2 v
• 将重装载寄存器的值传递到递减计数器(喂狗)6 G; W- I' P! \; Y2 t
• 开启IWDG
* p& L: u- {! R. [! r3 M2 j
! l) O: k2 _5 Z z; |
, w9 o; g+ `3 ~& m% E+ R/ a0 N$ H1 l四、IWDG配置程序
5 V! U) G; Y5 L/ p44.1 IWDG初始化程序
/ O0 q& i9 {8 C) Z( w5 ?- /*0 S' x3 `$ N5 n6 n6 U. u0 A7 m
- *==============================================================================# q+ [% ~/ ]8 q) s* c
- *函数名称:IWDG_Init
5 V3 @# L1 ~5 f. G& d9 E$ ]- F" k - *函数功能:初始化IWDG
8 |/ M0 o* u- y+ n0 w - *输入参数:pre:预分频系数(0~6);rlr:重装载值(0~0xFFF)
$ |1 i, j7 z$ n% E5 y' B4 R - *返回值:无
; l' [- l* t# ?! d - *备 注:独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40(ms)
0 {" T. o' a' C8 e - *==============================================================================& D, C9 D1 `2 j m/ P% j$ F
- */
5 ^# T3 a7 R; N" S - void IWDG_Init (u8 pre,u16 rlr)
1 }. y6 ^. y+ i, N - {
" Y$ S$ `( `# K4 u% c: j! L. `! H* R. m% y - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 取消寄存器写保护) z8 k" Y; N0 Q1 f9 B
- IWDG_SetPrescaler(pre); // 设置预分频系数 0-6
' O4 o( x5 x8 U7 e; Z8 C$ J' U - IWDG_SetReload(rlr); // 设置重装载值
4 H# b6 G1 S0 U- D P8 K" b0 y - IWDG_ReloadCounter(); // 重装载初值* P; u- B+ A+ }# C; k, @
- IWDG_Enable(); // 打开独立看门狗
+ H; k/ D8 J( }3 S$ [ - }
复制代码 9 r: t; E. l/ T* r* H' R
5 F3 T7 {: \/ X' G4.2 喂狗# q4 a/ @5 }( H7 c
- /*
! ~1 O: R. ?; @ - *==============================================================================
/ ^# A n$ D! B+ C - *函数名称:IWDG_FeedDog
1 ^" s( _' F0 H- M - *函数功能:喂狗
& u% R k8 ?1 C; ? Q' f) _8 O - *输入参数:无
" Z. u4 Q, n1 `, S7 U - *返回值:无
1 L4 r6 q# a4 W' z) |" n - *备 注:无
" A- }. H3 E, v' T {+ D) z - *==============================================================================
/ [' B/ r3 f3 M% w; V8 Y - */
" I9 _8 M& F9 d1 u" x1 i4 z! P - void IWDG_FeedDog (void); ?" w2 U/ {; ]- j
- {
" O# j% y0 \& A/ p0 r - IWDG_ReloadCounter(); // 重装载初值7 B; P9 s3 s7 T- Q X
- }
复制代码 9 H' O/ X: w. q$ f$ g7 z* W
五、应用实例
' t, @6 k+ z% z" y初始化IWDG,配置2s内不及时喂狗就会复位。通过按下按键WK UP喂狗。串口打印复位和喂狗信息。IWDG初始化程序如下& U4 S- S! u3 d; U- q
- IWDG_Init(4,1250); // 看门狗初始化,2s不及时喂狗,复位
复制代码 . m. L6 b+ D* M
main函数如下
$ n( m: i z/ {5 n3 @$ F( t6 j) T- u8 gKeyValue = 0; // 记录按键键值变量
& f- U9 u* _: q) s7 k+ M7 C - 5 }+ I% J- @! i! c8 U
- int main(void)6 Q! m! H7 H; |0 @
- {, y$ k+ m- b- u7 G9 t6 Y
- Med_Mcu_Iint(); // 系统初始化/ {9 A' U8 `0 a8 j% Y
- printf("复位系统\r\n");% j, l5 m' B' k
- 3 ?, A/ t( K" o5 ~
- while(1)% q5 ]! x8 y3 f4 f! v. g; o
- {
7 U: K; x8 l6 f Q" J2 E* I - gKeyValue = Med_KeyScan(); // 获取按键键值
. L9 w( S, `: r# {6 K, b6 H - 0 ~: O% i3 s1 i) V
- // WK UP按下! N# ^, J' B+ M
- if (gKeyValue == 1). q4 f$ n$ N, k5 w9 `; g+ A8 S% n- O
- {3 N/ ~9 }% a; e+ w) {: V h
- IWDG_FeedDog(); // 喂狗: X% C0 Q8 z' H8 ?6 i
- printf ("喂狗\r\n");" S+ q& k7 y1 l6 @
- }: X4 M& V& f& T8 G* C
- }0 h: |; J& G8 R) P ]1 N- b
- }
复制代码
" R. ?$ p- N/ ?* I! ^! m) R效果如下
; D& `$ i2 z& X. k h' Q
0 p+ k( @4 a4 q! ]' q; G8 j: E: V! F
IWDG效果 , H% v: t. X4 Y$ e7 o6 y- g
7 Y$ u3 |8 A; D; I1 i) }% Y: S! K( s, p! b5 }0 Y6 c
按下WK UP喂狗,不会产生系统复位。
u' f {& g. ~9 `9 Y
; t/ w9 \. J# D( C一旦2s内,未按下WK UP,就会产生系统复位。
9 t7 E+ A% y* A5 T# D% e; D! i& B: }
' \ Q5 c) O6 ?& T; `4 B
: s) {1 ?+ W% R( S转载自: 二土电子9 Z; j5 i* K/ T0 n; T
如有侵权请联系删除. I; Y& w9 F5 t- n, J
% m3 ?6 Z8 q/ l5 B) p8 R, x, d
, K# ]! r v# F" Z1 j2 \
|