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

【经验分享】STM32G0学习手册——WWDG运用

[复制链接]
STMCU小助手 发布时间:2021-12-9 11:07
概述
, e4 @% x5 B% c! S9 f; `0 Y系统窗口看门狗(WWDG)用于检测软件故障的发生,通常由外部干扰或无法预料的逻辑条件引起,导致应用程序放弃其正常顺序。 看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。WWDG时钟是从APB时钟预分频的,并具有可配置的时间窗口,WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。1 g6 g5 C+ p+ Y, W# S: F% F' Z- I
! @6 m4 G+ C, D6 @( p
主要特性
/ a2 S1 u2 Q0 ^6 F激活窗口看门狗后,如满足如下条件则重置芯片:
$ ]  b6 C& f9 A& E/ w: ?9 E; Z8 l) U- a
当递减计数器的值小于0x40时
0 ~% i1 [1 B  c1 U( Y0 ?% O4 v% u8 V" m窗口值外重新加载递减计数器
' i7 l* q4 G6 e5 o如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。
8 W* [" }$ X+ l0 W- [2 Y. D" h, M, H0 F0 n
用法

. ]# R$ `' {* _# x4 T+ [) d; G如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。+ O8 J6 s. U" P: f1 q8 _; S$ T
4 E( O2 @  Y- Y! e6 F8 e" r* V1 R
在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。
& o& L) J: N- Y" ?( w% r  b$ N7 x' S1 e6 |. {$ g- ?# E
框图) C. X7 }# y" `4 k% v

9 P. t& k9 R5 [
20200524174123541.png

7 J9 W! l6 O/ C' U$ n4 ^4 h1 e, g' A& Z- Z# K# k
启用看门狗% j, H1 F5 O7 a
当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。, w( m; R( f& u: y9 w! B- m
当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。 0 H, e6 w1 U$ ^! ]) r/ Y
递减计数器用法
9 v9 ?( M$ C* Z# I' w' p0 ]该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F);
+ Z$ `6 N& }" `: h' q6 C4 b
6 b# o. x* a. A为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程:
) r6 l8 k7 E. D  ~) D, a7 @5 c
3 B  z- w; k8 k# ^
20200524180957776.png
7 }, f' L# g! _$ S

: t' F$ d% F: g3 Y- t) F 提前唤醒中断(EWI)1 f$ A1 c/ F' `, l2 w. G
+ @( c9 a9 @) i# Z$ y5 L/ A
通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。: S% q& d7 E3 [3 ~% s# j2 U0 g
# i5 \  O3 z5 ~6 [" _+ e$ G- m2 s
计算超时时间9 q5 N6 G8 g7 k1 J& F. \; P
+ {0 q7 y+ k) {4 G% v
20200524184059993.png

9 G0 c2 I2 r5 H1 d# [. o5 X. h# }) Y+ R, p- c
如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时;
# m2 n( e- b( D' d' s4 A9 l& A* c, z' R! C1 c- R8 Z
20200524184304815.png

3 a& l- u+ |3 E- W: W8 {: H& }' u/ E5 o/ `# O
寄存器
5 J/ d4 }6 t: w+ z$ D% K寄存器可通过半字(16位)或字(32位)进行访问。, A' R2 F: B1 P  P& \: w# A9 S

- q- ]8 z+ Q2 L 控制寄存器(WWDG_CR)

% ]' x: F- i( p' |/ f4 @! Y) t+ g7 l# e7 P
偏移地址:0x000
9 p7 N3 s# o, f! a8 J) r7 l& ~8 ^) R& s0 o
复位值:0x0000 007F4 G! r1 g1 S7 V" r# J% @# y# j
  d" G2 m. m- E( X- i
BIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗
& o% t" l* |5 V5 {% i& D- U/ |+ Q4 e
BIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除)6 Q, y/ E4 C; d4 Q+ M
* s, z, E4 q/ C$ p3 T6 H+ i
配置寄存器(WWDG_CFG)0 J0 J0 Q% g* I4 ~

; Y+ U4 l; `- A) X偏移地址:0x004
+ V; a0 O8 j% O2 u3 Y9 ]4 W* `; U! x3 v7 u$ U% [7 p
复位值:0x0000 007F
6 b5 N0 T- n. p) |; I, a8 E
0 @! o8 p& K6 r) Fbit 13:11 WDGTB[2:0] (r/w),时基
  B4 I( u: a, d7 e4 S+ M6 @4 `! ^) M; i# z6 ?
000: CK计数器时钟 (PCLK 分频4096) 除以1
; \7 h5 z# e, E8 k9 |9 f001: CK计数器时钟 (PCLK 分频4096) 除以2
. Z* B1 _" J( ^8 j6 K( Z$ z4 g010: CK计数器时钟 (PCLK 分频4096) 除以 4
) P) i8 O, Z* L( Q5 G0 R. Y1 u011: CK计数器时钟 (PCLK 分频4096) 除以8- o4 ?, i, m1 b5 h; z
100: CK计数器时钟 (PCLK 分频4096) 除以16# k6 b/ M! ^6 P0 d/ A# ?! s9 [
101: CK计数器时钟 (PCLK 分频4096) 除以32" Z! s6 _) U) [8 p% F$ H
110: CCK计数器时钟 (PCLK 分频4096) 除以64
7 l  D3 t8 i6 H% L111: CCK计数器时钟 (PCLK 分频4096) 除以1289 Y) |# `, u/ m5 B6 Z7 S
2 w  c% [  W2 K# N, B
bit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。, {% i! Y/ S/ A9 h6 m) L
0 W. V2 l- U; B' \; l
bit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。1 ]  }$ R& J" r, f) ]. R; G
- p0 P. Z1 r: H
状态寄存器(WWDG_SR)* o) E7 w& \% d# l: D
+ ^7 i- D( O( K' Y+ c/ y3 G
偏移值:0x0083 O$ D' a2 {/ `# d$ v3 `4 V# C; S# U
) ~6 a7 w. N) ~8 H3 _" o  O, i
复位值:0x0000 0000
: M- ?& D0 c1 w/ ?/ W; j+ X+ j& A: G0 ^8 u* o
bit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。& J% m7 r3 g. f  x4 T- Q
( D* {; M) @3 ]4 L: C
实验示例$ T6 W% M  M" u. S$ I
1、开启调试接口、HSE
4 r* W- ~- _' {- H: F! j3 n6 L0 E
! z: p7 O: z& J
20200702225341466.png

. w, i! z9 D1 x: W) v) u9 r% y9 E0 o. R0 A+ R$ ]
20200702225405256.png

7 f! {- b* A: f. J7 j
  w/ L; U* V6 `" e4 b2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断% e8 x% J6 L6 q# r
- i( D+ P! r$ `5 s
20200702225814679.png
6 j1 A: R& o$ p# v

) O' z9 H% H% n' f+ }# [3、使能USART1,使用异步模式,波特率115200,8,none,1
) ?; R! j+ e8 F: \8 ]9 `* }6 a4 T) L5 W9 ]  a! C4 y% ]5 q
20200702230037736.png
0 e" R# c; C0 V/ s! f1 s3 `) Q0 _

/ j5 g( V! H# c% G) m) ]  J  `
20200702230050880.png
) Q  L8 o; i% Y: g
; w2 ^7 }. }) g( x- c
4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127
3 \7 V& O  q9 s4 h, n5 G4 S
2 {- g5 t. J$ P
20200702225845997.png
' Q2 t) c+ }$ G
$ g, n9 i- F" c  c  w7 [7 K
5、设置时钟树,HCLK=64MHz、PCLK=32MHz, C4 K/ V  u/ z. B7 o( y

) V+ n( M' U2 p9 Z- g7 _
20200702230304582.png
3 q2 T- P! F3 a/ m; V9 z
/ T1 F5 z' \8 ?) G/ T" R
6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间
4 t: w- J; T8 u; |
( r0 l! L- R  h6 {" |3 R   =1048.576ms
: |9 {: C, i/ T2 b6 y7 V* {& Q/ y
, f9 W9 U. F5 g& w9 u% ~即每1048ms喂一次狗。* Z; ?# e1 B. u
' R" c  z: R8 t3 d( e2 A+ _
7、设置工程文件属性,生成代码。; C  _2 t( S" z& U$ ~8 N
" [" Z4 }8 L! X( U7 I: a
20200702231252969.png
+ h" H) ]  ~0 s' E) m, k( f

& q! o2 a7 r" b: O% S
& H* \7 d- b/ F$ r! r
20200702231302949.png

" h! q3 x5 q6 j! b) v8 N4 E
' y4 E5 w1 u" U( Y8 l
20200702231406699.png

: ^0 p7 b) U/ p: A( ~
/ Q4 o* y* }- }! L% K( ?
0 ]0 `3 Z' o+ g1 b代码 2 a7 w! J. z) [0 |
1、在USART.c文件中加入串口打印代码
- V7 M/ \8 q2 Q2 h  V4 M. Y! ?" {
  1. /* USER CODE BEGIN 0 */
    ' L' F& _/ K. ~/ N% M
  2. #include <stdio.h>
    & c4 K* l. _  ?# K2 K- T9 y' h
  3. #ifdef __GNUC__
    & ?4 _! P5 n$ ^3 f# E9 x& E
  4.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf+ r* [+ v3 P$ }' T# ^* H
  5.      set to 'Yes') calls __io_putchar() */
    - Y; C) Z" d9 v3 n! b
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    ) k3 |& Y8 Y5 n. Z% }* ?# C3 E- n6 X
  7. #else* L) k) Q, h4 o$ M$ g
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    7 N' Y% R& S; u
  9. #endif /* __GNUC__ */8 c9 y! T) t/ k$ i' R1 Y3 |+ Z& |
  10. /**$ J) }9 v) U$ F' r
  11.   * @brief  Retargets the C library printf function to the USART.
    4 }- X7 o' G" Y
  12.   * @param  None
    ! ?8 n8 f( z" I1 e
  13.   * @retval None
    & U) z! z6 m+ `- \+ M  h
  14.   */
    . }% x$ ~0 `, w  h8 |: D' ?' F" }
  15. PUTCHAR_PROTOTYPE9 ?; r5 {/ K2 [
  16. {
    ; H3 a6 ^2 n5 H+ h' u3 `8 s) w
  17.   /* Place your implementation of fputc here */5 m# |6 |3 x* V
  18.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    ! h6 H- R( F3 G2 h2 ?
  19.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    + t3 C9 n& T6 I$ M8 [- n8 w+ K

  20. 3 w% w. L; d" H9 q/ R6 r$ ?7 j6 \
  21.   return ch;5 U. K* {* v. O! q- M
  22. }
    * O, w: O1 |6 ?: n7 s# q
  23. /* USER CODE END 0 */
复制代码

4 t7 X6 [7 w4 x& H+ k7 c/ C- Q" v7 Z2 }( X2、在main.c文件中加入开机打印代码," [) u2 y1 [1 ?" [2 E. S
5 ?0 O+ M8 [  K9 j8 ]' m
  1. #include <stdio.h>6 U" E  b( E( d& m/ @2 w2 M
  2.   MX_GPIO_Init();& h9 W' I; f9 I( R
  3.   MX_USART1_UART_Init();6 e' Q& C5 Z. K) K3 O9 B2 n8 d
  4.   MX_WWDG_Init();
    1 B% J/ d. R6 o5 a2 M; Q
  5.   /* USER CODE BEGIN 2 */
    9 U5 I+ y5 L4 F$ S
  6.   printf("...RESTARTing...");    //开机打印+ f; S9 C$ ?8 r" w4 Q
  7.   /* USER CODE END 2 */
复制代码
/ b& E( [* ~  T3 Q
加入EWI中断代码
$ w9 s6 I. k" p9 E! R7 S4 P6 H% _2 |# z+ d5 `  S3 N
  1. /* USER CODE BEGIN 4 */  r' q+ _% I  n- p. D5 r2 S1 r, u
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)* E) \. O. Q9 {, P, T
  3. {
    & T" _2 E" k5 o1 Z  y1 Z4 F$ y1 t; |
  4.   /* Prevent unused argument(s) compilation warning */% t6 G  P- e: a% G3 V9 F
  5.   UNUSED(hwwdg);- x. I" I/ R5 y2 q
  6.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))         //检测PA0是否按下,按下就喂狗
    ; G+ F0 ]1 o. a8 T+ D7 o
  7.   {0 E8 S$ b% |1 \% j9 V
  8.     HAL_WWDG_Refresh(hwwdg); 6 i- ~/ O2 P! }2 f. O. s2 E
  9.     printf("Refresh,OK");                2 p* K4 n' y, Z$ h( a5 a# y
  10.   }
    ' J( c2 p* R: e# x
  11.     else9 h1 r  C  }$ q" s/ d; w
  12.   {" P3 P2 S. Y$ n2 A  y! b8 o
  13.     printf("Fail");6 a& M, e' `; s7 |& D+ l' `; {
  14.   }
    8 _0 M+ M% I! e  ]8 b
  15.         __HAL_WWDG_CLEAR_FLAG(hwwdg,0);               //清除中断标志( X* `1 M. c# P# B- B
  16. }
    , d; H# @* N3 h) R
  17. /* USER CODE END 4 */
复制代码
2 \! p+ t9 R7 p! \. Q0 q
3、编译,烧录之后就看到效果
: x3 R) Z6 v5 g7 F" d/ R' K# y( s5 p
20200702232811689.png

& q, K& K( A' n  l* R: `) \
8 I' P% J( i9 g: \% {: z1 T* ]( L5 ]" i% U" E- H

( Z3 G5 F5 _; ^/ ~: x0 z
收藏 评论0 发布时间:2021-12-9 11:07

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版