请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-12-9 11:07
概述; o  F( `# ^2 W# M, B
系统窗口看门狗(WWDG)用于检测软件故障的发生,通常由外部干扰或无法预料的逻辑条件引起,导致应用程序放弃其正常顺序。 看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。WWDG时钟是从APB时钟预分频的,并具有可配置的时间窗口,WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。
5 y3 R/ T* R" Z( ~- ?$ o  f& p  [( m; Y: j4 {; w9 n- e% s$ }
主要特性 7 }. E& @( i$ a- `0 \7 V- q
激活窗口看门狗后,如满足如下条件则重置芯片:
4 ~5 K; K) R( o( e& U& e. o) q8 l/ A5 O) J8 ?! {- |
当递减计数器的值小于0x40时! M6 f/ {3 Y2 F6 e
窗口值外重新加载递减计数器
) d6 c* R- y# |% o' @* y# M7 z如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。4 T1 Y1 N+ }( d8 I

3 I3 f) l8 `8 v用法

, u1 S8 d& S& _+ A( Y* }# C# Y如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。+ R- l0 ^4 J/ g

4 W' }& R1 d- t: J在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。
; l* H3 ^+ y5 E- R; V+ _: c! A
& o  @" \6 n4 w1 ]框图. ~9 j. ]5 Q% B" d
6 b9 r+ i8 ^# A0 {8 u
20200524174123541.png
( v* w8 N2 y. z% T) t* \) k3 W

9 O! V' q0 v' p; \启用看门狗
" ~* i! K3 ]/ o% q当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。
( F* H7 A7 n9 y- \4 o0 t+ s4 O! Q) d5 D当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。
6 |" L& o9 e" y+ U9 D* M  w: ?递减计数器用法
1 o8 c+ V$ @2 B( u$ D; Q  `该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F);
8 r# U9 Q8 f' k) z; t
  a9 W, {' \5 J1 ~4 W5 o/ i5 N, E为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程:
- h8 W; D* h, j# w7 u, j
* }- X; j$ ~4 A) `; _5 l8 p% Y4 Y4 K6 K
20200524180957776.png
  y% p: r9 E; A8 |4 J( p
5 X+ r; s( x$ y9 [" W; R# K% u
提前唤醒中断(EWI)
4 m5 b9 p4 @" ^$ Q0 u
) Q/ f9 e- p% S  O1 X! o- e 通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。
5 i2 O: v0 L- _* n. V! m' ^) {7 O
/ j1 j: u% ?& g% Q) Z( z计算超时时间6 e% g! U% p- A- i9 J( w
' }$ j3 m0 a1 U& X) ?& ^
20200524184059993.png

2 N) V$ V$ M/ x3 I6 i4 N& g& S$ ]
如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时;6 t  I0 l- p7 U
& |9 W6 L4 N0 J" e. k1 }
20200524184304815.png

9 V- r/ }9 f9 D5 Q1 @- f! f) X* Q. D9 {9 H  m6 {1 T' A
寄存器
( C* m! r, a+ l- l6 U0 L) l寄存器可通过半字(16位)或字(32位)进行访问。
; G  S% z# [4 ]; [1 W  X( N8 G1 r0 v' k3 l! l( j
控制寄存器(WWDG_CR)
' M2 r+ ]& _3 x
# C- x, Y7 ^+ {, m
偏移地址:0x000
) P/ u6 m: |( g  A- ~* v3 x1 D) q& ?4 w" ^4 V
复位值:0x0000 007F6 R, o  X2 `( u; N- R1 }+ E
6 \! W: U, u0 Q, h: x
BIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗
4 |; \. q" J" d# g
4 t4 I3 ?" l  a5 ~- J5 Z0 BBIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除)' q. A; {3 I1 D7 P" j3 m4 w
+ O0 n( S7 c6 D1 K
配置寄存器(WWDG_CFG)/ y" s$ x: o4 _5 s
7 z% i. u1 V* `- _: ]8 p
偏移地址:0x0042 M( T, T+ Y& W
3 C: S6 ?/ a1 U/ _8 h
复位值:0x0000 007F2 M" D6 y& v0 q3 d8 x) d
& T% k4 Q( [4 D
bit 13:11 WDGTB[2:0] (r/w),时基& y6 C  m; `9 C* [7 _5 H" c9 o7 J, ?

3 b) J, u) {% i. T000: CK计数器时钟 (PCLK 分频4096) 除以1& K7 d' t4 F- K; N1 b
001: CK计数器时钟 (PCLK 分频4096) 除以2
7 U+ P+ F! s; s5 d8 w% h010: CK计数器时钟 (PCLK 分频4096) 除以 4
) i! X* @7 X( F8 I# a, C0 N! Z011: CK计数器时钟 (PCLK 分频4096) 除以8
1 M( O& P' U: i$ _/ d' v9 u100: CK计数器时钟 (PCLK 分频4096) 除以16: R5 v4 I6 U5 s6 ~
101: CK计数器时钟 (PCLK 分频4096) 除以32
  O3 Q  |3 S& W* y+ O2 h110: CCK计数器时钟 (PCLK 分频4096) 除以640 J7 a) R* f% T* J2 N& f: ^
111: CCK计数器时钟 (PCLK 分频4096) 除以128
) [' P9 u& y' E5 j8 @" K
: K8 ^0 W+ W) f, Q. v+ ~6 |bit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。, I4 f9 l/ W' Z7 |5 {
- {2 W& F1 U. F& L  ?& `
bit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。
. k( A  {  N( ^* C! {' m7 @
" H9 j* O, P* Z) i$ Z" P! h; k状态寄存器(WWDG_SR)/ G# S) e4 K) I; B) k- E* y

& J7 i1 {* R! ~偏移值:0x0080 x! R) J9 o) t/ w: z
4 F1 u8 k+ [* {) w  b
复位值:0x0000 0000
8 n2 E/ ~6 B# [7 F; {0 `0 v7 h3 f/ f$ K
bit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。) T3 f. f; V5 A
, H: F% M4 e7 b0 b
实验示例
2 n) Y/ S8 x4 h# @! h1、开启调试接口、HSE  L6 D6 u8 l9 J& ?
8 t; ^; ?8 H: v' m
20200702225341466.png
" X9 g! ]7 b' j" r6 v: s1 o2 X, W

) D9 f- A; s5 `. T( T4 u& v% m
20200702225405256.png

2 y8 ~' j- t! g  n2 S- C" T3 G. G0 p  m. u9 p
2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断# R1 \8 c* _' t+ \: C

) m  M  e2 s& ^3 e  G) h
20200702225814679.png

" O  ]: ~2 u  v/ |
/ p7 T" j  Z- u, d3、使能USART1,使用异步模式,波特率115200,8,none,1
2 d; H" ~7 R* E+ j1 ^$ g9 I- w! \9 E, n9 {
20200702230037736.png

* [, Y, T' [$ U4 S" h6 [/ Y# i% l: e8 h* t
20200702230050880.png

. `! V: K, n) H( V. }" R: L9 A0 Q. E+ |' z0 S
4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127: |/ B7 b& {% s* \

- K$ j& [  s  S/ J9 `* Z, h
20200702225845997.png
$ C* h9 _6 R# c( ?3 h% Y
( e; _  G. a) i* s" g
5、设置时钟树,HCLK=64MHz、PCLK=32MHz
0 B+ A' ~. x- p/ _. Y1 C# [- m
8 d$ U4 o7 U# O- a$ V7 G# N7 G0 D
20200702230304582.png
4 Z7 I1 \7 T6 T1 h7 K6 }
! A8 m; j0 ~5 P6 R0 F% b
6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间
' ]* x% J; @/ g8 G5 w* L; x# I! O  w0 H: j5 j  ]- J9 a2 e/ ]* d
   =1048.576ms
* C1 B# i6 x9 ?) C  y1 {) ~2 Y  \# _
2 R2 u  c! z0 f  j& n4 T即每1048ms喂一次狗。
" i) C9 B0 t. Z  ?2 v7 @. J7 N
7 X  X$ {* N. V$ m+ K0 {+ u" u( a. {7、设置工程文件属性,生成代码。
$ z" S. Z  x! @6 y" ~2 v
+ e8 m; h+ P( m2 ^# }; g, ~( N6 j
20200702231252969.png
; z7 W6 S2 l, ?- P0 W

; a$ d& N5 u' S! S& i9 |: Z9 _* ~% F; o9 v0 n/ z/ Y. Z' k# v- R
20200702231302949.png

: q5 z! f5 P+ c' S+ X8 l, B
5 N; d  G; ]# ~4 B3 H. c# Z% h
20200702231406699.png
3 M$ Q; v7 X) ]3 e2 N
( r/ O  ]. R* O
* [; Q/ i3 W7 W) e7 @' m9 D3 k
代码
7 a4 S. @- P; B- W1、在USART.c文件中加入串口打印代码3 n% R3 ^0 ?9 n/ I4 ~) r
  1. /* USER CODE BEGIN 0 */) x4 x  ~* W7 y# p* R" P0 ]+ m
  2. #include <stdio.h>
    9 q+ U2 ~) w+ A  O
  3. #ifdef __GNUC__; K# ]! x' Z3 n; I. e. E% N
  4.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf  `& G2 Y% Y% [0 Z; v5 X0 `
  5.      set to 'Yes') calls __io_putchar() */
    7 m5 [; s$ q+ r
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch); \0 k3 u* B+ t; L' l5 r) J9 K
  7. #else" u, o+ r* k& M7 o( j% m0 N
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)/ X& b, L: P1 E
  9. #endif /* __GNUC__ */' W+ N; g' c. b$ j  U/ f9 D
  10. /**
    " U. T; g9 q) }6 _# ^
  11.   * @brief  Retargets the C library printf function to the USART.
    ( a0 P0 f/ h" U& X' M
  12.   * @param  None8 d( n: e3 H/ E0 O2 [& X
  13.   * @retval None, o7 W" d: {7 f# w/ q1 U4 J
  14.   */
    , x) D8 t0 k# g# h# K1 |6 P
  15. PUTCHAR_PROTOTYPE
    ) h) H' m4 I. k7 x: I% e1 \- O
  16. {
    + r4 j% o7 A, e: y# R- m# m* T
  17.   /* Place your implementation of fputc here */" |! T# G6 q( t" d
  18.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */6 x3 \4 N9 d& B4 X/ N! y! U7 p: _5 x
  19.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    6 j+ Z" ?7 a0 a8 x# ?% M

  20. ! w1 L' x' ?4 j. M
  21.   return ch;
    $ L; ]! Q7 [6 C3 s! _" Z  ~+ j7 K3 r8 E
  22. }
    / N7 t! L1 H* `- u3 Q
  23. /* USER CODE END 0 */
复制代码

' D  u+ D5 q$ S& a. t0 ^9 C2、在main.c文件中加入开机打印代码,& h9 R$ ^: p4 N: K/ c% S
! J) `  e' P  A' D2 @2 |
  1. #include <stdio.h>8 F, K) Q5 H5 }* e0 v( ]
  2.   MX_GPIO_Init();
    + L# Y. d2 I+ n! K; [! z* _% g; q; Z
  3.   MX_USART1_UART_Init();- k" G8 W7 X$ t3 W  a! j+ H
  4.   MX_WWDG_Init();
    ( l0 l4 G1 T, x. T) k7 e/ n: d2 Q
  5.   /* USER CODE BEGIN 2 */
    5 W/ ?( n# X% q2 K# x# K' \
  6.   printf("...RESTARTing...");    //开机打印
    % ^4 S& K: k7 v9 G5 ^/ g# i) T: M: k
  7.   /* USER CODE END 2 */
复制代码
. b1 X! ~+ ?7 c8 ^; l$ T7 U. ^! g8 [
加入EWI中断代码
+ Z  n  z% k; q, d, d3 [, d
+ j" q$ x, y# \& Q, g# s
  1. /* USER CODE BEGIN 4 */( Y8 H" R9 Y7 B- }- w1 D1 N
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg); e) U/ L! {4 O( y/ S5 b' I. O$ P
  3. {
    , w. v8 c0 [' s! V2 C6 D
  4.   /* Prevent unused argument(s) compilation warning *// n, \. _5 j8 p' F2 P
  5.   UNUSED(hwwdg);- s) ]! A/ f1 O# P& P6 {' C
  6.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))         //检测PA0是否按下,按下就喂狗
      t1 v1 d* f% Z' |- w1 k- k
  7.   {
    4 n- K3 m! |5 @7 o" B
  8.     HAL_WWDG_Refresh(hwwdg);
    8 W$ x$ x7 f9 W3 E
  9.     printf("Refresh,OK");                ' O/ Y% c! ~/ w- A2 l, i
  10.   }
    0 s3 v1 Y, ~: M3 L! w; ?3 |
  11.     else4 M( H3 W, w6 q# [" u9 U
  12.   {- f1 M6 [& O5 |; b
  13.     printf("Fail");8 B4 E0 V2 a" L4 W9 N0 r: P
  14.   }
    2 ^. t7 t6 K! z4 E
  15.         __HAL_WWDG_CLEAR_FLAG(hwwdg,0);               //清除中断标志
    & x6 O% Q- x" O- i! J( [
  16. }9 n# t( p0 V+ C8 }" \) K
  17. /* USER CODE END 4 */
复制代码

6 g' }) ^" {: E3 @1 u+ H. c; h3、编译,烧录之后就看到效果: m7 g" T6 u) b  l" M0 c

/ q5 Y  s! @7 M3 H
20200702232811689.png
, o: [# U# c/ Z2 [0 B* p4 K6 V! ~' S

: {( V7 i5 T0 Z+ W' I6 u+ I' l  Q+ p/ K6 m4 ]0 b
$ Z2 M3 a/ _: v) ?2 a
收藏 评论0 发布时间:2021-12-9 11:07

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版