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

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

[复制链接]
kkhkbb 发布时间:2018-3-9 09:22
一、概述
. ?) t: g& Y' F9 k6 G0 B1 W& F
1、看门狗简介
  G1 \( ?4 e2 }7 U. ^* x
     在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误,不在程序区,取出错误的程序指令等,都会陷入死循环。程序的正常运行被打断,由单片机控制的系统无法继续正常工作,会造成整个系统陷入停滞状态,发生不可预料的后果。看门狗就是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启的电路。看门狗命令在程序的中断中拥有最高的优先级。
& I% n1 a& ]4 m- a3 A2 F
2、IWDG简介
4 T7 L/ K4 \- q
     此器件具有两个嵌入式看门狗外设,具有安全性高、定时准确及使用灵活的优点。两个看门狗外设(独立和窗口)均可用于检测并解决由软件错误导致的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。8 O9 y! n1 Q; [/ f( d
     独立看门狗(IWDG)由其专用低速时钟(LSI)驱动,因此即便在主时钟发生故障时仍然保持工作状态。窗口看门狗(WWDG)时钟由APB1时钟经预分频后提供,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够安全独立工作,并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精度计时窗口起作用的应用程序。
% N: x( J% i( T" D, `: O& M! N8 Y
3、IWDG主要特性
  • 自由运行递减计数器。
  • 时钟由独立RC振荡器提供(可在待机和停止模式下运行)。
  • 当递减计数器值达到0x000时产生复位(如果看门狗已激活)。
    # @# S8 u$ m5 {6 z6 V$ p$ P3 o7 s1 Q# k
微信图片_20180309091102.png

           图6_0独立看门狗框图

微信图片_20180309091230.png

   图6_1  32kHz(LSI)频率条件下IWDG超时周期的最小值/最大值框图

二、硬件电路

微信图片_20180309091423.png

                  图6_2引脚分配图

微信图片_20180309091428.png

                图6_3电路原理图

iCore3双核心开发板中,采用一个独立的按键与STM32F407PH15相连,限流电阻为1K

三、实验原理  

STM32内部包含独立看门狗,通过看门狗可以监控程序运行,程序运行错误时,未在规定时间喂狗,自动复位ARM。本实验通过按下,停止喂狗,制造程序运行错误,从而产生复位。

四、源代码  

1、主函数

  1. /*
    2 Y9 V% Y/ p" D/ `, L' K% m
  2. * Name                : main) }" C8 P2 r8 R% d2 I
  3. * Description         : ---/ X' ?0 h' a% ]! S! i9 k$ ^
  4. * Author              : ysloveivy.
    3 x2 d9 g; b2 ~5 P' S% ]
  5. *
    " f' w" L, Y! a+ T# q3 K
  6. * History# [3 x! ~, W/ z: D3 }
  7. * --------------------' h5 v" P* X- I  Z
  8. * Rev                 : 0.002 ^5 ?, x" I- O6 V$ a2 ]' r
  9. * Date                : 11/21/2015- L, M! j& V5 `, }2 z
  10. * 3 a9 H* d3 E: c% L
  11. * create.3 l9 \+ H9 R+ |
  12. * --------------------
    " R) A- O3 E" h* Y
  13. */
    8 v/ q5 h8 [" s& s" l2 I& \/ }
  14. int main(void)0 \2 b7 X4 c/ ?$ h' ]: X- s
  15. {
    " C# D. R; I) e( r
  16.         int i;, I& J2 r9 G) b" n' l
  17.         for(i = 0;i < 10000000;i++);
    : }6 F5 j. l2 g/ N' d
  18.         led.initialize();
    . f1 k' e) @# V  k3 f
  19.         key.initialize();3 w7 i" k' e8 u! q7 {: [" q
  20.         iwdg.initialize();
    ( Q5 \# |) F7 S0 n
  21.         while(1){0 U" \( f9 S% y4 ~6 g& ^
  22. while(!KEY_INPUT);                          //按键按下进入循环,不再喂狗,1秒后灯熄灭+ o0 ?- K8 I4 n5 q; I6 j+ R7 z; ?8 h; R$ e
  23.                 iwdg.feed_dog();
    $ `5 O8 [6 N3 e
  24.                 for(i = 0;i < 5000000;i++);
    0 a/ j/ O. \0 |# Y
  25.                 LED_RED_ON;5 e! x8 P* \: P8 |8 T* b; d
  26.                 LED_GREEN_OFF;
    - }4 E5 @( E3 I. `/ g+ W/ G0 k2 N; I
  27.                 LED_BLUE_OFF;& j9 Q( ^7 G$ D7 E5 ?2 c- H& U! O
  28.                 for(i = 0;i < 5000000;i++);
    : c$ E3 i& |8 _2 t& g+ h
  29.                 LED_RED_OFF;9 j+ \' ?! x/ f: H% b% Z" m
  30.                 LED_GREEN_ON;0 l3 _( w/ D( ^1 o
  31.                 LED_BLUE_OFF;) p/ `: M. L; Y3 U# Y- M! N
  32.                 for(i = 0;i < 5000000;i++);/ v+ @3 d: U, N0 m% [
  33.                 LED_RED_OFF;* f, J) f( O/ S2 Z/ @, T
  34.                 LED_GREEN_OFF;
    6 _' w1 T! a) Q4 K9 n  K
  35.                 LED_BLUE_ON;
    2 M6 V% z$ G8 a8 g& w" \* U. ^! U
  36.         }( l% ~* N; j* v+ _  `9 r
  37. }           
复制代码

2、初始化函数和喂狗函数

  1. /*
    : t8 ?0 L$ I# N) m- a, G
  2. * Name               : initialize
    5 C2 B6 N! ], x* F6 x7 k6 Z
  3. * Description        : ---
    $ ?  H* w  \8 _$ v
  4. * Author             : ysloveivy.. B% D9 @- T$ N& F4 {
  5. *
    5 Q* P1 G' X$ z; a: f% s
  6. * History3 B; l/ G; \  j1 O4 a
  7. * -------------------
    % Y3 P1 n' Q" b
  8. * Rev                : 0.00; ^) V3 @9 _; X; z) e0 O8 K4 n. ^
  9. * Date               : 11/21/20158 Q4 J& {. b% g! K
  10. *
    3 i4 i: n: V$ b/ H1 Q8 Z& b
  11. * create.
    5 E+ _4 O7 [5 ]& C: }) }: @& L
  12. * -------------------0 k1 x+ `" I1 c. t+ U
  13. */
    7 t6 b' ?7 G8 |3 M' L
  14. static int initialize(void)
    ; t5 j' s# U" e7 s* K7 l
  15. {
    6 @% L2 n/ ?8 U& ^
  16.         //1s喂狗! e! l  w# D2 _  m
  17.         IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);         //取消寄存器的写保护
    ) |3 `8 L. D- t% R( I
  18.         IWDG_SetPrescaler(4);                                 //设置独立看门狗的预分频系数
    $ n+ D% Z: D& P7 Q* v
  19.         IWDG_SetReload(625);                                  //设置独立看门狗的重装载值
    1 F# ?( R( m9 n) S" C+ J  X' o/ T* z
  20. IWDG_ReloadCounter();                                 //重装载计数器* g4 a. b0 S9 c$ u' S+ T, ^
  21.         IWDG_Enable();                                        //使能独立看门狗2 m7 i/ ], H% K7 c  `

  22. $ }" X* Z0 t; P1 g& |8 b
  23.         return 0;
    5 n) G& J3 s, G1 {8 I+ j' Q  M
  24. }
    ( p+ ^: R4 n4 s' H2 ?* m! M
  25. /*0 T7 z8 M8 @& R) G5 y/ V. y
  26. * Name               : feed_dog" W) e6 o( K4 W: B  \
  27. * Description        : ---
    8 U+ L$ T4 \- i) M; m0 C9 ^: O0 ?
  28. * Author             : ysloveivy.
    $ I6 y0 |- \- m, {; u
  29. *
      ?) `/ A* p0 Y. E( i0 z. M4 L9 C
  30. * History
    ( l4 N8 v8 k7 R. z
  31. * -------------------
    % k% I% V, w6 {- s: E
  32. * Rev                : 0.00
    4 w( y$ V: a' l
  33. * Date               : 11/21/2015
    + i: f" A0 i, r7 b
  34. *
    % w# A+ d' t0 f: T
  35. * create.  S" `3 f; C; t4 e
  36. * -------------------1 J" a& p; }& o7 G1 v
  37. */
    + W' Z* p; n! h3 {
  38. static void feed_dog(void)
    ) W4 ~+ h3 Y" Z
  39. {7 @6 L" i2 I- N) F: z
  40.         IWDG_ReloadCounter();" g% Z" Z( Y& _6 O3 T
  41. }
复制代码
       五、实验现象

iCore3双核心板三色LED交替闪烁i,当按键按下超过1s,看门狗复位ARM.。

六、代码包下载

网盘:https://pan.baidu.com/s/1c0frjHm

收藏 评论1 发布时间:2018-3-9 09:22

举报

1个回答
zero99 回答时间:2018-3-9 14:41:49
感谢分享,已汇总到3月技术原创:0 T' N/ Z- y  U: u" a2 r
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版