一、独立看门狗(IWDG)基本知识
2 m" m! @3 _( \1. IWDG简介2 V5 C7 T& x: _
独立看门狗是由专门的低速总线进行驱动,即LSI总线(时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作。& k! N' o& ?) U
独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。! H% @+ q! Q* C; j- C I) D. @
2. IWDG功能描述
( @/ {! \. U: C6 v$ @- Z在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。) q7 k: c9 J _
无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR中的值就会重新加载到计数器,从而避免产生看门狗复位。
0 D! U; g% L% ~& q& d0 x0 B如果程序异常,就无法正常喂狗,从而系统复位。
' ^8 i9 R; J1 u; A* D1 ~& k
& [- }( g0 W# q& _8 ^. L3. IWDG寄存器
- m* ?2 W& j6 K% B+ i7 {STM32中文参考手册中关于IWDG寄存器的介绍如下:
3 m) F, A3 ?' M: C2 e
) B2 L0 i1 k! i; u7 c6 J, w
) `8 D+ X, ?- U7 N. l+ g+ G6 P1 O
; F( |( o$ W$ ^; z/ y
0 V! y; x, D1 z6 J+ |0 z, ]3 ]$ ?, V
1 }, U- d1 v: }, Q- o9 U
s* b4 O" j- `# S8 | M, K! a& @( | v* z% {
/ B; `2 Q1 |" c+ f, W1 h; ? \9 Y
9 w0 _4 e1 q8 P/ f5 j" A3 B% f& I6 W) ~6 e: P
4. IWDG超时时间
" |& ^' q7 u, z8 mSTM32中文参考手册中关于IWDG超时时间的介绍如下:
4 L) p! m1 U/ Y
& ^* v) K1 n' C& ^
; B# L X5 ?( i% ^
H& c; W* p6 ?4 U溢出时间计算: Tout=((4*2^prer)*rlr)/40 (ms)4 V! f( a+ m% @6 t. k2 i1 ?
prer:预分频系数:0~7(只有低3位有效),由预分频寄存器(IWDG_PR)设置。& Y/ U) H1 @3 B1 C' v% L# Z" P
rlr:重载值:0~4095(低11位有效),由重装载寄存器(IWDG_RLR)设置。, z8 u# B) C% Y
( T/ t( @! d0 z" v& D
二、独立看门狗(IWDG)程序实现
8 N( Z1 z& s$ i/ E0 H1. IWDG相关库函数
" m& L4 I- n8 X9 A* j- void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能: l7 q, l2 P& r6 b' [$ i
- void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置预分频系数:写PR A, R% y' L+ m' g2 k
- void IWDG_SetReload(uint16_t Reload); //设置重装载值:写RLR) ?& ]0 J5 r" c. ]) a3 u' Y9 ~
- void IWDG_ReloadCounter(void); //喂狗:写0xAAAA到KR
. G+ @) _" C/ R5 J+ ~ - void IWDG_Enable(void); //使能看门狗:写0xCCCC到KR
复制代码 ; u, O8 E( p+ b- F/ R' n( X8 Q+ y
2. IWDG控制程序. }1 T* F0 F: n! N9 c
iwdg.h
8 \8 A8 ]0 ]) g* Y7 x$ }- #ifndef __IWDG_H, P% C- f" S( J
- #define __IWDG_H 2 Y- `8 l( Y5 p: T8 K0 Y* p% ~
- 0 A9 R" ^9 T4 n B9 s# A
- #include "stm32f10x.h"3 s7 K" f- M5 q) u% Y
- - C$ u& \1 E7 T7 s/ l
- void IWDG_Init(u8 prer,u16 rlr) ;5 @4 E x3 m6 R( r
- void IWDG_Feed(void);4 u% Y4 r& z5 c
1 y" X- r; a( k/ x# W2 X# n- #endif
复制代码
( V. O7 _) g' {0 ^4 L9 viwdg.c) J; d+ F" o4 C5 m! y
- #include "iwdg.h"
4 A# r8 f0 b$ Q/ O5 K
; A' }$ o5 S) T# { o) s2 H8 w! B- /*******************************************************************************
3 F8 Y, R0 b: C4 } - * 函 数 名 : IWDG_Init" u* h, w$ k, d4 g
- * 函数功能 : IWDG初始化
3 D! H L: F. R - * 输 入 : pre:预分频系数(0-6)
J2 G! S0 z8 L; t/ N9 ^ - rlr:重装载值(12位范围0xfff)
2 |$ d4 _" K* y+ l: K. V. `/ Y) z, u! M - 独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms)
1 g/ |! I, d/ o1 g - * 输 出 : 无
6 i3 m$ w- j% F, X2 f. a3 ?7 _ - *******************************************************************************/+ [. V$ b4 p' A
- void IWDG_Init(u8 prer,u16 rlr) $ \& w( U; T1 \
- {
4 @. I* W' p% l- f) T$ s) @: r: U0 u2 F - IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护+ V) N" T6 C8 O
- IWDG_SetPrescaler(prer); //设置IWDG预分频值, P( z( J3 @# l7 |% i
- IWDG_SetReload(rlr); //设置IWDG重装载值
& ^- M; E# R- ~7 s4 E - IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器4 h1 D+ E- F+ c1 d V+ _- }
- IWDG_Enable(); //使能IWDG' f2 K, l1 d \2 w Y* N
- }8 o D; W: j5 f- c
- * I/ G/ A. b! a; V+ U
- //喂独立看门狗* f$ h7 [) M1 G! G2 Q7 w5 k
- void IWDG_Feed(void)- C, T# f' o! d
- {
/ A w# M4 a. F. m: n - IWDG_ReloadCounter();//重装载初值
- ]8 ]9 b' y2 x, R - }
复制代码
$ r. b3 |4 W1 n7 z( Bmain.c, Z0 F0 v" I3 a1 K
- #include "stm32f10x.h"- ~# U. |- Q* A
- 8 G! o6 s8 k) h% h4 R6 ]/ G& Z
- #include "iwdg.h"
+ f: \ i5 ~: v( c. A) e
% E" I; D4 Q; l! L5 Y/ l. l+ M5 c- }. v- int main()
; }2 M& F' T0 T- Q - {# d, {' d- \* U- x7 x$ v
- /**$ @2 j& f# {6 ]/ |
- 其它初始化省略% j" ]% ~. O4 O+ q! I' l, y* b
- **/
9 H6 n, _1 Z# b0 s, R - IWDG_Init(IWDG_Prescaler_64,625); //独立看门狗初始化,超时时间1s0 K( Z- Q( V% X0 E8 W) _
-
6 U5 L: y B5 f0 V R) I& I( v/ C6 F - while(1)6 k; m5 q1 d+ Y h( P
- {
2 P7 k1 M H/ p7 C - /**
% `: @2 a5 m1 {- f2 w - 其它程序省略7 G7 j( `4 x G
- 如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();
n/ Q' {" T2 y/ U' }" a4 b2 [ - **/
. e3 l9 w, t9 v - IWDG_Feed(); //喂看门狗
) M: O9 C9 ^' w8 |4 v* ` R - }6 O1 @3 U9 m0 d! S/ ?
- }( E- l) i5 R# z& N3 \/ }! a8 k) @* ^
复制代码
& c: M1 V n; Z/ B4 a' t+ |5 }# `6 u) ^2 v' J
S+ c. R9 Q4 t& S
2 A1 X, t" d0 {: j* `( N$ q R7 T3 a+ I7 Z( V
|