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

【实测教程】STM32L4之看门狗IWDG实验

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:52
一、开发板平台简介:
2 o* M$ U: |* A/ u1、开发板资源简介
9 P" z' w! h7 Q0 V
(1)开发板主芯片型号:STM32L431RCT67 a3 o9 X6 J' R9 V* Q) W
(2)开发板主芯片封装:LQFP-64_10x10x05P& r  O' R3 \% q2 q
(3)开发板主芯片内核:ARM® Cortex®-M47 w9 x  Q; |7 s: f/ q
(4)开发板主芯片主频:80MHz% p- |5 o& |9 X% C0 u8 W0 @- o. c
(5)开发板主芯片Flash大小:256KB8 m" o" o( r: d
(6)开发板主芯片RAM大小:64KB% k: W) H; \/ R  X: f7 t9 z

1 W0 s; M6 J: m
bb91345227434ee7a43a34bf3fe366e6.png
9 {4 Z  f/ f3 c& ^) D' c- C+ j; w6 \. I
929c0cce04aa4115a8623703982bf3e1.png 6 f" s5 K  P  \8 N* K

) a; d" A! x+ x3 `6 c3 n$ o2、LED灯资源
  Q- s! s/ h: @8 A( D(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:9 J: r5 b5 w9 z3 t, z
# a( z! @. |8 V% O$ o
0f177691c5814f16a508bcfa747f87ac.png
/ ?1 M8 X& j/ ~% ]2 i% U! n6 Z( s0 a

/ e" _" H2 M8 Q( w# d1 [1 y% v# h(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:4 I4 d+ N9 Q" n' {

9 r% |" R3 t+ L" `7 g, w
e923ad767b8448b7ac37c4ed693724bd.png ' p$ ?% {! s& c  k- a
; c8 Z8 k2 `: R" t3 r! V: C
​3、看门狗工作原理
9 q; A8 _' b7 A( |1 i在由单片机构成的微型计算机系统中单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者因为用户配置代码出现BUG,导致芯片无法正常工作,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。' G$ y. O5 G) t3 v6 K
8 \- c0 K& |% X0 A* P& M( b
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动(40kHz),即使主时钟发生故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。4 P; |' U5 N$ l, y
窗口看门狗由从APB1时钟(36MHz)分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。 窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。
/ B, D% U  b7 G5 q# R) S- t  {" D, I
ee279a92a0b14df5aeede0df13dcdfe0.png 0 b( D7 a* M1 t0 @

8 d+ [0 j- ]  i' Z 本次看门狗的实验通过独立看门狗实现。7 I4 R" F2 I5 @# o  A  H* x' z
; ~7 m: u6 ^4 h5 c3 U

$ N1 ]% {& Y1 d. J  二、看门狗实验过程
0 |0 ]) z$ ?2 I+ }4 I9 C1、新建STM32CubeMX基础工程

0 h  B7 c+ Y. I, _(1)打开STM32CubeMX,点击“File”-->"New Project"
8 I" v3 ?3 d8 i; Z& x: \1 t8 p& b$ S9 A/ ?! o, U
2399170347904e959c855fefd5877f84.png
) V7 M9 T! S- W+ a% W" _8 T# G0 E7 T& z; @
(2)等待打开主芯片选项界面(大约1分钟时间)。' a5 p% [- w7 {$ M, H& [

5 @; M, _& X4 D* N: T1 Q
d74d2fdc60c9440483e2b7cf8d928e7f.png * I1 G8 [' c+ s# Y

: f% `4 b/ K6 g  \$ @(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
" O4 j" d6 Z/ O. i- q: }1 A; i3 G! r: Z
7b80345238d74bea82ce70e1a348f7b4.png
5 e' ^6 w8 w% x5 Z5 K9 F( `* k! @2 s5 Q* N
(4)选择时钟源。
& `  c, m/ Y1 ]: S" }7 g" e4 y2 }(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。' c' j: @1 m% o9 o: a

& F5 d8 y1 e# i0 J, \) P
3f65707eca104663a3dede6d25dfa961.png ) v* }) \* v1 _  I

/ n& w( ~" G  G; |& P(5)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
) J* M  \/ W& x% l) d& ]/ @/ M7 D' `. I; _
72119b971f62410fa8344f7f9fb9f389.png ( G: n0 U1 b9 `- d7 Q8 \8 t! w5 c0 }
9 ?6 E+ r! x  h0 f
2、配置GPIO控制LED
$ l" L" _: @5 i( ?(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:. O! ^. @' y; R( E
LED1——PC01 J' _* r  W- w* V# ]
LED2——PC1
. x% \4 _! p( v% }LED3——PC2
: [+ V' H& F' v3 A# _LED4——PC3
0 V, v& Z' {2 O) j- i, o% n0 W
  N5 ^  j4 Z+ `  P) {(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
: H- |1 z- b; {* ]! K8 N, o) e7 p1 g  a' ]! c
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
  a* h% ?8 U1 E9 i0 q1 n鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
" x) Q) ]7 y( y* T鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。& R+ t0 S+ R% C0 o, [, O- Q! P
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。/ F+ z& |5 b( D6 Y0 f8 Y' E( X9 d

- F' r, K: o4 X
492907c1e71149819adbaee4516a2af4.png ( P* Z4 m. D  Q2 L) u

9 W( y- j$ c5 ^& h  J8 V; P0 i- c
c75d3f10ba2e427d9c1a10fad9bf5471.png
9 E4 w5 w, e( @

: F0 C. }! `+ j/ F7 n$ Z. ~(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
2 o( J4 {4 a  i) u% e; g0 I, S" s! H, l3 s0 j+ V9 J% W
38ff4b80e1c5495ba3076a5158fd91fa.png # _9 I" Q, E* S- C

* {( S! L. v- d' w/ M​​3、配置IWDG参数4 e) C+ d1 Q! k

& a7 y5 x, d  U0 @: {' t" _6 g1 m
309e5486e4f14d2f8d5033b15e2acf40.png 5 \2 ~5 h0 E# H; \
0 f+ G5 W8 X1 r, X- v$ d& a- |
psc:32,j计数值:1000-1
' [4 s/ Q3 |, o3 t2 L4 }. E' ]7 B4 Q) U独立看门狗频率:32000/32=1000HZ(查手册可得STM32L431RCT6内部LSI时钟频率32Khz)。$ y# l/ p5 X$ l8 ?9 c2 \; X
所以从1000减到0,所需的超时时间为1s。
& z7 m2 U, ]' r4 \' I4 m6 a+ z' a
; z% C. t, S/ N对应不同预分频系数的PRER值:) \$ H' G/ Y' a; u
6 ^1 G/ ?0 {8 j' q7 Q7 f+ c" i3 D
d791c7eb4c2441b3b69ed99ebe72413e.png 3 m( c' k; Q" m7 k7 w* Z4 t9 o6 y0 r

( y1 i" N3 F/ a1 {7 K- K2 \ 3、配置项目工程参数. }2 p7 r  ]( v) Y
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。: B) q9 |* R! ^
4 G9 E( K6 [/ U. _4 X, x. }6 n
f3ecedd9323f4463b69539906b3c1199.png $ G# q7 N6 l/ b* @
: ?5 J1 g- [/ y$ D; I- @
(2)完成配置工程。
4 _& B4 i) N% ^0 }5 ]; `8 S- M备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)! ~. l- z7 V! r6 g* O
' E3 ?% y' c) S1 S
efdb616174f54925b6eac31109f227b5.png
, y( h2 D2 L0 B# g$ e3 p) S3 o% O; w2 s​​+ V: D6 p* }9 c2 |" o! z
41c3f2716e4e4eda8f62fa3a1d871322.png 9 g5 T4 }" m' e! p, l

/ z) I( q* Z" O- ^(3)生成代码。
* U: w5 I3 F; j5 u# \  D7 l备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。0 }9 R0 ]1 S8 E. r( n( c2 V4 J
9 ~" p+ u5 ^9 Q8 \  [
8eaa7d0babea40ee93f158481a6ee471.png 5 |! r7 j6 C1 ?& T
​
1 w& p: H$ f: `# t8 r(4)工程代码生成成功。
7 v6 i7 p6 O5 ^. v7 S3 T; l' M2 B0 c8 f4 G4 x- y6 _  _% l  ^
e8f46d59a1fb4af589feb613fdff17b4.png
; j2 Y9 t$ j) H8 ~5 J5 k* f7 x( U4 b3 Z8 O+ v$ a
三、在KEIL 5中编写代码
5 x9 D% o0 R5 i0 r1、使用KEIL 5(MDK)打开项目工程文件
0 r9 l: ^% y: W8 j源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
7 p$ s# l, Z2 Q8 ^, R(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。6 k' I3 o+ G5 M( j8 _
; B3 O$ ]9 Q$ o  N# d1 i! E) M
bcd4797c7da0458dabfa49a6f67a9c58.png " z9 Q$ o% W; P/ f) a0 I6 P

5 z+ T5 a8 v7 j# |& f/ Q2、添加LED+看门狗验证程序
6 z0 ]/ F3 H2 _# @; }0 C$ K9 T(1)在main.c文件中,初始化LED1、LED2、LED3、LED4并默认初始化状态为熄灭,进入while循环常亮,并添加喂狗函数。+ b* X' U! `' g  C- h  l6 ^
+ E8 N; |' @# D/ N# i
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。  e' r. i& W) W7 c
( a0 [6 b! f: z: I7 |5 D
0be5c19e82114761b8f17119038f0d90.png 9 S+ o+ N" g9 d
2 R* \3 r# a/ _' M
(2)main 函数代码如下所示:
. E/ @' S" Z- E3 e& r- B
  1. int main(void), o: V. C# Q' h- Z
  2. {, h3 F1 M" l- x# ~( h, W
  3.   /* USER CODE BEGIN 1 */  y" F8 x- |& i- D
  4. ) N: l( E6 E& s+ r0 H* _5 A
  5.   /* USER CODE END 1 */
    - m$ X. j% \( D; V

  6. 1 |! F! U1 P1 h+ |1 y3 ~5 D
  7.   /* MCU Configuration--------------------------------------------------------*/' {+ [" G: z" p% [' r( K& e2 _
  8. % i. U' k" B3 t, W+ y3 J0 ?  _
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    + x/ K. v9 o3 ^' Y; L
  10.   HAL_Init();4 h# e$ J6 o! `& B& t( C- f" r
  11. & i6 [6 u6 Q8 j5 F0 q% X
  12.   /* USER CODE BEGIN Init */
    ( F0 ]) T/ K( d% G" D+ _
  13. * U4 ]* n# E4 g1 H# D( r9 \
  14.   /* USER CODE END Init */
    ) {/ f$ ?. L3 q( _% E6 z  g9 B

  15. 4 s! z- Y0 a/ N
  16.   /* Configure the system clock */
    ! t9 J7 ?" W* M7 X
  17.   SystemClock_Config();
    2 z$ S8 A1 h' y( z
  18. 1 F/ x3 Z8 p4 o  Q( O6 r
  19.   /* USER CODE BEGIN SysInit */# j5 r9 _/ X! a; Z" u9 v2 p

  20. 3 D( c- H4 f" W; c8 G
  21.   /* USER CODE END SysInit */
    ) o$ K6 w6 t8 B# h/ T# P6 ]

  22. 6 C" L. |# C& m
  23.   /* Initialize all configured peripherals */5 f+ n- m8 v, g2 y4 A8 |
  24.   MX_GPIO_Init();$ G# U3 B! r& U) E; S
  25.   MX_IWDG_Init();9 V, o* X8 s; p  Z3 [5 B* ?
  26.   /* USER CODE BEGIN 2 */
    & H  g6 V! L0 T; [( N
  27.   HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET);//指示灯熄灭
    3 P. s4 c5 A; z7 M
  28.   HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_RESET);" i) J- ?# P! y: _7 y
  29.   HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET);& F2 Y5 U8 D. `; V7 x- X# u
  30.   HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET);8 B3 ~/ R2 w& d& {. }- c. i5 a
  31.   HAL_Delay(500);+ d( I# C" d; F  p! W! M" l/ T0 H
  32.   /* USER CODE END 2 */
    ( \+ f" F. e+ M" G, o
  33. & ^* F' v5 }, M% q) ~; K' B
  34.   /* Infinite loop */& i! f  y* ~& \5 C( L8 s4 F
  35.   /* USER CODE BEGIN WHILE */
    # _. ], R$ A; u; D4 C& a
  36.   while (1)& f$ T0 |* {1 e% q( K
  37.   {. D$ G- l2 m' d. o! z
  38.     /* USER CODE END WHILE */
    6 S3 X; u* e! Z
  39. 4 f$ k- ?+ F) R% _9 \
  40.     /* USER CODE BEGIN 3 */
    - V" x4 q% @. m3 v& i' u: P2 V
  41.         HAL_IWDG_Refresh(&hiwdg);                        //1S内喂狗                          - D% O) e0 i0 j. M9 a: Y
  42.                 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);//指示灯常亮$ B  G8 j& s! t& X7 U: \
  43.                 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
    + Q7 A( H5 R* P9 o
  44.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);
    6 T$ O- H! G* k$ m
  45.         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
    8 O5 p% e" X8 Z; l* {* D8 I/ i9 l
  46.                 HAL_Delay(500);
      ?- [$ Y+ q3 s
  47.                 7 E4 X) i2 D8 s% y- v5 |
  48.   }
    5 u2 `0 I3 ?; [
  49.   /* USER CODE END 3 */
    1 `0 S4 V/ j. K9 J- u( e
  50. }
复制代码

4 E) x5 G. R8 X2 F* \3、设置编程仿真下载模式# E3 C; B0 l3 Z/ U* }
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。5 U: ]: @* [: c" Y; N0 k

2 v) q! x/ }" ?& Y1 f% [
edefb6b9a2a14be3b1221ad6d5c7a8a2.png % q; H8 U) x; y) p, c  ?+ w
​​( r$ F& d+ R( w+ @4 ~0 o& {
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。  Z' U6 O4 l" T( f! c# w" _$ u  Z( t/ g' ~

! x  ^# y* d$ j) t5 R& J; Y
6a7e14d4a6c7419897ed550d010a9cd2.png
; T. i2 v1 D1 C5 g* F0 B4 n7 ]3 r​
9 s# @. `, y6 o% |" S(3)点击Download(或者快捷键F8),即可下载程序。/ K5 F, u$ i1 W  _/ A

. _* h- o8 D; T7 p9 [
99bdf89cc1f64cc7aee4b4d768206f24.png % J3 N3 B  W( }! H
​​
# u9 C6 n( Y3 h) _0 a$ j+ T3 t3 K% j/ K$ I
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4点亮,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
  R9 S6 O: Q# f5 P# f
- ?2 C, z$ @! \0 }
9f8aa1a4e8f04041bcf5cb183facd100.png
& a* u: O" B# T% S. P6 \: `# }% ~6 R ​​8 X2 {4 v4 b7 H% h$ M  X, i6 ?
4、独立看门狗效果展示
" ?8 E% j& n3 ]. F* \, B9 G* S        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后常亮,说明看门狗喂狗正常。如果屏蔽看门狗喂狗函数,则可以看到指示灯闪烁,说明系统超时复位,LED灯重新进行了初始化。
/ j3 C  \. m1 c! x- I! t7 q! n$ m& h
————————————————
9 z; e5 [% K, a版权声明:智能小屋ZYXC8 G5 B# g; f' C' j
! O. }* G7 j/ n% X: N
+ @7 K$ P- J+ M: s( n5 h4 X
赞 收藏 评论0 发布时间:2023-1-14 18:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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