你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【零基础学习STM32】第七讲:WWDG看门狗实验——复位ARM

[复制链接]
kkhkbb 发布时间:2018-3-12 11:43
本帖最后由 kkhkbb 于 2018-3-19 08:59 编辑 % u* m0 m9 _: [  n$ G% z

, x0 h6 T* _, `! ^; H  f% L
一、概述
1、  WWDG看门狗简介
       IWDG看门狗存在这样一个问题,如果在喂狗的间隔期间,程序跑飞后又正确归位,独立看门狗无法发现这样的错误,程序将存在很大的危险。与IWDG看门狗不同,WWDG看门狗需要在一个规定的时间范围内喂狗才有效,这样可以较为有效的解决IWDG看门狗存在的问题。可以根据WWDG看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
2、  WWDG看门狗窗口说明
       WWDG看门狗在使用时,除了使能时钟和设置预分频值外,还需要设置窗口和计数器初值。在芯片内部,WWDG看门狗计数器是一个7位二进制递减计数器,当它从0x40翻转到0x3F时,系统会启动复位。只有计数器在窗口值和0x40之间的时候,喂狗才是有效的。如图7_0所示:
7_0.png
          图7_0 WWDG工作原理图
二、硬件电路
7_1.png
             图7_1 按键引脚
7_2.png
               图7_2 按键
      在iCore3双核心开发板中,采用一个独立的按键与STM32F407的PH15相连,限流电阻为1K。
三、实验原理
      本次实验使用的是常开带复位按键,从硬件电路上可以看出,当按键没有按下时,ARM芯片的ARM_KEY引脚读取到的值是高电平,按键按下后读取到的值为低电平,按键没有按下是正常喂狗,当按键按下后停止喂狗。
四、源代码
1.主函数
  1. //--------------------------- Variable --------------------------//
    4 q  ]' \( Y5 N& X
  2. unsigned long int time_delay = 0;/ A. X3 x4 D$ B2 k4 F
  3. //--------------------- Function Prototype ----------------------//
    6 R( n' r! J! c. U# H
  4. static void delay(unsigned long int ms);4 f* w( D) b3 G) }! @9 t8 H
  5. //--------------------------- Function --------------------------//
    $ \$ H  Z; t& t9 q9 e
  6. /*+ J. j1 V1 s9 [
  7. * Name                : main
    4 }' y7 @- }8 ]. E1 _
  8. * Description         : ---2 v8 f3 q  ]" c
  9. * Author              : ysloveivy.) N2 E3 c' C% b: |& {. E6 g2 U
  10. *
    ) z5 J6 o. s6 x! l7 B  r7 H
  11. * History4 d. B7 g! }6 B
  12. * --------------------
    , @, D6 U5 S+ s5 ^) n" Z
  13. * Rev                 : 0.00
    ) r( s) A( n8 W+ d, ~& P
  14. * Date                : 11/21/2015
    , y4 {+ L3 K, A1 O. b# Q
  15. * - \- t. T( ?5 f, k
  16. * create.( r. e6 H, E4 b3 w' |
  17. * --------------------) b! q. y& l# r2 e$ ^
  18. */2 c" g- T0 j' f4 V+ u3 f
  19. int main(void)/ k: q+ E7 D# ?5 z# E
  20. {
    ! n, k/ E' l+ J7 r8 H& a& a
  21.         int i;0 A' n! I9 Y4 O0 |$ x% d$ C
  22.         for(i = 0;i < 10000000;i++);
    # _2 Q- T5 T$ ]1 \1 e# e3 o
  23.         led.initialize();
    " h  `- r  W" _/ E
  24.         key.initialize();
    5 H" M" v" I# b' P, D
  25.         systick.initialize();
    : o+ A" U# z7 X: Z$ E
  26.         wwdg.initialize();
    1 V7 D4 }9 ?7 c/ j2 w! V( Z/ D6 u
  27.         LED_RED_ON;! W# l# R$ P7 F
  28.         while(1){/ _# W* D4 B1 {9 @  p5 `. x
  29.                 while(!KEY_INPUT);
    1 H8 T' o9 f/ d# ]
  30.                 delay(30);                                 //30ms喂狗% q9 {8 k6 T; z6 n; f
  31.                 wwdg.feed_dog();
    4 ]9 O& e0 X  }  [
  32.         }
    - a0 t2 R  x7 S( n- N# D
  33. }$ s: h8 l* k# X# }
  34. /*. E- I5 a, k0 s# D' a4 W9 @, M
  35. * Name                : delay: L/ T0 ^" K' K, N3 a, C
  36. * Description         : ---) v8 Z2 I5 k' y3 t' G+ O1 D
  37. * Author              : ysloveivy.) X! m8 I9 V. l2 c
  38. *
    . d( ?4 F/ \" Y) }$ l* V
  39. * History2 \, M$ V1 J2 g9 g
  40. * --------------------* `, S% d0 u9 W! ~, k# i' B
  41. * Rev                 : 0.00
    : `! }/ B! v  y* y! X
  42. * Date                : 11/21/2015
    - S3 {$ u! }( s, }9 e$ p+ I
  43. *
    # ?0 @  S: V; r
  44. * create.- K) o) L! X0 i
  45. * --------------------) C1 ]& \4 f. x( _
  46. */; L( l% a! [* r6 q' u% o* n2 r) B
  47. static void delay(unsigned long int ms)4 O! J& G/ j' h
  48. {
    ' e2 a" d* m" i! \: \. r/ n; Q1 x
  49.         time_delay = ms;
    2 X0 I1 n! a  K" d) w6 Y; R
  50.         while(time_delay != 0);5 @; ?2 u% o* E& P' c' ]  P( }
  51. }
复制代码
2.WWDG初始化及喂狗代码
  1. /*; O: B1 d) v! i7 L
  2. * Name               : initialize
    % w" K* e  H. B, F/ }, ^
  3. * Description        : ---7 w% t& [4 S7 f$ x8 a& B
  4. * Author             : ysloveivy., z- U, o" s- F/ H
  5. *  j5 Y2 b  z3 G% j* ?0 h
  6. * History
    2 R7 E" k, v  |& b! R, B- T
  7. * -------------------
    ! H  y4 E1 T# }  r) j" w$ b
  8. * Rev                : 0.000 S; ?  S$ t: I& {
  9. * Date               : 11/21/20154 D. C9 G1 A/ [2 s5 V/ z7 N: f
  10. * ! a& k6 }1 r2 i7 G
  11. * create.
    ; _6 P! c# J' D
  12. * -------------------
    2 R+ x% V9 C! Z! z+ C' |" n" x
  13. */
    4 ^! d) ]3 u5 A# F6 ^
  14. static int initialize(void)2 Y. D" j5 G( o8 J
  15. {# |8 A* p/ ?8 T7 i# k( h4 H
  16.         //21.06ms 49.9ms之间喂狗
    4 m5 e' K0 t) E& f- p2 S4 H
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);             //使能窗口看门狗时钟
    ( Z  n" \- a8 W' O* x3 @
  18.         WWDG_SetPrescaler(WWDG_Prescaler_8);                             //设置预分频值
    " E% \" }- r2 `
  19.         WWDG_SetWindowValue(100);                                        //设置窗口值& s6 J6 J/ Y+ t3 o2 w* i6 M: Z3 [
  20.         WWDG_Enable(127);                                                //设置计数器初值,并使能窗口看门狗% V# r$ O; n' Q2 [1 A

  21. / w9 [+ J  A" S6 c0 |& |3 O: @
  22.         return 0;6 r8 j0 c* M" u2 C; C) ~( F
  23. }2 w# i0 C. o% }' r( \% h) w+ r
  24. /*( l3 |' Z2 W, }2 c# ?- J& q5 ?* J- ?
  25. * Name               : feed_dog) F; [7 g9 }8 p' h4 W3 e  l$ a; r
  26. * Description        : ---: F/ D1 D/ U& c& N6 H: Z
  27. * Author             : ysloveivy.. ?9 Q& u, H0 v* M; K
  28. *
    0 O: n5 z- m8 d6 ^+ C7 W+ T3 M, g7 Y
  29. * History" N% e# I1 c) t' w" B
  30. * -------------------, C: d$ {2 b4 J& E+ z& E3 W# s2 }
  31. * Rev                : 0.00) d3 U' H6 x6 Y( `; d' ~4 m
  32. * Date               : 11/21/2015
    * }/ g6 y" n! K! _6 i
  33. *
    ' p( D. ~# ]/ K* R
  34. * create.9 d3 H7 T: N: h; v+ R
  35. * -------------------
    * D" C0 N# R8 {3 }, u% q
  36. */+ W% G* M& j' v
  37. static void feed_dog(void)7 Y  `: E* ^' n5 O, L
  38. {
    1 I+ _. Y1 G. G' R; A; i6 `# j: z
  39.         WWDG_SetCounter(127);                                            //重置计数器,喂狗( Z. [- Q+ b1 S/ C; G7 H
  40. }
复制代码
3.系统滴答定时器中断
  1. /*
    5 S6 h4 O- O+ w( h; l- N- A
  2. * Name               : SysTick_Handler
    ; ^; |- w& r. m" }
  3. * Description        : ---
    $ B: u- ~8 C& P; ~
  4. * Author             : ysloveivy./ {+ T5 f+ L3 ?. L
  5. *9 T! l) W' {  B$ X0 s3 P, g
  6. * History) v( e4 X3 l+ N
  7. * -------------------
    ; v' a. t& `  ^/ \
  8. * Rev                : 0.00
    7 e  j# l, W; f6 h' e
  9. * Date               : 11/21/2015/ c9 J" [: L6 l, ]7 c
  10. *   \( y$ J; o# W
  11. * create.
    $ A4 w) q# y4 C3 p
  12. * -------------------5 u& B& Y, Q' w4 D7 t% }/ q+ H
  13. */% g2 R. n4 f+ n# j# O
  14. void SysTick_Handler(void)
    3 W; Q- ]% U1 o* O; S
  15. {
    ! _+ L  ?0 _! Y6 E1 R- _; S
  16.         static int counter = 0;- \9 i% ^8 t( C3 ^
  17.         if((counter ++ % 1000) == 0){
    9 @! `; B' k; o; n
  18.                 systick.second_flag = 1;' T# E: {6 K/ Q
  19.         }- d3 j, \( o0 ^" L
  20.         time_delay --;2 I6 H4 q- X. |( ^- m) }' c
  21. }
复制代码
五、实验现象! X- F1 ~! l8 R) r5 k/ @2 ~' V
      iCore3 双核心板红色 LED 常亮,当按键一直按下,看门狗一直复位 ARM,红灯闪烁。
六、代码包下载
      网盘:https://pan.baidu.com/s/1qWEK7fQ
$ F2 b( k4 h* R  K9 t8 b4 X3 ~3 K

$ }- G. i( G9 L: \5 m, v  p5 z
  s- P* L  c" z# L( R, A

' m, l' K: d' Q2 f( N! F7 q
赞 收藏 评论0 发布时间:2018-3-12 11:43

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版