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

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

[复制链接]
STMCU小助手 发布时间:2021-12-9 11:07
概述# J* c9 n3 T9 \/ b4 v3 m' h
系统窗口看门狗(WWDG)用于检测软件故障的发生,通常由外部干扰或无法预料的逻辑条件引起,导致应用程序放弃其正常顺序。 看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。WWDG时钟是从APB时钟预分频的,并具有可配置的时间窗口,WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。: I* d/ V' t" V

; x% Y8 G  k1 e, T( q; d8 U8 V主要特性 - @4 T: U4 c" o$ a5 A1 f
激活窗口看门狗后,如满足如下条件则重置芯片:4 x8 l+ v5 N2 \& m8 |: |* j

1 i2 k) h: q& k当递减计数器的值小于0x40时
& F. `$ Y4 H: c& S7 c7 ^窗口值外重新加载递减计数器
+ x; k; D4 Z0 q# _1 l2 `- R如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。
- J' R4 E! R! x  [* U
. ~7 G$ ?8 U) R5 E( k用法

- ?% e( B* |* Q7 ]4 P0 R$ ]) H如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。
4 m( X, r' I- F: M  l# L
! R2 Z/ f1 B: Y% ^4 |) A. [* ?2 e在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。) R  G) n. |9 G) S) D6 Q) O( T5 z

) u+ h1 O5 d( Y6 Y- B. T框图
1 F! c: Y/ I8 V+ Z" g' ?4 p
" h& ?" `* |9 U
20200524174123541.png
9 `6 G' V& ]2 s! e; E, p
. C6 b' Q7 A  |
启用看门狗
7 z; D8 a6 z: @" e! S当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。4 c6 k8 n& r, x; d  R
当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。
& ~/ @9 r6 M% ]3 y/ B# d. S( ?& X递减计数器用法
! L# q& K1 J; M$ l5 B9 g该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F);
" ?# |3 O: ]0 ]' O! A; Q- v
. G  J& C& S% c+ {2 |5 w( ?; ?( e为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程:: v  h& t+ U( ], ^
! X; L9 j% ?4 {+ _3 v2 |- J( b" a' I
20200524180957776.png
/ m3 ~, ?5 a+ E4 c, S/ X6 o
; Z$ U6 N: D7 [& ?" y$ E
提前唤醒中断(EWI)
/ Q0 Q8 F) _( K5 v2 z  n6 X8 X" ?  z# P+ U8 t: t) n
通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。
3 \7 K/ e; p8 Y% h
* t" N0 b" Q6 W- P" o计算超时时间
5 G" S% v2 C0 g+ j. J1 \/ Y5 P4 ?$ H/ S
20200524184059993.png
$ @; _6 [" X8 L9 O
0 v7 Z( W% K" h) ?
如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时;
$ _5 ~/ v2 k, T9 H: b' Q$ \+ X8 D. N3 L9 T4 F; F( z! B
20200524184304815.png
% v) v% W2 {7 a; A. p% S9 n

5 S5 j  x7 i+ Z: r8 S& X寄存器7 P* c  R( J1 @3 a/ j7 J& g
寄存器可通过半字(16位)或字(32位)进行访问。
. G' }/ X) j  H- m+ _) w( Y
, w" c. u) N# y4 X0 P/ ^, o- I 控制寄存器(WWDG_CR)

# T  D  m3 X& U+ Y
. f! o; G$ ?& T3 F* k偏移地址:0x000/ q; O- C8 l: z$ R% q

, c) h$ Y7 I$ T% O4 s1 T复位值:0x0000 007F
/ m* d5 V& ~8 D( c! u: V) R$ Q) t) e
BIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗1 Z; s" i( a  c1 r" W9 K7 `! I

% x' N' b2 i' S0 ?% s' ^BIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除)+ C3 u9 r. N8 b6 T. }: j
5 G: T8 ?( M, H  m& v
配置寄存器(WWDG_CFG)# t; Q% N2 `, ~$ O

& F7 z6 Y0 U6 D$ e% _% b' m偏移地址:0x004. I/ f- ~9 V2 j6 U

5 o( ^  G. u2 z0 ~" u复位值:0x0000 007F
  R7 x/ R1 R+ ?8 ]
! M. p. K0 @7 W& Y9 p: Ibit 13:11 WDGTB[2:0] (r/w),时基6 ~, U) o' ^2 `8 D* ~5 ~

3 @( {3 z' ?2 k. Y000: CK计数器时钟 (PCLK 分频4096) 除以1
" l: p: v. s) r! `, l/ e001: CK计数器时钟 (PCLK 分频4096) 除以2
/ c/ O, J5 i( n+ y+ i' R0 M010: CK计数器时钟 (PCLK 分频4096) 除以 4
* p  e7 m! L0 y/ M011: CK计数器时钟 (PCLK 分频4096) 除以8& ~2 E6 t3 D2 B
100: CK计数器时钟 (PCLK 分频4096) 除以16
2 r. [  r* R4 A7 h101: CK计数器时钟 (PCLK 分频4096) 除以32
0 o2 S. a- m- x- O110: CCK计数器时钟 (PCLK 分频4096) 除以648 E7 Y8 R* ~7 M
111: CCK计数器时钟 (PCLK 分频4096) 除以128
7 A5 `5 H  Z- s3 v& g# F/ g
) v+ H6 |4 E8 s. _bit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。
9 ~* z. e7 X8 p) N5 ]6 m% p( v4 X0 `' |, J4 I
bit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。8 u. \2 M) W+ r" k/ ~! W3 n% ~
% F3 `6 L9 @/ K" E3 _9 J: A
状态寄存器(WWDG_SR)# ?6 \  }: }4 F, z/ N  u, P. l
' _5 _/ L; l; {2 X$ M; H
偏移值:0x008% T$ M0 E" H% d: p7 ~+ h3 C9 o

; ?$ e& o( L% h* e, C复位值:0x0000 0000
( w; c4 ^6 N. Q. g9 w0 c; t) Z# @) X  P, E5 Q- f$ q1 p
bit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。
' O* f/ S6 y2 k- x, g( N5 @0 x* `- J1 b2 D) {" V0 w
实验示例7 p* u) a' R# D  x8 B( B2 K
1、开启调试接口、HSE
8 p, b3 P4 M5 C+ y& b8 l/ _8 E+ z4 f$ W) t% H( q8 J' k
20200702225341466.png

6 m+ x% T8 j  r( `: W* P. Z7 n  m0 y- t
20200702225405256.png
0 R) A4 A6 _& e; q8 D& l
5 E- @6 G0 T0 W
2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断" j7 i/ }! W6 w$ X9 _" D% o$ d7 K6 G
. ~6 W- {# _( k: P! H& b: B
20200702225814679.png

  u$ S% Y  a' x" `( Q4 z
* P7 q  }, Q( X  }1 s( \3、使能USART1,使用异步模式,波特率115200,8,none,1; K, f6 ^& }% N

( N! {1 b/ V9 h" H( z( p, r
20200702230037736.png
0 m3 W* w* z$ y) W

2 f8 c7 e9 ]  h1 \
20200702230050880.png
# ^9 ~0 V. p3 T# i+ p* V+ C
% W2 P) J! I0 ?5 @$ c( R- C3 d* x2 O
4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127
/ r4 F& M7 [# j2 F! j! E* N  n( c2 [5 f7 M0 r% q8 e4 H
20200702225845997.png

, ^4 Q5 M: B5 P1 G6 n; g7 R" b+ b# O/ A0 }9 u1 W
5、设置时钟树,HCLK=64MHz、PCLK=32MHz, X6 K4 m/ r/ l$ ]* n3 u

  i7 s1 @/ D5 C2 e# X
20200702230304582.png
) S' x( y1 }$ F4 g  k2 C2 m, }* O8 v

( |2 V- L; A/ A) X' g6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间
5 I. i! ?4 P( |$ R1 A% H) L  N2 H# p6 c5 {  n0 W
   =1048.576ms- {9 k3 W7 j- Z# W: Y( V

7 h( y; h$ A  ?( Q9 l  X即每1048ms喂一次狗。
1 p/ x% k% y) h  G, o) m
7 T2 @. \0 E  U4 o$ I0 q/ q7、设置工程文件属性,生成代码。5 c  t" ]" i7 Y* I

& D- b: @; b7 t. e  a# L
20200702231252969.png

. p5 R/ z! \' T) F. c' l% o9 g& Z
; Y) o" j4 b, O6 j( n, V4 E! ]3 E# S0 ~: j! \
20200702231302949.png
8 \# Y; R7 ~) d% k# n3 L
$ p8 Y7 ?* r3 h8 n6 y
20200702231406699.png

! p0 q; X) m: s9 M7 j/ g& L/ Q; R6 }' w0 }4 L9 d6 Z5 ^4 ~% ?( X

/ d1 g9 j3 O/ U6 C; G代码 ( a! |1 f3 r2 h  e- J  r
1、在USART.c文件中加入串口打印代码( {6 V9 g, H  D; v
  1. /* USER CODE BEGIN 0 */" `) {+ T% _+ V& B" M
  2. #include <stdio.h>( v  B' u- u' \2 U
  3. #ifdef __GNUC__4 E1 H) K' k; E! |' m& R. ^2 b
  4.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf4 N5 z( T$ J, i5 e
  5.      set to 'Yes') calls __io_putchar() */
    $ f7 ]& C( Z8 T$ K
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)) s; w8 U' F8 a, q# d/ C4 L
  7. #else
    0 l& f! H3 k3 {) @8 i( S
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    * D2 r+ V; M5 l& B) N
  9. #endif /* __GNUC__ */: P9 ]8 x# @" \" G+ ~1 h' M7 [$ h
  10. /**7 T( a* ]% J- ]
  11.   * @brief  Retargets the C library printf function to the USART.
    3 j, M" T6 R, j" o3 k- q9 O
  12.   * @param  None
    8 w9 E6 i. C- o+ v9 ]8 H
  13.   * @retval None
    " i, j4 V% @! v  ]4 h
  14.   */
    : I- m; l3 A& P+ H. \2 e
  15. PUTCHAR_PROTOTYPE0 Y% e; @6 N  c- {( ^) s
  16. {5 |: l7 l7 W1 V% ^4 L0 O
  17.   /* Place your implementation of fputc here */1 J* C$ Z% }% b! @5 ~+ L- }8 z- c
  18.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */. f' ]/ G" E9 ~" V9 z2 z7 N
  19.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);2 ]) i/ N" I  Z& ~" ?
  20. ' ]3 J: x  b+ e* P2 s! Y/ F
  21.   return ch;; f6 g" m. ^. J# W8 T, R
  22. }
    - D  q. B4 O& D
  23. /* USER CODE END 0 */
复制代码
; x- H: L, T( s+ d2 s1 x
2、在main.c文件中加入开机打印代码," ]1 m, E, _( A1 e" K+ `' [8 u4 S
* s( `8 r# }' z( b1 I
  1. #include <stdio.h>& R! z( U4 I2 f
  2.   MX_GPIO_Init();
    : Q3 S/ Y' t, p& d/ s
  3.   MX_USART1_UART_Init();
    , k$ o0 }$ J+ w6 V4 n' {
  4.   MX_WWDG_Init();
    ) @' N. s/ r7 X& H. T8 {
  5.   /* USER CODE BEGIN 2 */$ x9 Z5 o& a* l% k' C( j+ r: f
  6.   printf("...RESTARTing...");    //开机打印2 ]! T0 E, R! s. ]0 t7 C
  7.   /* USER CODE END 2 */
复制代码

) e( m$ R- }# c% {' p! R加入EWI中断代码' g: N3 z6 G. A% {8 Z8 ?% ]  v# q
5 q6 N  t% g' J2 }: b9 ?
  1. /* USER CODE BEGIN 4 */3 T0 |2 T# O6 {7 _% G) V
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
    5 T7 F$ l) \0 z' {6 G+ O, Z
  3. {
    ' y  @) ]$ U* B
  4.   /* Prevent unused argument(s) compilation warning */
    8 B4 i% N3 \/ f6 _+ r. T- b
  5.   UNUSED(hwwdg);( `9 J; S' g* G9 \  X8 Q
  6.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))         //检测PA0是否按下,按下就喂狗
    : H1 R3 L* }& K4 g' i
  7.   {% ^' m  }/ u9 a$ x
  8.     HAL_WWDG_Refresh(hwwdg);
    , }7 {$ p! k/ Y( a$ a3 e! {2 q
  9.     printf("Refresh,OK");                % h8 H% l$ n( P+ q
  10.   }
    " M1 S* N; N: X$ k4 m0 z
  11.     else6 Q$ N. M1 a$ l6 e! a
  12.   {2 z/ Z! ^: k+ D
  13.     printf("Fail");& v- C! b! }& P" l, x0 ^
  14.   }
    ' k% P  O3 M% b( w  `2 m
  15.         __HAL_WWDG_CLEAR_FLAG(hwwdg,0);               //清除中断标志8 k. F! y* r4 S
  16. }
    : M4 j1 B( r0 z3 O
  17. /* USER CODE END 4 */
复制代码

4 s: O- M4 ]& O/ x0 \* h6 H+ i3、编译,烧录之后就看到效果# S: ~# G" n3 J0 c! o+ q' T' x

5 k1 H9 k1 T7 r8 o9 _
20200702232811689.png

6 ^; D0 K( ]7 n' X, D6 t
$ K9 W; w  [7 T) D/ @+ w- J9 H0 o( }8 q- v$ E, ]) O9 v
( S4 R( p" `$ C; U* d% ]' B
赞 收藏 评论0 发布时间:2021-12-9 11:07

举报

0个回答

所属标签

相似技术帖

官网相关资源

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