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

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

[复制链接]
STMCU小助手 发布时间:2021-12-9 11:07
概述; I# R! _- K; ]& T' M
系统窗口看门狗(WWDG)用于检测软件故障的发生,通常由外部干扰或无法预料的逻辑条件引起,导致应用程序放弃其正常顺序。 看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。WWDG时钟是从APB时钟预分频的,并具有可配置的时间窗口,WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。
5 X% \/ u( Y  f, U. v" X
; s. s4 k! D" a$ v, }9 [6 w主要特性
. r( H. V0 n: W激活窗口看门狗后,如满足如下条件则重置芯片:
: [1 l- p& i9 d4 F9 z) W9 b' N6 G
0 t- x) l# _* |当递减计数器的值小于0x40时
% n. w5 D1 b. E5 {窗口值外重新加载递减计数器
* M0 ~1 g3 V' U8 `2 V% U2 u) m. T如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。
1 t  d# a8 A( r( @
+ q  F* p2 B) X( b用法
& j2 ^" t8 u: y
如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。) E  l( T+ c- @! m# g2 h  B

4 V- N8 i4 S3 m( ~/ ?1 q0 L在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。) ]6 j  Q% K# H8 B! W' C& t

0 o  `* u: F5 z" L6 K框图
( x, I7 H+ U) z+ q0 B* U7 c. o3 W5 Z9 V# J. O* F6 r
20200524174123541.png
- s, Y4 `6 R( V! X9 n0 N5 l9 b

- I6 M; w1 p! S启用看门狗
7 f4 {3 m& \7 k" \" n5 q0 g当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。
" l2 B6 l. J7 s1 E9 j$ b当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。
( c& O& L9 D0 y7 A1 Y5 h4 C递减计数器用法" O5 o, u& n, {
该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F);
9 ^! H5 e6 X# \2 X* R' L5 h, a! Q2 l5 {1 y4 _) [
为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程:2 i4 {- Y* _5 a

2 c6 i* G, T' g' X$ Q; g1 V
20200524180957776.png
5 a+ P2 ]9 ^0 c
& A# S6 f3 k/ Y( O7 E: t( I! a
提前唤醒中断(EWI)) ~* \5 d1 D4 g6 i
/ L0 E/ I! |8 S  S( Y2 J
通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。
5 @: r( }; Q2 A, I( @
3 O4 b* G, e# t! y6 F4 f计算超时时间
0 B5 G; ]3 A" V; @6 B
  `5 }  u2 y% u$ b* `( P
20200524184059993.png

9 K* b# B$ [, B- `! Q1 q' U- H7 r% ~& n5 L! y
如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时;
2 l) w3 m# `& N( m. ^5 \0 }, o  x' a- r# ]% x" N! s3 E
20200524184304815.png
8 F, Q& \, ]0 u9 i/ a

! K7 A. x- Q7 N0 G; q& D, j/ w寄存器
& s7 k$ `+ T" Q寄存器可通过半字(16位)或字(32位)进行访问。
3 N7 j& d8 c+ M, D( J- H1 {. J% Y) a, a
控制寄存器(WWDG_CR)

! Y& B/ I" ^: F$ a4 p5 _* a. R+ P# H; p" h! Y
偏移地址:0x000
9 Z6 O! I9 A) ]+ a% F! o: ]* _2 H# h  D. I( U( v
复位值:0x0000 007F
' ?' \) W2 z+ ~& Y5 y' m
3 T- _$ Q8 z; v2 e9 L- eBIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗
5 I4 n9 O4 G) t+ ?) {& }1 t6 m+ c* N' {6 a* W
BIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除), n7 y% ^, k& o% t/ M1 [- t: t# T; o
0 O* \/ H7 i, t
配置寄存器(WWDG_CFG), T5 Z5 |! W7 b
& p6 \2 \6 i) O& S4 q
偏移地址:0x0040 |7 ~/ @4 F1 y$ A9 V3 ^* K1 _# p
! y: P) H3 s  l
复位值:0x0000 007F
: ]' W4 q: ~* b" c4 u9 F1 V0 f6 o
1 O% x; u1 }, D) J- b2 c! ebit 13:11 WDGTB[2:0] (r/w),时基
# i1 z9 O$ O8 c# K+ d2 V* e1 K9 e* f7 f- ?5 w3 L  `% v) G* t
000: CK计数器时钟 (PCLK 分频4096) 除以1. h) K8 Q7 u7 V/ h( e
001: CK计数器时钟 (PCLK 分频4096) 除以26 i" [8 B. Y; Z9 d( B# w
010: CK计数器时钟 (PCLK 分频4096) 除以 4# D: q# m( V6 M: f- Y1 R4 ^
011: CK计数器时钟 (PCLK 分频4096) 除以8
, G4 @7 K# z. j  |/ `% W3 v100: CK计数器时钟 (PCLK 分频4096) 除以16) q* d$ B& ~- y0 d& w1 @
101: CK计数器时钟 (PCLK 分频4096) 除以32
1 E2 P5 c, j  d9 {- q! F; b0 D( n$ n110: CCK计数器时钟 (PCLK 分频4096) 除以645 B* p" q, [6 P
111: CCK计数器时钟 (PCLK 分频4096) 除以128: |2 j* i% `' W8 |& O, c
8 V8 y1 s+ `# L: e2 C1 p% [5 U: E( @
bit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。
5 H% G8 y, H1 D7 I' M* T( o/ e: Y8 v, p- [
bit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。8 m( a8 J/ F. b8 `6 U

* B: Z( i* V/ _. @3 `状态寄存器(WWDG_SR)# _$ [6 K4 n0 z  R
& r6 c/ m/ Y" m  l+ A: K
偏移值:0x008
7 t& |" H% ]4 f: e* p2 X8 z* [( a! i7 s( r. l2 \
复位值:0x0000 0000
  |3 X: L7 |0 f
8 |) s- @1 G# b. Ybit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。2 j* }6 ]$ w4 n) Q

2 G% S4 Z8 K* e$ q0 S实验示例1 e# c9 a9 ?- {/ @5 F8 U- P
1、开启调试接口、HSE4 m; \3 K- x' d$ Q1 b

' y& d. q! s( E, K* e% d: K
20200702225341466.png

+ J" d# V$ Y- A( `" E* `2 q& l# W/ e+ M" `- l/ y
20200702225405256.png
+ a6 W* A( Y# V* f& x% g7 Q

5 X) _- x. d& k: s/ t2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断3 p" y: A5 T6 Y3 w; d" k

, h  {+ o. K4 }8 Z
20200702225814679.png
; d. J& W( `4 S! k' Q- s

4 A. |$ |) O# P: |4 f; Y2 r* [  y3、使能USART1,使用异步模式,波特率115200,8,none,13 j0 F7 C# L7 d6 J
3 f9 t# F7 m: U
20200702230037736.png

; [9 J1 ?7 n5 t6 X/ a+ E
: h$ F! q1 z$ {
20200702230050880.png

! W; m1 P( s( j  C! G, H2 d' K$ W1 P) f; ^
4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127
+ R1 T- j( t4 {; H2 o0 V: L& N' n" _0 g+ n  i3 u3 F
20200702225845997.png
0 X+ p+ t- M2 C# `0 N5 _

$ {  _4 n8 i' N$ \: j, P3 j# {5、设置时钟树,HCLK=64MHz、PCLK=32MHz9 n/ E, l! \4 Z, ^
3 r. h" r9 u( ]4 `6 w
20200702230304582.png

8 C( z# P; d: z) j, H6 ]2 \. n" l* w) [; y' m
6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间2 y2 c3 q% @0 d$ n+ [

& k6 [5 P0 a* n7 a7 z' f# \   =1048.576ms: K7 f6 N5 z7 r: _* |. k' O7 N7 P
- O7 F( v" W/ ~  E: M, R1 O
即每1048ms喂一次狗。- |4 |% i* A7 [6 m% }

# j4 D3 U6 o- h- ~; f$ _' Z: e! B- ?7、设置工程文件属性,生成代码。
0 U6 z& q1 V0 `6 ~- y6 F
+ w/ Q7 O4 N8 i- r$ @& B/ \; C
20200702231252969.png
' i7 K% S, s$ i( O/ M
) H! v" x& }1 Z

4 b* [9 c6 q3 R& }7 X5 C
20200702231302949.png
0 D3 R. j- l  b) S
3 f, T9 u% b# i- v$ d
20200702231406699.png
# x( c& B, y7 ^9 u$ t+ {6 d
+ R8 D2 i8 b6 g& \7 G/ L4 m- s
, r* N& I/ J/ b# e: W  r6 i( Z  s
代码
' {% C+ E5 k, e# K4 @2 l1、在USART.c文件中加入串口打印代码
% f/ y+ E' d+ N, w
  1. /* USER CODE BEGIN 0 */
    % v0 U! A5 A, d
  2. #include <stdio.h>
    1 q$ I) w, s. g- E- ?- [! K
  3. #ifdef __GNUC__
    ) g& E) z+ ~2 b2 ]$ u
  4.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf  N: K- A4 ~9 V' [/ U
  5.      set to 'Yes') calls __io_putchar() */
    1 z! X6 @: f4 N/ X" E
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch); |# s$ n5 v' v6 ?$ O
  7. #else
    . r. t2 g1 t) i- q7 r( m
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    0 [. |; V5 @/ _0 b
  9. #endif /* __GNUC__ */- \3 C: x- d9 D5 T9 L) x
  10. /**
    # D' ?6 N. ]" P* z$ k2 Y
  11.   * @brief  Retargets the C library printf function to the USART.: h( U% y0 q, Y, F! a/ X' _
  12.   * @param  None
    & ~% `) t2 Y! P2 |, P' T
  13.   * @retval None
    1 ?0 z2 a: K5 v6 ~# F, z) X
  14.   */, p3 P: y1 q8 K& t3 Z2 J* c
  15. PUTCHAR_PROTOTYPE/ x2 N/ Y1 i, G: j3 t2 c$ L0 z
  16. {
    8 l% U0 Q& A6 e4 @$ |# V3 ?
  17.   /* Place your implementation of fputc here */6 O+ `: n% o- L3 }# ?( X3 C; s. q
  18.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */8 N% z) I2 y- b5 f/ F" _7 n6 t- T7 C' R7 |
  19.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);/ s6 T/ D; D) I. Y& T( W$ l7 _

  20. / m. o5 M' l6 s
  21.   return ch;
    3 H  ^  i7 a8 M1 l
  22. }
    ) B6 c# b3 L( r9 |
  23. /* USER CODE END 0 */
复制代码
% o- q, }0 O% `( e3 ]7 O
2、在main.c文件中加入开机打印代码,
$ B' R% V  @' A! \( \
" t' O" c; r/ D6 I
  1. #include <stdio.h>3 j% @# |2 z( G+ P* W; `% \+ \
  2.   MX_GPIO_Init();
    6 {- C5 Y" s0 o/ N' W. ]
  3.   MX_USART1_UART_Init();0 [2 b3 l0 f" z# @, B4 S" ?8 n
  4.   MX_WWDG_Init();; d, `  `7 K1 v) g
  5.   /* USER CODE BEGIN 2 */
    $ _* ^( K. Q# A; @, [' t8 F4 E4 V
  6.   printf("...RESTARTing...");    //开机打印8 K) ^) y( ?4 J4 h9 K
  7.   /* USER CODE END 2 */
复制代码

3 N% F: B  P5 J$ ^6 b3 h& ?加入EWI中断代码
' J$ e/ ^; l' `& ~# D! B" A. X+ I# F; D) ?3 k. {
  1. /* USER CODE BEGIN 4 */$ U! m) O3 D2 p' i" s
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)2 e0 u* x7 O& Z# T
  3. {
    * d, C0 a" v" B6 ~6 O
  4.   /* Prevent unused argument(s) compilation warning */9 k$ k5 _1 h# E) S; {  A7 t3 b
  5.   UNUSED(hwwdg);
    . e- z) x% V- q1 _9 p$ r
  6.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))         //检测PA0是否按下,按下就喂狗! t/ q8 q, g3 e2 e6 L7 j1 {
  7.   {
    ) j+ u# C- R8 ]% [
  8.     HAL_WWDG_Refresh(hwwdg); 8 J% h- ?8 H. ~& k# D" s
  9.     printf("Refresh,OK");                & R. j2 d6 L* C, a- u0 k
  10.   }& x5 c" h1 \$ o/ r# X5 ]
  11.     else. o2 b+ Y# [* P  Y9 C7 J
  12.   {
    " g) T, `( M2 x) s: v5 ^, ^
  13.     printf("Fail");  B4 }1 T3 y! c9 j' F
  14.   }9 Y# K4 c( I# `
  15.         __HAL_WWDG_CLEAR_FLAG(hwwdg,0);               //清除中断标志
    " Q2 a! x# k' e8 z
  16. }
    & A: A6 |) S) f! ?, b
  17. /* USER CODE END 4 */
复制代码

4 N5 z0 f6 R* Q3 T& S3、编译,烧录之后就看到效果
- I9 v3 ]* z; Z0 n; h% x
' M/ c+ I" }1 C& a- l4 }0 z8 Z
20200702232811689.png
& o$ m  [7 ^) ^, S# G7 q
( u8 ]1 E/ l, E% Z: d! U
1 F+ e8 \3 L* e1 H
/ \1 k& n0 ^# r; X
收藏 评论0 发布时间:2021-12-9 11:07

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版