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

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

[复制链接]
STMCU小助手 发布时间:2021-12-9 11:07
概述# I- P  E& _/ j  s& w
系统窗口看门狗(WWDG)用于检测软件故障的发生,通常由外部干扰或无法预料的逻辑条件引起,导致应用程序放弃其正常顺序。 看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。WWDG时钟是从APB时钟预分频的,并具有可配置的时间窗口,WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。
# I" P% ]7 z/ V5 }2 }2 o. C" j% e  k7 M3 ]
主要特性
( ]6 ~2 V2 q2 C. X- q) T激活窗口看门狗后,如满足如下条件则重置芯片:% n" A: y' M+ J, `/ @' a1 U0 \" e0 _
* @; i- w+ E9 t$ M" u
当递减计数器的值小于0x40时
* X% ^( v+ o( e6 s! p窗口值外重新加载递减计数器1 z  k4 Y5 ^8 [  U
如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。
3 l" l$ c3 h: K  G5 f+ \6 Y4 A9 {7 N- V4 f
用法
. L8 L* }( s' Q1 [5 f/ }
如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。
0 M6 I. K1 E$ B" G) }( {6 D' ]& p- @. ~% g# j& b, t
在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。
7 k0 x. w1 G# y( @1 a6 \/ h* f" ]
框图
9 [& ?! |! Y* r5 M) }: [3 L. V, x5 q/ ~2 d# k
20200524174123541.png

9 P) ^2 P2 r, N  C. ]% h* V, z  F( J; ?1 U8 b, ?
启用看门狗" G: N( H+ V" E1 ~6 ~3 ]6 b
当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。
* ^: L& j- j# N8 y当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。
9 v+ P* p" J- a5 V递减计数器用法! G# o' V) M8 ]9 K( l& A
该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F);
9 @6 O1 [9 P& Z/ {, }$ C( C$ {( w7 X2 W6 E. q
为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程:
/ ~9 c; i" ^! ~& w' t: w. F8 ^: f# R+ N8 A- u3 B1 l2 O; m7 V5 w
20200524180957776.png

/ `8 B4 G* T( F8 C; \$ ~& y& E# P/ o% K9 L1 I
提前唤醒中断(EWI)
) |# H6 c) s" Z7 R. A& A  r/ t" B2 c
通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。
( a! S& h2 ?  ]1 m$ x3 r7 H- n
* l7 Z0 T5 W* x% I# z7 Z6 y计算超时时间
5 c8 T% c% p7 p& T" D; S( ?( x+ p* o0 d# x  z
20200524184059993.png
" ?  c$ T- i& b% K
6 y7 a( C$ {0 @
如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时;
: f  ?' g3 M1 c, Z+ e9 A1 U0 Q0 _- j7 F: A; q. h: l3 N
20200524184304815.png

7 |- Z0 I8 |2 n9 l' J; e3 N& N( z; h
寄存器
* |; V% x8 M) {  g$ W4 w9 g" @寄存器可通过半字(16位)或字(32位)进行访问。1 p1 Q) x" z! Z4 F7 X& e

& V  ?5 |. P, T, J! Q( Q 控制寄存器(WWDG_CR)
. e9 {# s9 ^6 X/ I& d9 _% b+ E
" E4 ]) _. ^* z; i0 |/ R2 B9 C
偏移地址:0x000
( {3 t* I& s: _8 B; @
' ?0 q; }4 k% L. [3 ~0 f复位值:0x0000 007F0 }* i! I$ g* t1 ?

7 Z: K, l4 m# I  g) }+ o' U" IBIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗& n# R  c; s- \1 P; d/ p
; I2 k1 {' W$ i9 P9 ?
BIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除)8 r: R9 o- c9 E7 R1 ?7 N9 R

, x# v  ~* C( h9 I配置寄存器(WWDG_CFG)
* ?5 X$ m4 J/ j* y% B# H
/ t: d( b5 T. K, |8 {) h偏移地址:0x004
) @( q/ v) I# P4 g- H" l- X) r/ f# P2 A$ P
复位值:0x0000 007F
* ]' L2 g0 N5 {+ M- f9 M0 f& d& ]2 j3 Z) a  b; c
bit 13:11 WDGTB[2:0] (r/w),时基
$ j  {7 K/ L( \( Z; h  y2 x$ i- }1 s& M& z7 K2 \9 ?
000: CK计数器时钟 (PCLK 分频4096) 除以1
! ~  e5 Y0 ~2 b. y" i. A) f001: CK计数器时钟 (PCLK 分频4096) 除以2
) S- r' U8 a6 t6 U6 g, }. n/ ^010: CK计数器时钟 (PCLK 分频4096) 除以 4+ ]' k2 t. U) l5 P# l! t
011: CK计数器时钟 (PCLK 分频4096) 除以8
. E9 W7 B6 n' _5 f/ `( |' S100: CK计数器时钟 (PCLK 分频4096) 除以16
5 T% V* r) ]* _5 v" x101: CK计数器时钟 (PCLK 分频4096) 除以32; Z% V" Z3 c% ?
110: CCK计数器时钟 (PCLK 分频4096) 除以648 T5 e3 ?' o+ Y' h0 p
111: CCK计数器时钟 (PCLK 分频4096) 除以128  a/ T1 H1 [. h8 c% C

# ]% u% a7 q3 P( D. jbit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。
! ~( I: _5 B  p
2 ~" B/ [" h& hbit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。( g2 Z+ G3 {: T) j& e( \

7 I" ~/ D1 d1 X- }( @状态寄存器(WWDG_SR)
) Z6 ?/ F/ E  O+ @1 G( n6 i* b* V
/ D' J* M  f1 M- q偏移值:0x008- ~' Q7 S$ |2 K, Q
5 O7 H5 J" {! |% `; ?
复位值:0x0000 0000
$ u- x5 @0 e& d" ?' e' Y. |3 H! _* Q) X  ~7 E" d; b! F6 ]
bit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。
6 m1 p/ W. c' r0 x6 S: U; f
* {& q. p/ q9 W) W8 O实验示例: Z$ n, ~0 l# F7 v! q" Q0 S
1、开启调试接口、HSE4 [6 |* D9 \! b
& j8 l2 `; ^: {4 E
20200702225341466.png

, ^/ ^$ w- n& X, W, J( }0 }
' P+ _6 G: F* E4 A2 B
20200702225405256.png

/ m  \- i2 Z8 M- w+ v& e' G& j2 e/ Z! J
2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断
; ]8 g5 t* _4 m) Y) p" _2 B" r6 h' y1 i5 G3 R. y
20200702225814679.png

, X6 ~' s5 z! L  S
, _9 o) _/ ?* A+ _7 g* Y  {9 j3、使能USART1,使用异步模式,波特率115200,8,none,1+ t  H  Y/ q( u2 O. g* K
4 C; o7 z/ D1 y1 ?" l+ r
20200702230037736.png
7 ~5 j- E: C/ M- z* m* s  {

$ ?* R" Z( ~; z' K
20200702230050880.png
/ N& D, }3 }" A% i

% G* R; p  j0 L7 a; g4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127
7 N- H+ L' |) Q
/ n4 ?5 N* D9 E" q* r0 E% `6 T+ x: [: B
20200702225845997.png

- `1 m( e; q4 \& B/ Q( D: M5 F# v& h9 `
5、设置时钟树,HCLK=64MHz、PCLK=32MHz, E6 P7 u; N9 D, v

. p' H- I1 e+ l# T9 l8 I8 z- D
20200702230304582.png
4 K& e: h5 P8 Y; n) [# {1 G; a- `9 \
& \# y, \8 f8 f
6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间
  F9 i. G& @( @1 V( O2 U
& g. C' f$ r2 \5 l' t. d" ^   =1048.576ms- {3 ~: ?, h5 u" y9 ^

, x) c3 O( [1 A4 l8 v即每1048ms喂一次狗。
9 h$ s& m0 n: E$ ]
! e+ e/ A% ~4 E# q' s* w7、设置工程文件属性,生成代码。( w/ q4 q6 M" X8 S! `5 f
2 @0 s% ]& T& r
20200702231252969.png

$ i3 E9 N( T0 G, L! k0 v+ p9 r$ u/ p( q3 l. E2 a2 ?  T2 J

. m8 ^# ?7 C+ h! Q1 i8 G+ M
20200702231302949.png

7 K7 N7 |$ Q& I9 h3 k2 f& P) R3 W- g5 R) m' h  _: K) b
20200702231406699.png

  G% ~/ W  T  Q' {, k& B- v' r+ l8 M* Z: X

9 f9 t- E4 k) q* D$ y代码 * Q2 y4 u# Q. t
1、在USART.c文件中加入串口打印代码
8 x+ e% _6 B, a, z1 y
  1. /* USER CODE BEGIN 0 */, [" G$ x' V" e  o3 r- e& a; O
  2. #include <stdio.h>
    " d( s6 |( `7 j7 ~# c8 f
  3. #ifdef __GNUC__  G7 h* ]3 W5 C8 v$ j4 A3 y
  4.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    9 b+ y% L0 X& d) |: x
  5.      set to 'Yes') calls __io_putchar() */
    % V% u3 t6 E4 d1 h! B4 b% r
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    0 R; C+ ]2 H' w
  7. #else7 W* O, ?4 d+ f. q+ f& m8 X
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)& W/ `, Z7 m' A( P" @2 i2 w
  9. #endif /* __GNUC__ */& H0 b- d; l( [8 ]" x1 m8 r! f$ ~
  10. /**7 S' v- l1 u( e
  11.   * @brief  Retargets the C library printf function to the USART.- V/ Z9 S8 E. Q
  12.   * @param  None
    1 s: L( h! w+ A) l: r
  13.   * @retval None2 w+ ]0 A1 ]/ d
  14.   */
    0 C; W- h$ w4 f+ a, S% X: p
  15. PUTCHAR_PROTOTYPE  @5 F& u" l/ [' I
  16. {. k1 @, i! C! [- W8 c7 o
  17.   /* Place your implementation of fputc here */
    # A+ D7 W) _5 M! u9 ]
  18.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */- |1 p$ [& }) @
  19.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    1 p: z; C, @( p2 H" d2 b  \

  20. & N: G8 R$ _6 g
  21.   return ch;% t0 E# f4 @& C% K7 A) t
  22. }6 u! O+ A+ A9 k
  23. /* USER CODE END 0 */
复制代码
+ O# e- x/ O0 C0 L
2、在main.c文件中加入开机打印代码,
3 h; ]" Q1 T; v# H$ h: J# H9 m& k( T7 n4 ^1 u) |& g. N- B
  1. #include <stdio.h>
    4 g. \4 l4 L8 ^$ A7 r0 c4 h# I
  2.   MX_GPIO_Init();
    4 q& M( w6 I/ [! F3 u
  3.   MX_USART1_UART_Init();
    " Y% D9 H0 l1 j7 A% Z3 K- @
  4.   MX_WWDG_Init();, K  T# N7 X5 I5 F; I5 m! Q3 ^
  5.   /* USER CODE BEGIN 2 */
    4 g6 \, _! r, j8 U3 _
  6.   printf("...RESTARTing...");    //开机打印
      W0 y. i+ O$ p/ C! D) u
  7.   /* USER CODE END 2 */
复制代码

( i6 Y9 d' Z( M) X& e% |- y加入EWI中断代码
# A  c! }+ Q/ z/ i6 H% N) b9 p5 K+ Q% e7 \' j6 Q
  1. /* USER CODE BEGIN 4 */
    7 [$ @4 V% y; d8 V% K" h% s) e, |
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)# D0 I# y" I* n) p: ?1 A1 ]. I
  3. {
    " c7 e0 h9 E- C+ R
  4.   /* Prevent unused argument(s) compilation warning */, d3 G* R$ p1 Q6 g9 z
  5.   UNUSED(hwwdg);. m+ g0 \( \9 T5 {" N+ Y
  6.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))         //检测PA0是否按下,按下就喂狗5 i9 o6 ?! u5 ~& x$ R# d* _
  7.   {
    * [% u( |. c* c
  8.     HAL_WWDG_Refresh(hwwdg); % X! a2 s& Y* s+ |0 F
  9.     printf("Refresh,OK");               
    6 X- @% y+ W6 y$ B
  10.   }, m+ a0 D  i! u1 ^
  11.     else) V. o2 M% k7 Z8 r0 c2 ?
  12.   {
    * l0 u6 L" C3 l8 Z4 k4 R- q$ S
  13.     printf("Fail");
    . s" O. w9 p6 M# }" L
  14.   }
    3 f. q; {) L) L6 V# x( K! h
  15.         __HAL_WWDG_CLEAR_FLAG(hwwdg,0);               //清除中断标志
    " `4 _( L. f0 r
  16. }
    + O# \: h) @: `5 s2 C  l* [& [1 j/ a0 U
  17. /* USER CODE END 4 */
复制代码

) B" L. R/ V+ [2 v/ ?* ^0 k3、编译,烧录之后就看到效果
) S& M6 [4 }+ ?# x. r; t
3 x. c7 V+ N  j, Q4 ^
20200702232811689.png
7 `3 O) J) X) q, D

6 _, d, Y* n. N$ c, C$ H6 ^$ f3 \. ?8 }( O

) Q7 x) l, M3 J/ j2 r' D2 J: s
赞 收藏 评论0 发布时间:2021-12-9 11:07

举报

0个回答

所属标签

相似技术帖

官网相关资源

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