独立看门狗
# r2 A% F3 e2 [- t# Z F$ x! | ^1 Y9 l0 v. ]4 G6 [) v* Q) ]8 [
1. 独立看门狗简介. K* u' h8 F. W
看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统
6 ?* R0 D+ ?$ b( u- zSTM32的独立看门狗(IWDG)由内部专门的40KHz低速时钟驱动,即使主时钟发生故障,它也仍然有效。注意IWDG的时钟是一个内部RC时钟,是一个在30~60KHz之间的一个可变化的时钟,只是我们在估算的时候以40KHz的频率来计算,看门狗对时间的要求不是很精确
$ f+ K1 u, ?) K& p5 X6 O8 K5 z, n; }独立看门口功能框图如下。实际上独立看门口狗是一个递减计数器,当计时器的值减到0时,IWDG会产生一个复位信号,系统复位重新启动。为避免产生看门狗复位,则需在计数器减到0之前重载计数器,即“喂狗”。当程序出错时没有刷新计数器,计数器递减到0,系统复位重新启动,避免程序继续错误运行
6 H. i3 J/ |% R& d# {0 N
' c* h& v8 K8 b4 `: Y" |8 t9 \. l) x4 d! I" e/ l
. |9 E( b! ?9 N0 Y# \/ o
独立看门狗超时时间(40KHz的输入时钟LSI)
& R) J* B% _7 Y, ~/ [2 s3 a4 p3 V, W, o1 K& z# _% z
7 j4 t/ _. A2 m3 V! V0 }( x2. 硬件设计
& Z* p% l$ N- N# O* q使用USART1来打印调试信息,PC0用来指示程序是否复位
( r u" R. o7 M; @# l* x3. 软件设计3.1 STM32CubeMX设置
. E* @7 M( m% y9 X0 r- RCC设置外接HSE,时钟设置为72M;IWDG的时钟默认为LSI时钟
- PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
- USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位8 S2 \7 N1 t9 Y2 J+ q0 e
$ t& T- P6 L3 ]. i Q& O$ l, v7 z1 }
2 A4 X w# M. o9 ]- 激活IWDG,IWDG的时钟为40kHz,此时设置计数器时钟为32分频,则分频后的时钟频率为1.25KHz(时钟周期为1s/1250 = 0.8ms),递减基础器重载值(down-counter reload value)配置为1000,即800ms不刷新IWDG则系统复位
$ k, w' _7 n/ v
( ~% G# r& V7 i" c
- 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码
, E$ C% M( ^! t( y, V
8 Q+ o6 j7 W o0 Q) E8 G
$ E7 @! l% m: y/ |
& v0 |' `" x4 l3 D3.2 MDK-ARM编程
/ H: j6 l1 j; R" X& a$ J
- \. n; K; z7 b L- void MX_IWDG_Init(void){
' X( B# D _* K0 c( o- e1 }. i - hiwdg.Instance = IWDG;1 _& V7 u# N" V" G% W* O
- hiwdg.Init.Prescaler = IWDG_PRESCALER_32;$ @( n/ ]: [+ f5 e* k( O) v9 b
- hiwdg.Init.Reload = 1000;
" n" v2 ?$ j. T j/ e( O - if (HAL_IWDG_Init(&hiwdg) != HAL_OK){' g. d5 L8 q' A0 ^9 \; Y/ R
- Error_Handler();
# Y1 V/ I/ _2 } - }) h$ k$ o( b1 ?
- }
复制代码
# v; o3 P' i4 L g2 Y- 在main函数中编写代码,while循环里每500ms喂一次狗3 }$ H( U3 T( q: `( g' g' N
- int main(void){& S$ ^- L& |" U+ n1 s
- HAL_Init();
7 }, M( m0 W6 x: [; r4 N* J" y - SystemClock_Config();- |. g* C7 C+ M0 T3 D f) |
- /* Initialize all configured peripherals */# {& g, _ n {' t" L) E" E$ D
- MX_GPIO_Init();
: r, g5 w a& z# y* L1 n - MX_IWDG_Init();
# H) g( Z- w& I - MX_USART1_UART_Init();, Q+ N: [: v- f5 e0 A/ k/ M
- /* USER CODE BEGIN 2 */; R2 c3 _) [% E% B
- printf("\r\n***** AndyXi IWDG test program *****\r\n");- c! j1 S! c4 {# H* C9 q$ b2 z
- HAL_Delay(300);9 `0 A1 g/ {* Q) Y) o
- HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_RESET);
: Z, K7 c' a L! u9 f( v - /* USER CODE END 2 */
8 v N. m. }& v* W0 w$ z2 j$ o - /* USER CODE BEGIN WHILE */% v# D) V8 o% x* u- M* T$ h
- while (1){% |) `3 l3 u) f5 `+ o
- printf("\r\nRefreshes the IWDG...!\r\n");1 G& I0 Q% K& Q0 B; p
- HAL_IWDG_Refresh(&hiwdg);: m! X0 v: v J: X: K! j: K
- HAL_Delay(500);
. M3 n, X; b/ u( c' Z - /* USER CODE END WHILE */4 Y0 H/ V( O/ Q7 K6 i6 Q
- }) y0 U1 Y0 U n' I8 b1 v
- }
复制代码 7 L5 Z5 T7 ~0 | t; p
5 s( K' e' \: _3 G- M& ]: A* x( _8 N1 d9 w9 |
4. 下载验证
( a. _/ X5 X4 X6 q1 O# _& d- while循环里每500ms喂一次狗,因此程序不会被复位,LED1常亮: v' W( @2 m+ O! Y5 B( r
" ~' p. {6 q9 @) j6 e
g7 I; y2 y! X( ]
5 U0 Z; p/ `9 d7 u. W! q" t1 z
- 如果注释掉while循环里的喂狗动作,程序会一直被复位,LED1闪烁9 m1 {' s- g$ g. k8 b. R+ E" _: u) B
* z* D2 F% V8 s! b
& C7 k7 h7 @7 r; `
; M. B9 q7 E5 D" W- J" B5 A* b% Q5 v9 l) }
2 q5 e" V0 n# H4 \9 P' m
5 k- a! D9 q9 E1 u) q
+ M$ \3 q- Z" M/ |3 U. b- c0 I/ o8 D9 J5 C
, N4 N2 U$ w- x( L' P& [- H% L# r) |* U
7 ~/ h* y. Z8 `6 B7 M9 ~
+ W$ ?/ f" x5 k% M. |
|