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

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

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

6 W0 A; W8 Q1 o5 l; a+ t主要特性
! y7 r! d# p/ V激活窗口看门狗后,如满足如下条件则重置芯片:5 G7 ]* N. \8 [0 W& M* D

  \5 J0 M/ x) ]# U' O8 b5 v4 ]当递减计数器的值小于0x40时
' t( S$ b% x" W+ G1 `- ^* U窗口值外重新加载递减计数器
4 w- B6 L/ r8 o, [7 R$ f如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。
- ~5 q0 k$ c( N
% \. s* q" B" D+ A9 i用法
: \( e/ b, a7 H1 D" a  k) s
如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。( S+ {1 \! R" G" G- D+ o; t
3 _% G4 [: a+ [8 S! I
在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。1 s: `4 M& G4 u9 d; u

) _2 Y6 a# p% I7 |. B框图
& @! M+ H- V6 n2 e, C2 D3 Y! Y% a6 v7 o: k
20200524174123541.png
% N$ _) ?" s; t: D: R  b6 y. H
+ W5 Y- f  h) \  O- p7 F7 r
启用看门狗
+ n4 ]; ?2 M5 L% u! T* i当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。
5 g! O" w: l  U4 A当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。 ; h& ~$ d, Q# @5 j( O* Y
递减计数器用法# Y  U* r9 \( ?- c6 z
该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F);
2 y0 g- U& r, ^: W
  N4 }0 N( Y& A- A5 b$ g* b为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程:
; ]2 v# A/ q1 n9 E" _3 `7 c/ k7 Z4 m$ Q
20200524180957776.png

  s$ p* ]1 o, O. m- I# j
: ]; V- w% K' X1 t9 l1 L+ f& X6 z 提前唤醒中断(EWI)
) k6 w5 y7 A" N7 i0 H0 r
. B2 E9 Z+ p2 x1 f' G+ w  r. s+ C5 ~ 通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。  H5 T6 R3 Q$ f% K8 Y& b/ _/ C) v
& |/ [8 Z/ n; g, K9 ?# c
计算超时时间0 Q0 z1 Z: o1 W+ b

6 H* S: D& z' n9 f  @% a  B
20200524184059993.png
! x$ f/ p% f7 w. A

+ E7 X( q; P6 C如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时;! H; M4 I. |9 T- A2 B' @
% b5 \, S1 ?1 Z) V" s
20200524184304815.png
6 j8 g( U! C2 M

1 I+ i$ _! [" z8 D7 {寄存器) e/ d( z& |! L7 w! j, N
寄存器可通过半字(16位)或字(32位)进行访问。# x3 o$ T7 w3 k) A" J" P  W

; f+ v6 k$ [  e. b 控制寄存器(WWDG_CR)

) Q! L$ [5 p( \/ _  b/ q" ]' W; R, v: o! C% g
偏移地址:0x000
, F* Q% h  J: j
6 Q! N: H7 L( Q! U0 Z/ m复位值:0x0000 007F
7 J; b7 y$ A2 I4 R2 f: i' K! H9 p1 g- F8 ]; D' V+ |
BIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗
8 X; q9 m$ J0 h! Y2 I; p: ]& N3 n9 p7 t! [# b( q
BIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除)
2 w4 n. @; O- N0 u7 }+ N6 n$ h; i/ D7 f) n  Q. ^. b. I' z  R
配置寄存器(WWDG_CFG)
/ K( [. c5 z: Z) Y: q1 k' u
' ~5 f" o' ?0 y1 T  S: [+ u# Z偏移地址:0x004. M' n( |" n9 D7 q6 f3 }" \9 [  V5 n- L: i

3 a  i" @' }0 |6 X复位值:0x0000 007F( S1 \$ C+ L+ d8 q8 n! ?  i

# Z1 [- {- c. j  y, x" ^5 \bit 13:11 WDGTB[2:0] (r/w),时基3 _3 ~% T& l: h5 Y0 K

* N" i( G* H( m# x8 W000: CK计数器时钟 (PCLK 分频4096) 除以1
1 D/ @3 o/ H- P7 R( G: ~001: CK计数器时钟 (PCLK 分频4096) 除以24 B, H( k' l( {2 X) m5 U5 B1 {/ B
010: CK计数器时钟 (PCLK 分频4096) 除以 4
$ I3 v7 C9 ?) I; C, [, g011: CK计数器时钟 (PCLK 分频4096) 除以8! y. \. s& X; L  z( I% K4 z
100: CK计数器时钟 (PCLK 分频4096) 除以16
0 |( v6 z" ?4 s) k5 i101: CK计数器时钟 (PCLK 分频4096) 除以32# U2 B/ k3 u# R% @0 Q' G
110: CCK计数器时钟 (PCLK 分频4096) 除以64
, j# R2 S' k9 w% m$ F& a* r  \# ?111: CCK计数器时钟 (PCLK 分频4096) 除以128: Q, f, W, T3 ]$ i; d5 ~
6 a& s- |& y5 X: Y+ N/ G) y9 o
bit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。5 ^/ c3 J' l; h5 `& D
4 F* ~* c1 y3 x/ ?7 u* Y& i( j
bit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。
3 t  M# ?  ~: y# F& _! o# x
: q$ z4 L: [' R' i$ U" ?状态寄存器(WWDG_SR): Z  P; W/ R. Y1 G8 b- m% l9 ^8 c( V
! J6 w2 F5 A8 w
偏移值:0x008& u# D1 R7 g6 _9 t& A7 d/ Q
' H) ^4 [- n. p
复位值:0x0000 0000, ?6 ~7 k1 ?: }, y8 l6 \
7 Y2 z  N* U7 n3 |
bit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。
- L: t& i0 c4 v% r- h  E0 [5 W( ?4 p" c
实验示例2 u: L# f7 C6 B& o
1、开启调试接口、HSE* x7 s) D3 |: k1 n/ p
( ]: L9 i3 P) X  C
20200702225341466.png
: H, }8 j. [$ T! ^, D
. l# G+ i( H6 g6 u' A! I, g
20200702225405256.png

% f6 x7 I, v) B& m  P& s
$ N$ ?4 @8 E% u& k% B: M- R2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断* l* l. e$ t; k% s; w; M5 V) T

8 s7 d+ O* i1 V1 y' P
20200702225814679.png

9 y8 J3 i! Q, F- [2 L5 ~* A! B2 T) p4 m9 [. m
3、使能USART1,使用异步模式,波特率115200,8,none,1" B5 P5 d4 O$ Z6 Q+ d  E5 J+ T% X  k$ y
' P# K! I( q- L& n# L+ N
20200702230037736.png
+ o( B! }. a' a1 M" q7 l; P
1 i5 g5 z" r4 v5 M6 j
20200702230050880.png

4 V  l0 g9 _) y+ X& t" a
1 S1 R! X3 Q" d% b) L4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127
+ p8 d+ @) z; A! _; H, C5 Q2 f7 r- R8 ]
20200702225845997.png
" e  c! w. m: c8 X/ ?- {

( F* q* w1 o0 u( M8 _( S) D5、设置时钟树,HCLK=64MHz、PCLK=32MHz, h- k; t& J) ]  L) Q

' e1 j  x2 y: v& J2 s/ L3 ]
20200702230304582.png

5 u+ k- r& L; F$ h0 |+ ~+ X
2 `+ M5 h& J' m( ?( A- e! q6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间
/ S5 ]9 Z- R, S& ~5 F; B
. w2 C/ D# l) Z2 j9 w+ I   =1048.576ms
- V& t+ J) `) U+ v) \
  Y, V1 B0 H( V6 N1 |9 g0 Z$ k即每1048ms喂一次狗。+ M2 }' A2 k# q$ b8 ?4 F5 ?; C3 k
1 r+ L: s" v# J7 Q3 T7 ?+ ]# T
7、设置工程文件属性,生成代码。# d% e3 a. Y  q
1 U/ J: g( L7 O( x6 C9 }
20200702231252969.png

  L; {8 G5 K) u% i/ Q* K$ `( r7 X: F+ ?+ c# B- b3 A, p
" p, d; ^( a3 s# W
20200702231302949.png

+ p) _* u) I( r. E& f. u: c( I8 a8 d5 W9 H
20200702231406699.png

6 E( i) M' m. J; }4 T$ S. f0 i) \/ y
# n5 @" b  z7 d; S$ h
代码
$ Q6 M$ t' |1 D* H) }1、在USART.c文件中加入串口打印代码
, B) {  }1 P# ?+ e) @& g/ c
  1. /* USER CODE BEGIN 0 */" J2 r0 m1 ~9 u; ]% ?8 X
  2. #include <stdio.h>
    " K" \' r% a  t( B$ Q8 M  c
  3. #ifdef __GNUC__
    5 {9 W8 Z+ b. |' M0 f& ~
  4.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    * e; _' O9 Q8 c% p5 [
  5.      set to 'Yes') calls __io_putchar() */
    1 d$ L/ g' U8 t; }, L
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    0 x2 d, ]- y% E/ s7 K& z
  7. #else
    + A: O  f* Y+ d) R
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)7 X# a  L6 J' p+ b  \
  9. #endif /* __GNUC__ */
    ( }  e. O7 m7 k% P. [8 n
  10. /**
    2 u% j7 N* o) M4 r( p: S5 o: W2 w
  11.   * @brief  Retargets the C library printf function to the USART.3 }4 U! N1 j1 C
  12.   * @param  None3 u9 k1 g9 F$ C, Z
  13.   * @retval None
    ) D; E2 D: j7 [
  14.   */
    6 E& o# ?6 F7 s$ d
  15. PUTCHAR_PROTOTYPE
    6 Z& l+ J. B5 K+ Q3 [$ w
  16. {4 o! ~) b) l3 W6 w  C6 {& a
  17.   /* Place your implementation of fputc here */. g5 c% y  N: T1 I! G! p5 y" J
  18.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */. e/ a6 B4 f5 L1 L: d
  19.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    9 C( P5 t+ S. D( D2 s1 ^9 x
  20. 4 U' [4 W2 a5 P8 v, G/ S( ?8 p
  21.   return ch;; |; Z( W4 S: {& Q7 I
  22. }6 Q2 G' E9 ^) z6 X) A0 ]
  23. /* USER CODE END 0 */
复制代码

& a# i0 R- ^$ _8 V3 }2、在main.c文件中加入开机打印代码,
8 F# y) |' l' W$ z! B! g" A1 k5 X3 ?: T% S- u  ^
  1. #include <stdio.h>2 E. F9 U; V& @9 i1 O: J
  2.   MX_GPIO_Init();
    2 L* Y! [/ D. S4 ^- N9 Y; U5 E
  3.   MX_USART1_UART_Init();
    ! ^5 B  j1 J3 h8 Q
  4.   MX_WWDG_Init();
    6 s- a) N% M  ?  Z1 x7 ~
  5.   /* USER CODE BEGIN 2 */! q& p9 ^; u  \, x9 S. l6 J# ~
  6.   printf("...RESTARTing...");    //开机打印- l8 N' Y( J7 I5 M$ `
  7.   /* USER CODE END 2 */
复制代码
, g4 M5 l5 x: X, Q4 u* P5 t/ X
加入EWI中断代码+ l6 m' Z: w1 W! O
0 F+ z2 F, z$ H3 Z
  1. /* USER CODE BEGIN 4 */, J/ R( x+ ?" H
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
    & M) Q# Y: \4 `) f/ E* R
  3. {
    7 P* \3 g& {$ ~) O6 x& K
  4.   /* Prevent unused argument(s) compilation warning */
    6 G9 |2 O8 _$ U  ^; }1 W  s
  5.   UNUSED(hwwdg);
    ! v4 x0 E) F' D3 c- V
  6.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))         //检测PA0是否按下,按下就喂狗4 D( j) u4 X6 k7 X6 x+ c3 e( X
  7.   {
    & o7 |7 g4 G/ a4 c. k9 r9 ~* X8 y3 p
  8.     HAL_WWDG_Refresh(hwwdg); ' @7 C, a5 i; \) X' u
  9.     printf("Refresh,OK");                  ~# p- {1 }! y# h/ ]* m; ]; R6 k
  10.   }. t9 Y; _3 U; u; W" p: e* Q* \
  11.     else
    + Q, T& O3 a: L, u5 u- [
  12.   {
    0 u7 z5 s% ?9 N" M2 T4 {, Q. W
  13.     printf("Fail");
    . @* V3 F5 v; ]% ?' y) `9 h) i4 _
  14.   }5 _# n& k0 n% J+ r7 q5 @6 {- l
  15.         __HAL_WWDG_CLEAR_FLAG(hwwdg,0);               //清除中断标志
    . r. j1 m  \5 n/ E7 R
  16. }7 O; y7 }5 Y1 u9 O& Z
  17. /* USER CODE END 4 */
复制代码
3 E+ @2 [9 v: e
3、编译,烧录之后就看到效果
3 B; |0 J2 b: \+ o2 Y
4 D6 A# ~) _0 x, v
20200702232811689.png
( h# H6 q6 B; E2 ^. H/ B6 ~; G
/ G, O1 K! ]  I* T" i+ X

% ~& U2 C' ^* k/ L) [4 ^( ]: r  X7 z# A/ T. f8 M- [
收藏 评论0 发布时间:2021-12-9 11:07

举报

0个回答

所属标签

相似技术帖

官网相关资源

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