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

STM32G0学习手册——WWDG运用

[复制链接]
STMCU小助手 发布时间:2022-10-28 18:39
概述
+ M' g0 \# ~2 O% E系统窗口看门狗(WWDG)用于检测软件故障的发生,通常由外部干扰或无法预料的逻辑条件引起,导致应用程序放弃其正常顺序。 看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。WWDG时钟是从APB时钟预分频的,并具有可配置的时间窗口,WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。+ P& _0 s- g8 c" R" J7 d( I4 `
7 r/ i  ^) y/ [" T3 y
主要特性 1 [+ [5 m- C3 j: k! ^4 i, t( D
激活窗口看门狗后,如满足如下条件则重置芯片:
3 E" g; Y" r3 }' e3 |3 L当递减计数器的值小于0x40时
' K. o% W8 {; L- a6 Q窗口值外重新加载递减计数器
) k, {4 r" ~6 V如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。9 e8 e: F+ L: S! s1 i3 d  x( @. H# W
7 [* j( H0 `& B7 {
用法
& U% e) P, m- E: d" C如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。
6 ^+ R  P! f( O
8 n" s& [7 R  E# S2 D+ t/ D+ X" a在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。
" {7 @" b+ a, G3 Y  n5 w
+ ?  D* z" _, l- Q  C框图8 b, x( H; t9 j9 ^3 r

! }8 l; P6 m" ?+ v8 S& d) l! T# @ 20200524174123541.png ; U7 ?8 V- U4 k) D# T& A! \

4 G. X9 t8 S8 t" i. o! @( c) I! k# v' G启用看门狗
6 G/ V+ K1 M2 b7 Z) }: x当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。: R2 K; h, ?* c/ M2 h2 b9 d- F# C+ u
当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。 % t( q) Y( J& T* k& c) R
2 D* X: Q. \, i
递减计数器用法# K' F% G7 ^  ]% d0 z% y
该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F);' e7 x* D7 P3 g) Q" A% [
/ Y& W6 e6 x" B3 V
为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程:
, A3 v' g2 `& m' E" |
* F! U/ G; }9 D* j5 Q 20200524180957776.png 9 X; y9 ~( a4 N( J3 v

7 X# Q" Q& O, h6 T/ }% Z# ~3 D2 G 提前唤醒中断(EWI). `. X& R. U5 W

% _6 y% f9 R/ F2 @4 S 通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。
  b* t! O! c4 `: M( M0 p- Y- z" `. Z( B/ c! X% l! _3 c
计算超时时间+ v3 l/ z8 M( n( \% S% ]

+ L% p4 a. G* P 20200524184059993.png + y. m* `# n5 t/ j( C7 y0 A+ J
0 n5 y* j" S6 B+ e4 O( Q
如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时;
$ o1 C; n0 v0 w) [, O/ q/ `  v3 w$ ^& w6 {! z# z
20200524184304815.png
: e$ k8 f* C+ Z5 Y
7 X+ H# D( `: M  ~* G0 A2 A寄存器
# f8 ^7 n# \  t0 R, P1 R寄存器可通过半字(16位)或字(32位)进行访问。5 f  p! A! B) y* z' W
* ^! d; b: o: m6 G8 Y/ }
控制寄存器(WWDG_CR)
' I& {  x1 P5 x9 S, c8 Y& r1 p  ^$ V. X9 L; |
偏移地址:0x000
; U  s4 v" \0 r/ N8 ~8 ^' I* Q8 v2 h7 q9 l
复位值:0x0000 007F4 I$ E: C9 ~: C% x/ {5 ]$ W5 R
/ w3 U% f3 @- R- }6 r; C
BIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗
7 [" h* b9 T- f' y" U0 h+ F2 W% E- ^7 J9 n
BIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除)# j1 I. \# G+ [& y7 G. s, V

, S" K% u- H% ~% ^: P7 V9 o配置寄存器(WWDG_CFG)
/ D5 ^4 @. b7 \7 z* X1 [( ~: Y& Y4 E$ |* ?
偏移地址:0x004: {3 V5 r" ?0 x) X- ^

' D/ p/ k- U; o+ A- g. b( D复位值:0x0000 007F
0 q* @' }: d) ]# K4 c) s) X
7 k0 e/ K8 r! y' r- Jbit 13:11 WDGTB[2:0] (r/w),时基/ U9 `; {9 n5 ]2 N, E. m
) u9 `% B) [( O" X9 V1 d
000: CK计数器时钟 (PCLK 分频4096) 除以1$ n" h$ F( J) W% @8 v: H
001: CK计数器时钟 (PCLK 分频4096) 除以2
% ^) N& q- Y9 C4 t0 L: e010: CK计数器时钟 (PCLK 分频4096) 除以 4/ r6 e1 g: W  n0 J) N% r
011: CK计数器时钟 (PCLK 分频4096) 除以81 h- E4 \# y: e" H  Z
100: CK计数器时钟 (PCLK 分频4096) 除以163 o" I# e5 w1 l2 G7 ^9 @- a+ L
101: CK计数器时钟 (PCLK 分频4096) 除以32
* z( m( c; p% d4 p: Q; ~  j. ^110: CCK计数器时钟 (PCLK 分频4096) 除以643 I" ^5 E( X- _7 m. M+ Z/ l
111: CCK计数器时钟 (PCLK 分频4096) 除以128
& m0 a: _0 C' M4 @" b- ]$ U- ^7 r6 F; _7 W$ o% I  [% e
bit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。
  X# Z* F9 z4 p1 p* K- f
. b% @1 [4 u0 P, O2 v4 B2 gbit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。4 E4 S3 q/ l& Y
+ h% Y+ H( u( F& P- y
状态寄存器(WWDG_SR)
: b% o4 M/ Z$ U+ P  B4 ?$ d/ W& f( p. |& i+ Z
偏移值:0x008; t$ I3 I* j- E3 p, p& C) ?

: {5 Y  U* X7 N/ P2 t4 C9 B* e; l复位值:0x0000 0000
0 i' Y( M& q# |' N; J5 e9 R4 U
6 h* D& U( P# p7 e& C' ^bit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。3 W6 ?) j: m2 L* U! O! ]8 J+ H- h: j
3 u% M" n$ @0 j  @. X( d7 j! r5 K
实验示例
; r1 o7 b" X* j% z1、开启调试接口、HSE
- R4 q5 Q( N- y! ~
2 i- w5 I& Y9 W5 M- ~! W 20200702225341466.png
& o8 _. K# w$ O. \, J
. X/ l0 u! D# J2 K0 o7 j# N7 @  n 20200702225405256.png
2 [0 j% `$ W4 }/ w) Y& V# r2 _( K% h8 K: c
2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断
, ?! j( N1 e9 Q9 f7 A5 n, g& _4 C: X6 A! H2 I
20200702225814679.png
4 ?; q  K9 V  i6 E' P4 G" C4 O( h" T! a2 C6 m5 ?! S
3、使能USART1,使用异步模式,波特率115200,8,none,14 }5 m2 g0 N& M# p4 F

1 `7 r1 B2 C! }- i% P) G 20200702230037736.png ; V* d0 C2 `+ J* X! K

# C; ^" p1 g+ a0 S 20200702230050880.png 4 v! z+ u" z4 J
" \. t. q2 M8 d& x) c
4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127
) Q5 l* V: n' l9 e4 W  a2 d% ~9 Q3 }' k& y3 W1 b, O6 \7 T
20200702225845997.png * b% c, C1 a  D) s
0 R% l! A4 R& G" c) U( H: C
5、设置时钟树,HCLK=64MHz、PCLK=32MHz
/ d5 m9 q$ \. p+ V6 J/ q( |- j# N& a# C
20200702230304582.png
; Q! l& L) U' z. o$ n, w+ {% i( y' m: g/ n5 h. e+ Z3 a3 ]+ p
6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间. {9 W$ ^7 M  k  j) ^1 {
; c% Q5 t6 ]7 N! h6 }7 S
   =1048.576ms4 m6 I7 E8 m+ K" ~5 F

! X  S& l" c$ c/ W# ]( d即每1048ms喂一次狗。9 e0 Q7 _! Z' @0 R3 a+ j
4 g+ z. L1 k8 y
7、设置工程文件属性,生成代码。/ a+ s& P0 D* L; R5 ~  v, \

2 b( @  m! J  ]- i6 m$ S3 b 20200702231252969.png
/ z3 z3 Z3 m4 j" ?
- {/ w5 g2 E( [2 W. V( G 20200702231302949.png # E( ?+ H) W0 }6 R- x. A5 F
- ~2 n2 H+ W7 ~& p* X' J; d
20200702231406699.png
6 J9 c" K) q& f7 r1 t( o4 J8 f. R9 _+ x3 o% ~" B: ~: D1 e- {
代码 1 Q& H" E# K5 \2 z8 S( B2 X' O& s- o
1、在USART.c文件中加入串口打印代码( s2 v: G8 O; F. G$ ]

( Y* [( o" x5 N5 e+ c
  1. /* USER CODE BEGIN 0 */
    ; F2 @2 a' q9 L, t  j
  2. #include <stdio.h>
    . ^2 I+ N1 ^- X3 V1 Y7 |
  3. #ifdef __GNUC__! R0 z2 }" L, `9 ^' k0 {
  4.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf( a7 N- a) |4 G6 ]/ d+ ^
  5.      set to 'Yes') calls __io_putchar() *// |  b9 J; U# z+ z* o
  6.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    / ?' h8 E  p2 h; c3 G
  7. #else9 n8 |# s( v& L$ `- E5 H" N
  8.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    ' t! ?9 W, n& {
  9. #endif /* __GNUC__ */
    0 z2 X* j+ r' A9 Y  N" @/ s9 p" v
  10. /**
    ( Y, p5 Q# k# f: |5 k
  11.   * @brief  Retargets the C library printf function to the USART.
    . i# }" u3 ^( L. w4 e" A
  12.   * @param  None
    / H3 n) a7 i1 G- |1 h6 S7 r
  13.   * @retval None- i) l* m2 c5 _6 P
  14.   */
    - V5 G" T: I! N, }' o% d7 Z
  15. PUTCHAR_PROTOTYPE/ c8 J9 g+ U% s# `
  16. {
    ! ?( Z: c2 {: l
  17.   /* Place your implementation of fputc here */
    9 V5 c4 J1 j) N" O0 T  q4 P% z
  18.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */4 s0 F1 U6 c: M% V
  19.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);& M& W' c- J$ y3 x

  20. - a' E9 S& l. J# e8 y0 n) Z
  21.   return ch;
    & ]7 G. c6 y7 F8 [2 c# f, Z
  22. }
    4 M" w+ U& C# ^+ p$ a' r7 S
  23. /* USER CODE END 0 */
复制代码

8 z' P5 f7 x, A8 ]) O# |2、在main.c文件中加入开机打印代码,
+ X+ R' N$ |/ a1 [7 U& T# @: n
  1. #include <stdio.h>1 M9 {& [" ~" Z8 ~5 K
  2.   MX_GPIO_Init();
    : l1 d; w* c# j  f6 b" B
  3.   MX_USART1_UART_Init();/ q+ P, p- a& ]- {8 {1 ~
  4.   MX_WWDG_Init();( p* ^3 \5 O3 {
  5.   /* USER CODE BEGIN 2 */  [* q. I" }0 D; ]  ^2 u! _& a
  6.   printf("...RESTARTing...");    //开机打印  [3 B  v" U" E& v$ M6 u7 K  U% r: x
  7.   /* USER CODE END 2 */
复制代码
2 e1 h$ S2 ^, W$ c; P* c% w# \
加入EWI中断代码
" H8 Z2 T7 `# N! h. |! L
& Z, Q. i* G5 r2 s4 K9 R
  1. /* USER CODE BEGIN 4 */
    : M( n* F8 P6 s, K! Z# A# {1 j1 |9 B
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)/ C$ H9 d& N3 j; D2 u
  3. {0 G$ `9 D2 G9 X+ A0 i
  4.   /* Prevent unused argument(s) compilation warning */. k# M- B2 [- K
  5.   UNUSED(hwwdg);8 e- o( v$ z1 h& K5 U1 C9 A, s
  6.   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))         //检测PA0是否按下,按下就喂狗
    - m7 C9 ]/ N) L1 w$ J6 O$ }6 |9 y2 G
  7.   {
    & v) h4 R4 A. y! ]- {
  8.     HAL_WWDG_Refresh(hwwdg); 1 J  U: {+ {/ g- W- N
  9.     printf("Refresh,OK");                . G) l/ {3 M( f; }; e1 \
  10.   }
    - K% k! x; A: R6 L( z9 z
  11.     else) g& @; v3 V$ L: @7 ^5 w/ t1 D% T# o
  12.   {' a1 X8 e7 w: o4 J
  13.     printf("Fail");1 d9 r( d9 Q# t+ Y6 {
  14.   }
      c2 g! K) m" j) d- D4 r" E
  15.         __HAL_WWDG_CLEAR_FLAG(hwwdg,0);               //清除中断标志4 R- q$ L/ r: Z( Y; G9 H
  16. }) i9 L6 z0 s+ @3 R
  17. /* USER CODE END 4 */
复制代码

9 ?) B: h  W% A7 T0 o3、编译,烧录之后就看到效果6 B, L& r* V- _. S8 R$ f+ a

9 c0 r2 ^! N* K% { 20200702232811689.png 2 Q  r9 z3 ~3 [- ^" n

7 s! p0 y5 E# m————————————————
  b' A+ s& U: N+ `3 ?& S版权声明:SCCELE1 U7 ]- P+ X' {

; A- B$ G5 c0 c& F( C/ R( }
# l' l8 T' F/ t. a/ p3 \4 S& g
赞 收藏 评论0 发布时间:2022-10-28 18:39

举报

0个回答

所属标签

相似技术帖

官网相关资源

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