一、概述
. ?) 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
图6_0独立看门狗框图
图6_1 32kHz(LSI)频率条件下IWDG超时周期的最小值/最大值框图 二、硬件电路
图6_2引脚分配图
图6_3电路原理图 在iCore3双核心开发板中,采用一个独立的按键与STM32F407的PH15相连,限流电阻为1K。 三、实验原理 STM32内部包含独立看门狗,通过看门狗可以监控程序运行,程序运行错误时,未在规定时间喂狗,自动复位ARM。本实验通过按下,停止喂狗,制造程序运行错误,从而产生复位。 四、源代码 1、主函数 - /*
2 Y9 V% Y/ p" D/ `, L' K% m - * Name : main) }" C8 P2 r8 R% d2 I
- * Description : ---/ X' ?0 h' a% ]! S! i9 k$ ^
- * Author : ysloveivy.
3 x2 d9 g; b2 ~5 P' S% ] - *
" f' w" L, Y! a+ T# q3 K - * History# [3 x! ~, W/ z: D3 }
- * --------------------' h5 v" P* X- I Z
- * Rev : 0.002 ^5 ?, x" I- O6 V$ a2 ]' r
- * Date : 11/21/2015- L, M! j& V5 `, }2 z
- * 3 a9 H* d3 E: c% L
- * create.3 l9 \+ H9 R+ |
- * --------------------
" R) A- O3 E" h* Y - */
8 v/ q5 h8 [" s& s" l2 I& \/ } - int main(void)0 \2 b7 X4 c/ ?$ h' ]: X- s
- {
" C# D. R; I) e( r - int i;, I& J2 r9 G) b" n' l
- for(i = 0;i < 10000000;i++);
: }6 F5 j. l2 g/ N' d - led.initialize();
. f1 k' e) @# V k3 f - key.initialize();3 w7 i" k' e8 u! q7 {: [" q
- iwdg.initialize();
( Q5 \# |) F7 S0 n - while(1){0 U" \( f9 S% y4 ~6 g& ^
- while(!KEY_INPUT); //按键按下进入循环,不再喂狗,1秒后灯熄灭+ o0 ?- K8 I4 n5 q; I6 j+ R7 z; ?8 h; R$ e
- iwdg.feed_dog();
$ `5 O8 [6 N3 e - for(i = 0;i < 5000000;i++);
0 a/ j/ O. \0 |# Y - LED_RED_ON;5 e! x8 P* \: P8 |8 T* b; d
- LED_GREEN_OFF;
- }4 E5 @( E3 I. `/ g+ W/ G0 k2 N; I - LED_BLUE_OFF;& j9 Q( ^7 G$ D7 E5 ?2 c- H& U! O
- for(i = 0;i < 5000000;i++);
: c$ E3 i& |8 _2 t& g+ h - LED_RED_OFF;9 j+ \' ?! x/ f: H% b% Z" m
- LED_GREEN_ON;0 l3 _( w/ D( ^1 o
- LED_BLUE_OFF;) p/ `: M. L; Y3 U# Y- M! N
- for(i = 0;i < 5000000;i++);/ v+ @3 d: U, N0 m% [
- LED_RED_OFF;* f, J) f( O/ S2 Z/ @, T
- LED_GREEN_OFF;
6 _' w1 T! a) Q4 K9 n K - LED_BLUE_ON;
2 M6 V% z$ G8 a8 g& w" \* U. ^! U - }( l% ~* N; j* v+ _ `9 r
- }
复制代码2、初始化函数和喂狗函数 - /*
: t8 ?0 L$ I# N) m- a, G - * Name : initialize
5 C2 B6 N! ], x* F6 x7 k6 Z - * Description : ---
$ ? H* w \8 _$ v - * Author : ysloveivy.. B% D9 @- T$ N& F4 {
- *
5 Q* P1 G' X$ z; a: f% s - * History3 B; l/ G; \ j1 O4 a
- * -------------------
% Y3 P1 n' Q" b - * Rev : 0.00; ^) V3 @9 _; X; z) e0 O8 K4 n. ^
- * Date : 11/21/20158 Q4 J& {. b% g! K
- *
3 i4 i: n: V$ b/ H1 Q8 Z& b - * create.
5 E+ _4 O7 [5 ]& C: }) }: @& L - * -------------------0 k1 x+ `" I1 c. t+ U
- */
7 t6 b' ?7 G8 |3 M' L - static int initialize(void)
; t5 j' s# U" e7 s* K7 l - {
6 @% L2 n/ ?8 U& ^ - //1s喂狗! e! l w# D2 _ m
- IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器的写保护
) |3 `8 L. D- t% R( I - IWDG_SetPrescaler(4); //设置独立看门狗的预分频系数
$ n+ D% Z: D& P7 Q* v - IWDG_SetReload(625); //设置独立看门狗的重装载值
1 F# ?( R( m9 n) S" C+ J X' o/ T* z - IWDG_ReloadCounter(); //重装载计数器* g4 a. b0 S9 c$ u' S+ T, ^
- IWDG_Enable(); //使能独立看门狗2 m7 i/ ], H% K7 c `
$ }" X* Z0 t; P1 g& |8 b- return 0;
5 n) G& J3 s, G1 {8 I+ j' Q M - }
( p+ ^: R4 n4 s' H2 ?* m! M - /*0 T7 z8 M8 @& R) G5 y/ V. y
- * Name : feed_dog" W) e6 o( K4 W: B \
- * Description : ---
8 U+ L$ T4 \- i) M; m0 C9 ^: O0 ? - * Author : ysloveivy.
$ I6 y0 |- \- m, {; u - *
?) `/ A* p0 Y. E( i0 z. M4 L9 C - * History
( l4 N8 v8 k7 R. z - * -------------------
% k% I% V, w6 {- s: E - * Rev : 0.00
4 w( y$ V: a' l - * Date : 11/21/2015
+ i: f" A0 i, r7 b - *
% w# A+ d' t0 f: T - * create. S" `3 f; C; t4 e
- * -------------------1 J" a& p; }& o7 G1 v
- */
+ W' Z* p; n! h3 { - static void feed_dog(void)
) W4 ~+ h3 Y" Z - {7 @6 L" i2 I- N) F: z
- IWDG_ReloadCounter();" g% Z" Z( Y& _6 O3 T
- }
复制代码 五、实验现象 iCore3双核心板三色LED交替闪烁i,当按键按下超过1s,看门狗复位ARM.。 六、代码包下载 网盘:https://pan.baidu.com/s/1c0frjHm |
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html