本帖最后由 kkhkbb 于 2018-3-19 08:59 编辑
# p( Z+ A7 N2 H! w! n
' z' {# m }& @: F; x$ B: O# A/ a一、概述 1、 WWDG看门狗简介 IWDG看门狗存在这样一个问题,如果在喂狗的间隔期间,程序跑飞后又正确归位,独立看门狗无法发现这样的错误,程序将存在很大的危险。与IWDG看门狗不同,WWDG看门狗需要在一个规定的时间范围内喂狗才有效,这样可以较为有效的解决IWDG看门狗存在的问题。可以根据WWDG看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。 2、 WWDG看门狗窗口说明 WWDG看门狗在使用时,除了使能时钟和设置预分频值外,还需要设置窗口和计数器初值。在芯片内部,WWDG看门狗计数器是一个7位二进制递减计数器,当它从0x40翻转到0x3F时,系统会启动复位。只有计数器在窗口值和0x40之间的时候,喂狗才是有效的。如图7_0所示: 图7_0 WWDG工作原理图 二、硬件电路 图7_1 按键引脚 图7_2 按键 在iCore3双核心开发板中,采用一个独立的按键与STM32F407的PH15相连,限流电阻为1K。 三、实验原理 本次实验使用的是常开带复位按键,从硬件电路上可以看出,当按键没有按下时,ARM芯片的ARM_KEY引脚读取到的值是高电平,按键按下后读取到的值为低电平,按键没有按下是正常喂狗,当按键按下后停止喂狗。 四、源代码 1.主函数 - //--------------------------- Variable --------------------------//9 r0 R" \+ S: G$ P/ c1 O
- unsigned long int time_delay = 0;
& ?$ P! a9 i$ h - //--------------------- Function Prototype ----------------------//
4 }+ v4 M6 v) X - static void delay(unsigned long int ms);/ K* _. K! ?+ ]8 }, b1 l
- //--------------------------- Function --------------------------//
! i8 Q8 p0 D, V+ ?9 E - /*: \1 n7 ^1 q. w. S) D$ a; m
- * Name : main
1 b/ M# @, U( }7 i! J/ l, M$ n - * Description : ---
# F) b/ ~# c# L - * Author : ysloveivy.
* |1 f9 y" U! `+ [. ~+ I' n% ` - *6 b$ P+ h5 f* v% j
- * History
d- A- V0 p' j" {7 q9 o - * --------------------
# \5 M V' _* k1 J - * Rev : 0.00
1 N* n3 {) T- `! c4 ?( } - * Date : 11/21/2015
) w/ `& v/ R% C& i2 b1 Q - *
! E( l, I* t, E4 h - * create.
6 ]7 e* B9 ^) m( H, k: u3 ?5 [ - * --------------------
+ @5 X9 U& a* ?5 H" N - */
0 k# y9 K) I2 I* ~ - int main(void); }2 V5 x) o4 \; T; G6 m, G7 E" g
- {
2 C4 E) u, I ]; O# ?* Q8 t - int i;
. [6 ?+ j+ d7 D6 i* ` - for(i = 0;i < 10000000;i++);, M0 ], V) W" D8 U) z
- led.initialize();
J- ~# o3 l0 o' p v - key.initialize();. @% H& d( E' m
- systick.initialize();. j4 k: _3 U) Q7 i ?
- wwdg.initialize();
7 o" C) n) I5 I% y* ]% _ - LED_RED_ON;
i* l& ] J: o/ d) j - while(1){1 K+ G4 J1 A9 g: m) W/ \( p
- while(!KEY_INPUT);
5 ~0 M+ o, D6 |8 |5 d2 n) B - delay(30); //30ms喂狗
- l K8 r9 ?3 E/ K$ y- q - wwdg.feed_dog();
! l$ g7 ^9 |. j: _, H - }
7 f* S2 [# X8 N$ p. H - }# Y3 c! R8 T4 `3 a
- /*6 r: A) I) c& ^# h0 W# R9 D
- * Name : delay
! A$ e# u( M/ {7 X4 k. Y; K - * Description : ---
7 ]7 b$ W$ f5 K0 w' I - * Author : ysloveivy.# {0 h" f) k$ l" Y& D0 s% L' ^
- *" \9 w2 R8 P, @( s* E! U: D6 x+ C
- * History
, R1 S6 m, L; V: J; P* B/ E) q' h - * --------------------
5 b* S# `" x5 | @1 k7 l* h U& { - * Rev : 0.00
0 X3 o4 B/ j! \% S" l* F - * Date : 11/21/2015
' P) H6 V( `; F5 H9 T - * - t8 x% @' R' P# g7 ~. b) x% f
- * create.5 z+ h* L+ R, n
- * --------------------( F; j. W) F7 r
- */
5 T% l& N! s1 E& H1 h# L# u - static void delay(unsigned long int ms)
1 G" B; P" I; P8 u T$ w% C) r - {4 H' I/ d+ k( V0 U: N
- time_delay = ms;
1 Q1 W5 g% y; A) ?, [9 y - while(time_delay != 0);
2 ~; T- U: p4 `! [ - }
复制代码2.WWDG初始化及喂狗代码 - /*
) y6 @. X/ K6 @. g h - * Name : initialize
6 V8 w( m! N2 E" y - * Description : ---
; A" F7 V) n$ E1 S" _& ^ - * Author : ysloveivy.
( U9 Q$ m0 g* `. U* Z- v3 H - *
& H' h5 f9 O: Y - * History c/ F$ X+ h, q: f- K1 @1 o
- * -------------------- q M7 q. J' S) X# A1 u' x4 Z
- * Rev : 0.00& y$ @: N- Z$ x" U
- * Date : 11/21/2015
% _+ u0 Z. B' ]8 u6 U - *
o* t7 k) U$ b5 W! _: j" C - * create./ D5 `4 ?0 m9 V) N* v
- * -------------------
4 z( {) n6 F: P$ P a" v( Q - */, c0 S) j: m( e7 j$ x6 T f
- static int initialize(void)
+ N$ `' w' p) J8 o" | - {
8 G/ x* j* `" k) p. I. w l8 H - //21.06ms 49.9ms之间喂狗
2 l2 A* A; Y* y0 I) L) I - RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); //使能窗口看门狗时钟
& s2 H/ g1 d- y h0 [7 ^ - WWDG_SetPrescaler(WWDG_Prescaler_8); //设置预分频值
* w4 u/ l! ]* b" ?7 F - WWDG_SetWindowValue(100); //设置窗口值4 p( V$ ~- h* k& O" |
- WWDG_Enable(127); //设置计数器初值,并使能窗口看门狗
1 H/ Q. |* J1 C" U - ' S& C- X1 s6 j! m1 h7 b6 W
- return 0;4 D8 P0 c+ G) ]7 _
- }
: H% ] N! P& |% Y( P1 _6 q6 F9 d - /*2 Y2 G' K! N0 O. e6 w( _
- * Name : feed_dog$ C9 t$ T2 M/ P
- * Description : ---- J! ^: m, \. Q
- * Author : ysloveivy.8 E3 ]( `: `3 }$ r
- *
! j+ N/ l$ k& `0 f9 \1 J# s - * History
7 x n+ }* k- ]( O# p9 z: J - * -------------------4 F/ D' `$ q* G# l1 q6 x
- * Rev : 0.00
5 `' L# B6 \" W5 ^$ E/ E5 ?3 h$ S - * Date : 11/21/2015
5 `5 i: E# a- a& X) u - * * }- c; F/ V5 X* j2 B; W4 r& E
- * create.
# v( |) x; F1 }2 K. T0 q - * -------------------
* }* K! [- R( Y4 n$ e, A4 k" W - */
% U9 ~! U3 y& J* r! X - static void feed_dog(void)
R0 E/ k- `3 Z& `4 I" ~ - {
$ W+ J# a. \8 ~7 y: Z/ Z - WWDG_SetCounter(127); //重置计数器,喂狗
+ E% V, Y2 I/ U) ^! d - }
复制代码3.系统滴答定时器中断 - /*
$ l- v) ?# k6 l$ ~- y - * Name : SysTick_Handler
, U" Z5 d+ I8 f2 j/ t - * Description : ---4 [/ g2 }+ x% f% }
- * Author : ysloveivy.
5 P- E% Q$ G" O0 N+ U$ F! v2 \ - *
3 l& @1 { D. I8 q - * History
! f* O. r; }5 G+ t- X; H - * -------------------
9 D) m: S: I1 o6 p - * Rev : 0.005 h) @. V5 p- h% G. K
- * Date : 11/21/2015
* l# n) K9 \+ m/ a& |) f/ D1 } - *
) I4 a$ ~* C: w5 P. a# i - * create.9 I) V' H5 u) S: B: m' R! S$ v3 r& c
- * -------------------
+ G, `' W1 p' z' D, l. `- ? - */
' U) p+ B# M( [) L) n, f3 Q - void SysTick_Handler(void)
/ m0 A% S1 _1 B, b' F - {% k( V7 C, K. g% f7 ^- C. U4 Z
- static int counter = 0;
; i' Y% ?+ U0 L- s1 m3 y, N. C - if((counter ++ % 1000) == 0){
1 z5 m* V L5 y! L - systick.second_flag = 1;
m5 ?, {0 a: J5 G6 c+ g+ J - }
+ y) E/ W1 j; k# V+ ? - time_delay --;7 {1 B& w4 Z$ ?
- }
复制代码五、实验现象0 B. |4 A3 {8 J3 i* U
iCore3 双核心板红色 LED 常亮,当按键一直按下,看门狗一直复位 ARM,红灯闪烁。六、代码包下载 网盘:https://pan.baidu.com/s/1qWEK7fQ 6 D7 H& a) }& D- f8 m
$ o2 ?% m* v$ j P( w! q
k3 h! k; i: C* n' U2 ~% V3 \. E) H: q
|