一、独立看门狗(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 [
( B4 z0 A$ a5 O& F- Q6 m
6 h' U; U# l( u- P
7 }" ~9 D& y+ f
' ?* F& L* n7 J0 J, W' p
, `* H" p4 n5 k
8 @( \5 T9 Z3 e9 |7 ^" B
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. }
; 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- void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
; T" Y" G3 s! i4 w @ - void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置预分频系数:写PR+ d- S" A# ?3 K6 K
- void IWDG_SetReload(uint16_t Reload); //设置重装载值:写RLR/ h P( S9 A! {& n: Q, K& V
- void IWDG_ReloadCounter(void); //喂狗:写0xAAAA到KR
4 F3 A5 O% a4 ^5 z. Z3 | - 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- #ifndef __IWDG_H: B$ U$ }* B) _" @
- #define __IWDG_H 1 G/ }* d9 y5 |5 A" \* a
- 0 R; U8 o% b( B, m- a5 d
- #include "stm32f10x.h" @# v- b$ r$ a& \( C6 V
- 6 k$ ~! R% d5 O+ ^
- void IWDG_Init(u8 prer,u16 rlr) ;
, `1 _/ K3 T! y: g9 S/ e - void IWDG_Feed(void);/ {/ d4 R$ o0 ~8 u7 m& `' f
( t" i# s9 D# d6 N5 }0 R# b- #endif
复制代码
4 |6 @5 a6 k9 v4 biwdg.c6 G, _% L4 c7 y& y
- #include "iwdg.h"8 t7 g# F' D. z3 E6 t6 F2 w
" f# l2 ?1 R: W+ k( I0 B- /*******************************************************************************5 Y1 I* P5 }: L
- * 函 数 名 : IWDG_Init
( l8 i" w1 Y2 o4 B( E, g - * 函数功能 : IWDG初始化
( m1 z, K0 B5 r5 F4 n0 { - * 输 入 : pre:预分频系数(0-6)
H! O ?( Y0 ]& a7 l0 G" D1 o - rlr:重装载值(12位范围0xfff)* P) ?; J; C5 c4 q3 _) M8 j% t) p
- 独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms)
( q8 N5 u0 x. c2 V - * 输 出 : 无4 t# n& t, P- U E. A
- *******************************************************************************/
: t5 ^2 S( J& [! Y/ z - void IWDG_Init(u8 prer,u16 rlr) 6 l. Z; x* `9 n3 L
- { $ C: B: f5 u) p( U6 x% y" [
- IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护
% a# w/ m- [" b - IWDG_SetPrescaler(prer); //设置IWDG预分频值3 l, K! B& V: {. a. C
- IWDG_SetReload(rlr); //设置IWDG重装载值
- n( ?2 ~3 N/ G4 p( H - IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器7 R( U( R6 d4 d: H* R" \
- IWDG_Enable(); //使能IWDG2 L. y% S4 W& w' t5 `9 R
- }
' q* x/ n+ c( n# ^( ]. [ - 3 l9 }2 z/ N+ ^5 P" l- |3 o
- //喂独立看门狗) {. c( f# u, ^ G; P+ V
- void IWDG_Feed(void)6 g) s% ~# }2 _8 Z2 y. c4 [
- {
8 j) g3 e" A; j* N. N: g' \ - IWDG_ReloadCounter();//重装载初值
& M; D: Q8 j- B& o3 h" s0 k - }
复制代码
2 J9 D( G+ _- k3 L3 @; U Ymain.c
" M8 }9 s" Y% c/ P' C2 c# f$ x. W/ `/ J- #include "stm32f10x.h"
3 J# X: l* \. l
5 P0 ^9 \* u6 A' W; C1 ~( u- #include "iwdg.h"
" J8 `% |/ [$ l$ E2 j, F" s9 ` - & q3 G2 K5 H# Q0 L1 ?; {% j& Z$ X
- int main()' }5 J5 b( N7 @$ L8 W6 }7 i. |
- {
; q7 N2 i1 }0 j q" B. ?+ L" G - /**
5 e4 o& s2 _7 V( e4 X' T - 其它初始化省略6 ^# I. Q5 X: K7 c7 r# t3 n3 h
- **/9 G( G1 \0 ?2 j- s6 n5 Q
- IWDG_Init(IWDG_Prescaler_64,625); //独立看门狗初始化,超时时间1s
) p) \# ?7 ?* U' f% M -
/ g7 A( I8 b/ |. g: m - while(1)
3 C: ^$ r6 y3 Z/ M - {
# p) ]7 ]' |3 o9 q% x* K6 o0 Y4 n - /**, m* b& e \% K* R3 M
- 其它程序省略6 t/ w$ K% u( ]. E, X2 b0 z
- 如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();7 r. _9 t8 Z; _1 ]8 k
- **/, |, H( q5 T8 B" Z1 ]. @
- IWDG_Feed(); //喂看门狗
: i0 d, X X- } x2 u' w, E - }! @0 r! r7 `, ?6 v9 G( Z
- }# 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 |