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

【经验分享】HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)

[复制链接]
STMCU小助手 发布时间:2022-3-25 11:30
前言:   今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学**HAL库 STM32CubeMX的独立看门狗,窗口看门狗的使用。本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用6 ~: [  T2 F9 U* p
' a) ?6 ~) i  j+ m' {7 P
所用工具:
( `$ P* ?. ^4 ~+ T
" I( U* o7 L/ A1、芯片: STM32F407ZET6
! ^" f# e4 R1 R: e" g6 u# `- R! `+ n0 a( ^$ X
2、STM32CubeMx软件
7 O1 U: u0 O: V
' W0 W" E  P& @. T; ?4 F3、IDE: MDK-Keil软件
" L' r" Y6 X2 n0 {
1 S/ c1 @* E: o) d3 {$ H" Y4、STM32F1xx/STM32F4xxHAL库 4 V$ c9 j% v9 ]2 d2 `! h

8 d& v' i% k& ?. F* p  P知识概括:* T; h0 W' \4 I; ~1 O( ^5 f' ^
' I  [: Y/ F) A/ f5 H+ A9 F
通过本篇博客您将学到:+ J+ B2 p  M# G* P4 u3 f! K. }' s

7 F( x# m/ \6 J+ v- u$ a  WSTM32CubeMX创建看门狗例程
4 L. T+ H, L, f% L+ z- y: [$ I$ Y) `5 e+ A& g. b! o+ U1 Q- U9 E
独立看门狗,靠窗看门狗 工作原理6 r% p$ j0 G3 f

- {# l0 @  N8 c看门狗4 W, b! Z; s5 B
在由单片机构成的微型计算机系统中单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者因为用户配置代码出现BUG,导致芯片无法正常工作,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog)
2 N* B$ W. k+ p5 P! Q' e' M, h4 F1 w/ s' d1 B7 I
简单说:看门狗的本质就是定时计数器,计数器使能之后一直在累加 而喂狗就是重新写入计数器的值,时计数器重新累加,
$ I9 W5 V( H; X
; {/ R1 ?( x) o4 \, a. A如果在一定时间内没有接收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)
. m3 [# E; J) ^. B* ?6 l6 F+ m. {, C2 O! G' z5 F" a5 h
STM32的内置看门狗
# r5 e1 u1 I  @
$ B& i! k1 x) v% U6 gSTM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗、窗口看门狗)可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。
% s" `) D8 R/ P/ S. V1 u
4 ^$ }4 ~. k& Z* V( F# f* f独立看门狗(IWDG)由专用的低速时钟(LSI)驱动(40kHz),即使主时钟发生故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
+ h$ d( ~( t8 |5 Y$ u窗口看门狗由从APB1时钟(36MHz)分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。  窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。( z. V+ e! Q$ M! }4 Z+ t

: u9 }6 ~7 r& y  M* I6 M- f `N)A6_TMKKR39AVDP8)T]9Y.png % z! U8 U, D4 ^' }5 z4 p

3 v! @6 @# R, B1 [7 W$ L5 M4 ?' P0 p1 `' E/ w' `' q1 j" W
IWDG-独立看门狗( J0 O6 J/ f- S* e
工程创建
/ ]( `5 }) K3 F1 W' _" y
1设置RCC
1 U0 X8 y( L3 b1 n7 H' o/ [) p& O. J; j9 |
设置高速外部时钟HSE 选择外部时钟源
( V& {& Y; p: {( b0 ^" z
7 ^  _& I, u; M; v; x3 F V`U0}E0EX01E6EA2KB736YT.png
, L7 e4 E" P9 l6 k2 Q6 V6 t0 E- S9 W( O/ I
2配置IWDG
& f5 e2 L5 d7 c, X" P7 S+ w: K& x6 t6 [5 X$ Z: W2 N
449J]V)]ATJNPI5~~}ZKATU.png " y8 o8 P# K5 h1 m0 v# u: z- O
  j2 B8 t0 m: i$ Q3 F% K
   IWDG时钟预分频系数  4分频   
% `5 q7 Z+ y- l3 a 计数器重装载值  4095   RLR5 h1 t5 a# m" d1 Q7 q( I1 C0 m
- s; ]4 J) m$ _0 n
超出(溢出)时间计算:: i: g* S) @+ g% k/ x8 p! `

/ [& q' D! W# |9 d. K7 ?) n0 Z) \                                                   Tout=((4×2^PRER) ×RLR)/LSI时钟频率
5 S% b' N5 i+ a0 K4 D' D8 d: F( q4 R
对应不同预分频系数的PRER值:2 F7 W8 k3 w% `! f$ u

6 g! K% x% c4 ?& v; `! a RM28`Y~~`(9)3JG$Z0B@B$X.png
. s7 b. U: q6 v
" K4 F" m7 r# e7 d( O$ e8 P+ m5 L3时钟源设置
& ]. p! R, M% B9 f/ q7 @$ d" g$ P, ]% w: \
N`FW2LE_{XB9M`$E%(9V$N9.png
8 s9 u, m: @8 _: ~% n& M' m" w
2 V2 |+ U( F  h$ U( R1选择外部时钟HSE 8MHz   ; B0 G) |' B0 |3 D5 [
2PLL锁相环倍频72倍4 x7 B* F1 \2 Z) z
3系统时钟来源选择为PLL3 m3 A5 C, P; m2 d
4设置APB1分频器为 /2! q4 |3 y2 d2 @- V! b7 _
32的时钟树框图  如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》
4 Y2 J6 O; Y+ U' `/ I- M! X( }, o. e, z* w7 i. E+ B" U  D+ z5 ~
4项目文件设置
9 p/ H! s2 W; s- m7 ^
- s  Y5 H- e8 e- J, o% z 8C~[TO[I}X]0A72GPUJU}]D.png + d. [% E% K# V! v1 C4 N1 G

4 j/ H2 ?$ p" P2 |- U/ }% i& W" U$ p1 设置项目名称/ v5 a0 n& h. y  S8 w
2 设置存储路径* I# f4 B# d7 I" z* d
3 选择所用IDE
+ [; w( ]. J* W- ?/ U0 l. _# V1 Y( X3 K7 K. F" g0 q+ {
AVBI~9H3@}6EDTR(`(~}M21.png : M! M/ a. [7 q$ c2 J( j9 G# t. ]8 U' K

" ]; r4 z) I4 c5创建工程文件1 I) `; `/ p* x1 A

# J7 o! k  }% M1 R# A, R然后点击GENERATE CODE  创建工程
0 M6 [5 N4 j7 W% `
) S' n- D1 A0 C: f" P7 o配置下载工具

6 n9 N6 r0 ^" U3 P5 ?" z+ B6 F7 u新建的工程所有配置都是默认的  我们需要自行选择下载模式,勾选上下载后复位运行9 V: _6 t4 e; s  O2 c) G6 w2 |
+ s& u. z+ P- o6 h' n
GQ{666MSOUAFNA33N5Q25NX.png
0 _3 V5 ~" m* l* y
: P+ v5 [2 [& l/ _" m0 IHAL库独立看门狗函数库讲解:
2 v: w. F( m8 ?$ s3 ]9 g看门狗初始化函数

) O- n+ u# W% u# `& }5 {9 l6 X2 i6 Q3 p! T0 e* a  i3 D# s& c
  1. HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)
复制代码
" A6 a+ Y4 A6 A) @
喂狗函数:0 E$ g& H' B1 c3 x# P( H( I
  1. HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
复制代码
  1. 举例:  HAL_IWDG_Refresh(&hiwdg);   //看门狗喂狗
复制代码
使用该函数定时喂狗即可! }. t% P5 L" w1 E- Z
+ I  l7 B+ Z6 a9 B
9 O$ q2 f  M  `
WWDG-窗口看门狗
' }& K2 i* |' v* l& f3 ~# _2 v# l
5 k5 a4 a4 j* }, Y- ]
窗口看门狗的定义
3 b1 S) ^6 w" M# ?; D- E# N窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值 0x3F 时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。  l$ z! r/ t9 E- m
. M7 C5 N# W" c* x. _( K) {
窗口看门狗之所以称为窗口,就是因为其喂狗时间是在一个有上下限的范围内(计数器减到某个值~计数器减到0x3F),在这个范围内才可以喂狗,可以通过设定相关寄存器,设定其上限时间(但是下限是固定的0x3F)/ O, v" u! n0 y; S9 D* x

7 q$ J1 Y8 K: D7 A& v R(_BX6V@QA(SBQ9J83Y(GVX.png + k. N/ p4 ]: h  Z' t5 \

6 v# y, j6 z7 q, w" _1计数器的初始值( F5 I. T0 f) ]+ v9 }  |
2 是我们设置的上窗口(W[6:0]值) C) \: ^* P$ c. i2 E5 D
3是下窗口值(0x3F)+ I4 r* W; G4 l4 t% B
窗口看门狗计数器的值只有在2和3 之间(上窗口和下窗口之间)才可以喂狗
0 Z# U; T/ C( N4 \; _  j6 s; [& I
8 o( a+ U' _, j7 s6 L5 L2 R窗口看门狗中断:: x% v) y: A* D% q7 z" u" B5 \

1 @: e' L+ I( U7 i3 A7 `并且窗口看门狗还可以使能中断,如果使能了提前唤醒中断,系统出现问题,喂狗函数没有生效,那么在计数器由减到0x40  (0x3f+1)   的时候,便会先进入中断,之后才会复位,你也可以在中断里面喂狗( Z: @- x, k" g6 B6 I
1 h: q3 O) Z7 k8 R: b
WDGG窗口看门狗配置9 M) v5 M4 n0 F5 \/ v) X

4 S/ W! }! i$ b" N. @8 ], ] %7G)U`%HNCK3V{G~EJ8P@%6.png 3 d9 L8 s2 O0 m/ [& p0 Y
$ x4 ?7 B. q6 R4 a/ c7 Z! ?& [2 `
1.点击WWDG$ r  `* p) s9 Y% G% V; K
2.# h7 o/ T' A% R. i1 |
WWDG时钟预分频系数  8% O  b7 E3 L0 k# {8 S; S& G
WWDG上窗口值 0x5F
$ l4 O& d8 x8 q$ c; H9 |2 h& G6 tWWDG计数器值 : 0x7F
" o7 J" x( T& l6 c  g7 g8 [设置看门狗提前唤醒中断
6 F, c! ^+ l3 W9 _5 Z! t7 X3   # M9 K9 o& S! j( k  f
使能窗口看门狗中断8 z: V9 n, W7 B$ S& |
) ]1 E. M$ W6 E: p
其余配置与独立看门狗相同配置即可( H+ ~8 T+ o8 k& a

9 h/ M7 n, t/ s4 EHAL库独立窗口狗函数库讲解:

/ N5 S3 _0 m! R+ K0 K. [4 N3 q# |看门狗初始化:. v' B$ a- A7 {+ O9 N: \, P! i
  1. HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
复制代码
% s- ^2 ]+ b- s% A
喂狗:# @! ^9 w- e0 r$ P$ ^2 F# ~- g
  1. HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)
复制代码
- T! r% g7 ^# E" l: R* [3 E
看门狗中断处理函数:
- Y/ n& J1 h7 X' h2 d2 U- A3 ]
  1. HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
复制代码
0 B/ U8 Y* i; `& I3 S" H  T, V
功能:  判断中断是否正常,并进入中断回调函数4 L  p2 h0 b5 B7 U' w2 M8 a

8 D. p7 ]; N; d4 X看门狗中断回调函数:
( X, L* X( ^1 ?, G" k# n# G/ t/ g
  1. __weak HAL_WWDG_EarlyWakeupCallback(hwwdg);
复制代码
9 W' ?8 f; [. |  c6 I/ ?7 B8 t( I% S
在HAL库中,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中,

1 Y* `/ g3 s5 M& Z+ f0 W
, D- n: y! F2 |1 Y/ K  [9 B+ O% |看门狗中断运行完成之后,便会进入看门狗的中断回调函数8 p& O6 b' ^  z

! J2 \: M3 {# n; ]例程实现:8 z/ @" z8 F- s5 P, ?& E& q
本例程实现LED点亮延时300ms闪烁% m' g& l$ \1 `/ C- G
/ M% I" M/ H6 M% U) ?9 M7 l% I
在main.c下方添加中断回调函数

1 r$ k1 i6 e. O* a. J
6 T  q. e9 s8 J: `
  1. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
    7 Y3 x  q: V: I  }
  2. {/ P, W$ s' \0 R
  3.   /* Prevent unused argument(s) compilation warning */1 a2 E$ L# S  O6 ^3 i- R
  4.   UNUSED(hwwdg);4 q- h2 Z9 d5 y, a
  5.   HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15);  //LED翻转  --闪烁表示喂狗成功
      L3 m# N! b( a
  6.   HAL_WWDG_Refresh(hwwdg);      //喂狗
    0 l: F8 ]! ^. ]: d/ ^5 N0 E
  7. }
复制代码

/ t; g9 C" G2 o9 c) Y9 v
& m6 v3 S! d4 S3 Y
8 ?8 A, X2 g* d1 {
( C: a% Q- _( m$ O  _' j4 V5 {2 L, S. |6 O7 ?3 P

* x6 B: d0 h8 k. c
赞 收藏 评论0 发布时间:2022-3-25 11:30

举报

0个回答

所属标签

相似技术帖

官网相关资源

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