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

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

[复制链接]
STMCU小助手 发布时间:2021-12-9 11:07
概述
/ k' A% O. d! V系统窗口看门狗(WWDG)用于检测软件故障的发生,通常由外部干扰或无法预料的逻辑条件引起,导致应用程序放弃其正常顺序。 看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。WWDG时钟是从APB时钟预分频的,并具有可配置的时间窗口,WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。
7 G. a: P) d7 g7 T) C# j: @2 [! r
主要特性 % h( |8 p# z/ n( P; @
激活窗口看门狗后,如满足如下条件则重置芯片:3 K% I! T9 e% D" u* h& l" F

. [3 Z' c6 J7 `" i当递减计数器的值小于0x40时! [& {/ ]5 t+ x# W
窗口值外重新加载递减计数器
8 P+ v( d7 V; e4 P6 v) e! Z( K# R) H如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。
. Z4 N* O* _$ ?  H7 x, [# x1 w% o7 k1 d' f$ W. w! g- {
用法

+ B3 [8 ?1 \+ S  `* g: ?. k/ h5 d' k如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。0 P( ^- D: e; E4 A: @
; d- D- h# @9 ?1 {
在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。5 K$ D7 D0 h+ v# t6 D0 D

5 _9 q+ K: r- t' _. W' ~: D4 V6 x框图7 e" _+ V; u5 s/ _! ]

' d2 V, g/ M( ~$ i
20200524174123541.png

) T6 q4 a! Z' }1 @
! D* d- X" o3 V8 i启用看门狗' D: P2 O& @% r8 z# a9 c
当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。3 m- |, C. L9 |
当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。
* Y3 Q, T, P  W" G递减计数器用法
6 W( A8 i9 ~2 {, s7 g/ g该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F);
- s$ z# p$ }* X1 a8 G% N) F# w: P
为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程:
& Y0 M- N1 u1 W. ^/ N3 B8 o. i* a% t  b* V
20200524180957776.png

9 N+ G: w; _  N. `
3 r/ u3 G: }) H. A+ g$ J 提前唤醒中断(EWI): U4 Q2 P4 f( n' Y% s

) X7 F- u- R) M% k3 K* `+ [0 |4 G6 K 通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。: l; d3 u6 Q9 O0 t
  Q. P, m$ P! W' w, Z- w, k  ]
计算超时时间9 p9 a, m# y0 z- p

8 z6 i2 W4 j) C  \2 [
20200524184059993.png
' k4 i2 R, }; H/ x5 U6 \
4 l, y+ d# B& ?+ d0 v( t' z; C
如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时;0 B2 p: Z! Z* J, S

5 W/ _" k# t* @, S' R7 E
20200524184304815.png
6 y2 J, _2 N1 `# K3 B, C

. b+ V* \( v! u6 ?% I寄存器. C; |2 B" }/ _1 A% ^7 ]* J7 Z
寄存器可通过半字(16位)或字(32位)进行访问。
6 k, e4 }" h* n3 u9 a1 X0 U% D6 `3 z
7 c' V  T2 U7 S 控制寄存器(WWDG_CR)

, w$ S4 S$ q! S) v( y% O) [2 E" o; g* N  r& t! q( t# n
偏移地址:0x000
- `0 \" @, u% U; L, d( z
4 c+ t8 q- Q; G8 A: S- k: I/ R" M复位值:0x0000 007F
& E' C& v* ^$ [) t4 a
! N$ ~' b* y* b' ^5 ]+ z; \BIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗, ?$ F$ l3 ?9 V- c7 z* f. q7 _
! a  `3 f5 O: C$ B. ^- f& j' S
BIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除)
" b, S0 V2 h& U% i7 N- c; L
# s  G" W! a( |& l7 U配置寄存器(WWDG_CFG)" [5 e: k( t: c) I, V
- w' S# j' q5 B1 D
偏移地址:0x004
- @# t4 }4 F7 \
. _: }- }! _1 N/ o9 q7 S复位值:0x0000 007F0 T5 j+ l8 Y9 p$ b; A( k
9 Q1 s3 g$ A# q3 m9 J( p& ?
bit 13:11 WDGTB[2:0] (r/w),时基
, i- {: r& L" \/ g2 z6 M  Z
& Z/ B/ Q  k& P& i& b& _0 D0 p000: CK计数器时钟 (PCLK 分频4096) 除以1) ^( I+ n6 c2 j% T
001: CK计数器时钟 (PCLK 分频4096) 除以20 p7 e8 S# ]* A' ^
010: CK计数器时钟 (PCLK 分频4096) 除以 4) `/ b9 c: Y9 E3 y  x
011: CK计数器时钟 (PCLK 分频4096) 除以8; q8 d+ W% T' I3 n( J9 N" N
100: CK计数器时钟 (PCLK 分频4096) 除以16
+ v# F: `: n* \& `. p101: CK计数器时钟 (PCLK 分频4096) 除以32+ V  y% c9 y1 }' u
110: CCK计数器时钟 (PCLK 分频4096) 除以643 H" x' b* a7 e2 \' F( M7 ]
111: CCK计数器时钟 (PCLK 分频4096) 除以128  R  y) p9 A4 i0 m

# w2 t2 C4 F, K6 b# G4 |9 bbit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。
, n- j+ v$ t; V
8 t, J8 C9 U; P/ K% Q, H! obit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。9 `, x9 M4 Y* z6 V3 i& k$ C
6 m, E/ g5 h0 M% S; K# B
状态寄存器(WWDG_SR)
. B$ p' U' b* ^# p' J3 v& B+ z, r" j$ y- P$ i! v' {5 X
偏移值:0x008
6 d2 P3 l1 h3 `) b5 K  O  Z! R4 J1 S0 l% X0 v
复位值:0x0000 0000  C1 W8 x. \$ Y! m$ E# k

6 A3 C" @. s  O# p3 J) Zbit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。9 |# A4 H" d8 h6 r
8 B! Q( g+ |, h
实验示例! G1 m8 d/ m* P* H* |  a1 x
1、开启调试接口、HSE
2 V- r- D6 i* U
: v; a; r6 Y( ?) A- p
20200702225341466.png
/ F/ K  ^% ]8 O# w: g, c  D  G
9 Y8 p# |# Q& r5 W2 Q+ f
20200702225405256.png

& \- f' Z! E: k1 a% g5 x* X" L  U: b' d) a0 w
2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断% O. J$ t9 N) F7 Y; I( A# j) a9 b
1 r4 |2 q# S$ t6 ^/ L/ \9 k
20200702225814679.png

& b/ n2 m/ x* b/ O) i
. y  z2 i! Z; S3、使能USART1,使用异步模式,波特率115200,8,none,1
: D( O1 o( S  d/ l3 H4 c
6 S) D& Y6 K. }% |! ?! y
20200702230037736.png

. w- w, c) ]$ W* A
, T0 q+ `/ G' S
20200702230050880.png

7 x! Q' [3 d3 e0 j6 g6 }9 G& i$ G
4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127
& w* y# t) J' Z1 p" E
7 n1 u( e4 ]% E2 n
20200702225845997.png
# }4 C- l5 Q' D
- S- B* E, h4 x& e2 y
5、设置时钟树,HCLK=64MHz、PCLK=32MHz
6 E( a$ P3 K; ^) s* b( K0 a" F6 O6 {% w5 @1 x# s) t
20200702230304582.png

/ f' k7 ]2 x, W9 O" M6 \( Q
$ l, G0 ]9 `9 x$ g% z" }6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间
$ K  z* \4 j5 T/ J1 k, p1 M* ~0 X0 t0 z
' T% d7 C5 @: g* L1 @5 X) Y   =1048.576ms
. e# A! A& U. {" Y: _! R
! H6 I4 s7 Y: C0 }9 q+ w$ f即每1048ms喂一次狗。
; J( |. `! z, ]* T. ]& g& v3 H% R) O8 ?0 b0 e  P7 `
7、设置工程文件属性,生成代码。! `6 }  g: k) O- G6 [% |4 j  X
- e: j8 N% s+ I. A. w
20200702231252969.png
# X4 K3 r) l9 E  @9 d: _! q$ Z

4 n& n0 _% h# L/ B0 y
2 \/ [, Q  B" p) D' t6 W" v* L
20200702231302949.png

- C7 e! s8 I% t5 a5 N6 y
. m0 g- {6 E7 d, w! @: s
20200702231406699.png

% I3 K) T# c7 \- k  p% W! n
9 ]& Y2 \  K4 L
& A1 h3 t! t0 G7 t6 ]4 T6 J% h9 d代码 ' R1 y+ \6 g* u/ \
1、在USART.c文件中加入串口打印代码8 o% x, c: F+ _7 d
  1. /* USER CODE BEGIN 0 */! a; x' C2 K) K
  2. #include <stdio.h>
    ! y& m' w  }2 s! y7 L3 `
  3. #ifdef __GNUC__& O" Q3 u& t( j1 P0 N3 C7 C+ U
  4.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    & b& R1 |- Q+ L9 o1 V
  5.      set to 'Yes') calls __io_putchar() */
      \2 z" y8 i+ y# p
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)3 ~9 s8 E7 Y0 W6 z6 ~
  7. #else3 e8 N1 v3 d' X
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)8 K/ R; S7 }+ d: `, K8 \4 _
  9. #endif /* __GNUC__ */
    ) }+ }3 {6 P7 F) m, f: J) P
  10. /**
    " S4 T$ j; k$ p% J) J$ _; h& i, f
  11.   * @brief  Retargets the C library printf function to the USART.
    1 Q& i  e( i1 V$ n1 A0 o7 G7 M
  12.   * @param  None
    / S% T: ~+ i2 w  b" D3 K4 j
  13.   * @retval None# F* z2 J+ x3 w3 I6 z
  14.   */
    ' z$ S7 F) X; y% F+ J! p" `
  15. PUTCHAR_PROTOTYPE
    % Y. [/ y6 u( e4 f6 K4 s6 }
  16. {
    6 S6 g0 F' J9 L. Z
  17.   /* Place your implementation of fputc here */
    5 S* ~/ \! v5 i) ]3 [  Q3 A
  18.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */3 q/ E2 \- i4 @6 i
  19.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);- A- g  E2 X1 Y- M9 S9 {
  20. : j0 i/ {9 q+ \9 q' j% ^! R
  21.   return ch;
    " z6 P6 k0 J; N- O( {5 H1 p
  22. }
    ' O% z: o0 q- {' `& w
  23. /* USER CODE END 0 */
复制代码

/ z" G/ `% B3 F2、在main.c文件中加入开机打印代码,2 k7 p- }) Z4 g5 S2 G0 o) h

" s- t0 \& i# B% x' j) D* F
  1. #include <stdio.h>
    8 d9 [3 y* L3 n! G; x6 L. ]
  2.   MX_GPIO_Init();
    ! }1 L) x. E, s- U
  3.   MX_USART1_UART_Init();
    8 Z1 Q+ }+ R. I
  4.   MX_WWDG_Init();
    , R* W: ^2 z) ]# [6 I5 N
  5.   /* USER CODE BEGIN 2 */
    8 L7 k/ t# @5 Q' o1 x9 m8 d
  6.   printf("...RESTARTing...");    //开机打印! p5 J/ l3 G1 Y4 k6 @' I; `
  7.   /* USER CODE END 2 */
复制代码

8 N/ w/ g" F; D) U! S, K加入EWI中断代码
. \  |* @$ K6 W# l9 v2 r6 a! B" z6 u: v8 e' G- O
  1. /* USER CODE BEGIN 4 */
      L9 {9 t* _( |
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
    . ^2 v! J" R+ ^  p
  3. {' c, J; E6 P8 Z, @
  4.   /* Prevent unused argument(s) compilation warning */, ]0 C/ ?: f4 T5 y( T  S. h" ]! U
  5.   UNUSED(hwwdg);4 l9 x; C. M  w$ c; U- N0 T
  6.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))         //检测PA0是否按下,按下就喂狗4 ~5 p0 x5 c! X2 A& A0 |# C; L  C
  7.   {
    2 z8 i- j" }( O* M
  8.     HAL_WWDG_Refresh(hwwdg);
    ! N$ g; C6 z( r8 z0 I
  9.     printf("Refresh,OK");                & X' L! B# f: a
  10.   }
    . r9 [/ X7 f- K; V: C8 u
  11.     else
    : L  W- Q! R2 F. E
  12.   {: z+ U# Q/ P7 k& f: u1 ?6 `  k0 O
  13.     printf("Fail");
    7 f2 P8 L+ a# }# J! m
  14.   }
    3 a. l" f4 r. {% f, X8 M* \
  15.         __HAL_WWDG_CLEAR_FLAG(hwwdg,0);               //清除中断标志
    1 X3 s9 p6 C% h5 k( f
  16. }
    ( Q2 {1 e7 p! H2 B/ c
  17. /* USER CODE END 4 */
复制代码
* J0 I3 W& T! `  C8 _
3、编译,烧录之后就看到效果( E9 T5 W$ {1 h- n) R9 A
' @0 ^- E# y* z; h% E  R
20200702232811689.png
' P8 n" z- r. \6 v3 E

$ {) l) v4 ?1 J5 T9 ?2 r/ ]
# M% q% Y. Q" Y9 s2 ?4 |4 G+ s8 k
7 B5 Q, ?- f/ }& i+ o( P
赞 收藏 评论0 发布时间:2021-12-9 11:07

举报

0个回答

所属标签

相似技术帖

官网相关资源

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