概述 系统窗口看门狗(WWDG)用于检测软件故障的发生,通常由外部干扰或无法预料的逻辑条件引起,导致应用程序放弃其正常顺序。 看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。WWDG时钟是从APB时钟预分频的,并具有可配置的时间窗口,WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。1 g6 g5 C+ p+ Y, W# S: F% F' Z- I ! @6 m4 G+ C, D6 @( p 主要特性 激活窗口看门狗后,如满足如下条件则重置芯片: & E/ w: ?9 E; Z8 l) U- a 当递减计数器的值小于0x40时 窗口值外重新加载递减计数器 如果启动了窗口看门狗并允许中断,当递减计数器等于0x40时产生提前唤醒中断(EWI),可以被用于重装栽计数器以避免WWDG复位。 2 Y. D" h, M, H0 F0 n 用法 如果看门狗被激活(WWDG_CR寄存器中的WDGA位置1),并且当7位递减计数器(T [6:0]位)从0x40递减到0x3F(T6被清除)时,它启动重置。 如果软件在计数器大于窗口寄存器中存储的值时重新加载计数器,则会产生复位。+ O8 J6 s. U" P: f1 q8 _; S$ T 4 E( O2 @ Y- Y! e6 F8 e" r* V1 R 在正常操作期间,应用程序必须定期在WWDG_CR寄存器中写入数据,以防止MCU复位。 仅当计数器值小于窗口寄存器值且大于0x3F时,才必须执行此操作。要存储在WWDG_CR寄存器中的值必须在0xFF和0xC0之间。 $ N7 x' S1 e6 |. {$ g- ?# E 框图) C. X7 }# y" `4 k% v 4 ^4 h1 e, g' A& Z- Z# K# k 启用看门狗% j, H1 F5 O7 a 当FLASH选项字节WWDG_SW选择“软件窗口看门狗”时,看门狗在复位后始终被禁用。通过将WWDG_CR寄存器中的WDGA位置1可以启用它,然后只能通过复位将其禁用。, w( m; R( f& u: y9 w! B- m 当FLASH选项字节WWDG_SW选择“硬件窗口监视程序”时,在复位后始终启用监视程序,因此不能将其禁用。 0 H, e6 w1 U$ ^! ]) r/ Y 递减计数器用法 该计数器可以自由运行,即使禁用了看门狗也可以递减计数。 当看门狗使能时,必须将T6bit置1以防止立即产生复位(即T[6:0]大于0x3F); 为防止复位,当计数器的值小于窗口寄存器的值且大于0x3F时,必须重新装入递减计数器。 下图描述了过程: 提前唤醒中断(EWI)1 f$ A1 c/ F' `, l2 w. G + @( c9 a9 @) i# Z$ y5 L/ A 通过将WWDG_CFR寄存器中的EWI位置1,可以使能EWI中断。当递减计数器达到值0x40时,将在重置芯片之前生成EWI中断,相应的中断服务程序(ISR)应该重新装入WWDG计数器以避免WWDG复位,然后触发所需的操作。通过将WWDG_SR寄存器的EWIF位写为0,可以清除EWI中断。当无法处理EWI中断时,例如由于较高优先级任务中的系统锁定,最终会产生WWDG重置。: S% q& d7 E3 [3 ~% s# j2 U0 g # i5 \ O3 z5 ~6 [" _+ e$ G- m2 s 计算超时时间9 q5 N6 G8 g7 k1 J& F. \; P + {0 q7 y+ k) {4 G% v . h# }) Y+ R, p- c 如:当APB=48MHz,WDGTB[1:0]=3,T[5:0]=63时; , z' R! C1 c- R8 Z : W8 {: H& }' u/ E5 o/ `# O 寄存器 寄存器可通过半字(16位)或字(32位)进行访问。, A' R2 F: B1 P P& \: w# A9 S 控制寄存器(WWDG_CR) ' |/ f4 @! Y) t+ g7 l# e7 P 偏移地址:0x000 8 J) r7 l& ~8 ^) R& s0 o 复位值:0x0000 007F4 G! r1 g1 S7 V" r# J% @# y# j d" G2 m. m- E( X- i BIT7:WDGA(r/s),启用看门狗。由软件置1,只能通过复位让硬件清0。0:禁用看门狗、1:启用看门狗 % i& D- U/ |+ Q4 e BIT 6:0:T[6:0](r/w),7位计数器(msb to lsb),当值从0x40减到0x3F时产生复位(T6bit被清除)6 Q, y/ E4 C; d4 Q+ M * s, z, E4 q/ C$ p3 T6 H+ i 配置寄存器(WWDG_CFG)0 J0 J0 Q% g* I4 ~ 偏移地址:0x004 3 Y9 ]4 W* `; U! x3 v7 u$ U% [7 p 复位值:0x0000 007F bit 13:11 WDGTB[2:0] (r/w),时基 4 S+ M6 @4 `! ^) M; i# z6 ? 000: CK计数器时钟 (PCLK 分频4096) 除以1 001: CK计数器时钟 (PCLK 分频4096) 除以2 010: CK计数器时钟 (PCLK 分频4096) 除以 4 011: CK计数器时钟 (PCLK 分频4096) 除以8- o4 ?, i, m1 b5 h; z 100: CK计数器时钟 (PCLK 分频4096) 除以16# k6 b/ M! ^6 P0 d/ A# ?! s9 [ 101: CK计数器时钟 (PCLK 分频4096) 除以32" Z! s6 _) U) [8 p% F$ H 110: CCK计数器时钟 (PCLK 分频4096) 除以64 111: CCK计数器时钟 (PCLK 分频4096) 除以1289 Y) |# `, u/ m5 B6 Z7 S 2 w c% [ W2 K# N, B bit9 EWI (r/s), 提前唤醒中断位,置1时,只要计数器值到0x40就会发生中断。该中断仅在硬件复位后清楚。, {% i! Y/ S/ A9 h6 m) L 0 W. V2 l- U; B' \; l bit6:0 W[6:0](r/w),7位窗口值,用来与递减计数器比较的窗口值。1 ] }$ R& J" r, f) ]. R; G - p0 P. Z1 r: H 状态寄存器(WWDG_SR)* o) E7 w& \% d# l: D + ^7 i- D( O( K' Y+ c/ y3 G 偏移值:0x0083 O$ D' a2 {/ `# d$ v3 `4 V# C; S# U ) ~6 a7 w. N) ~8 H3 _" o O, i 复位值:0x0000 0000 / W; j+ X+ j& A: G0 ^8 u* o bit0 EWIF(rc_w0) 提前唤醒中断标志,当计数器达到值0x40时,此位由硬件置1。 必须通过软件将其写入“ 0”来清除它。 写“ 1”无效。 如果未启用中断,则该位置1。& J% m7 r3 g. f x4 T- Q ( D* {; M) @3 ]4 L: C 实验示例$ T6 W% M M" u. S$ I 1、开启调试接口、HSE 9 r% y9 E0 o. R0 A+ R$ ] 2、 PA0设置为GPIO_Input,在NVIC中使能看门狗中断% e8 x% J6 L6 q# r - i( D+ P! r$ `5 s 3、使能USART1,使用异步模式,波特率115200,8,none,1 ) L5 W9 ] a! C4 y% ]5 q ; w2 ^7 }. }) g( x- c 4、激活WWDG,设置分频系数128,窗口值(64~127)=64,计数值=127 $ g, n9 i- F" c c w7 [7 K 5、设置时钟树,HCLK=64MHz、PCLK=32MHz, C4 K/ V u/ z. B7 o( y / T1 F5 z' \8 ?) G/ T" R 6、利用上面的公式,计算当计数值T[6:0]到0x40的时间,引发EWI中断进入喂狗的时间 =1048.576ms 即每1048ms喂一次狗。* Z; ?# e1 B. u ' R" c z: R8 t3 d( e2 A+ _ 7、设置工程文件属性,生成代码。; C _2 t( S" z& U$ ~8 N " [" Z4 }8 L! X( U7 I: a 代码 2 a7 w! J. z) [0 | 1、在USART.c文件中加入串口打印代码
2、在main.c文件中加入开机打印代码," [) u2 y1 [1 ?" [2 E. S 5 ?0 O+ M8 [ K9 j8 ]' m
加入EWI中断代码 6 H% _2 |# z+ d5 ` S3 N
3、编译,烧录之后就看到效果 " d/ R' K# y( s5 p : z1 T* ]( L5 ]" i% U" E- H |
X-NUCLEO-IKS4A1实现手势滑动
STM32G系列RS485自动收发控制以及自适应波特率实战
STM32G0系列ADC扫描序列模式解读
STM32固件库分享,超全系列整理
【经验分享】FPGA作为从机与STM32进行SPI协议通信---Verilog实现
【管管推荐】STM32经验分享篇
STM32G030F6P6基于HAL库模拟SPI驱动1.8寸TFT LCD屏幕
STM32的CAN FD位定时设置注意事项
基于STM32将移植 SBSFU 到 STM32G070过程分享
基于STM32G030 RAM不够用经验分享