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

【经验分享】窗口看门狗启动时异常复位问题

[复制链接]
STMCU小助手 发布时间:2022-2-25 19:49
前言
. F% [: Q% D% j4 d窗口看门狗(Window watchdog, WWDG),提供了一种在指定时间窗内刷新看门狗的功能。同时 WWDG 提供了一个提前唤醒中断,能够在 WWDG 计数器值降到触发复位的上一个值时触发。实际应用中,可以在此中断被触发时,刷新 WWDG,并记录当前运行信息,以满足运行错误信息记录等功能需求。1 g8 c0 S3 O, A

' \; D* Q7 V& u& f7 B( x问题描述0 f! E3 s1 B1 W/ q& z
问题复现平台: STM3210E_EVAL 板( Q/ {$ |* F2 r) c  l$ j
                       IAR for ARM v7.70.12 c7 `3 w5 K, I% h8 f; t3 f
问题复现程序: 基于 STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples4 J. [1 v: G0 f7 _  D
问题描述:在应用开发过程中,WWDG 开启后,WWDG 的提前唤醒中断立即被触发,并且微控制器复位。. ?, Z& ^5 o  s. E" a1 R3 U
主要实现程序如下所示。" _- w9 ?3 _) x+ c, ]* }  b/ }1 L, N
  1. ……( w( _& @& I8 U5 p4 k+ w
  2. WWDG_SetPrescaler(WWDG_Prescaler_8);
    1 A2 F3 h. q, C5 P
  3. WWDG_SetWindowValue(80);% ]6 l- d  A1 x% _
  4. /* 在例程基础上添加,开启窗口看门狗中断 */
    " i8 o& a) O7 b5 s* P7 a5 b6 c
  5. ……
    6 q; ~4 J% \2 m6 u9 l, H& J
  6. NVIC_Init(&NVIC_InitStructure);2 D; |; L' k4 b  ^9 j7 z
  7. WWDG_ClearFlag();7 M$ {( N, Z" ]
  8. WWDG_EnableIT();
    * u2 j' j: I! x, `, o4 K2 Z
  9. WWDG_Enable(127);
    / \+ o) J, v, }! M0 ~5 G, I
  10. ……' B- @4 M- C+ c7 X8 L4 b
  11. While(1)
    & n" k9 [$ ]; g) P
  12. {
    ) k( u8 \2 B1 ?3 T* ?
  13. ……
    ; }7 S- h1 x3 C
  14. WWDG_SetCounter(127);! C- K4 r" f  W# c2 p9 G$ o& [
  15. ……# u* }5 n/ n0 A, z& ^! Y7 |
  16. }
复制代码

3 Z1 i# z/ F! y5 Z如流程图所示,在应用程序正常运行时,WWDG 中断不会被触发。当程序跑飞等异常情况出现时,由于未能在及时刷新 WWDG,导致 WWDG 中断事件被触发。在中断服务程序中刷新 WWDG,以免微控制器复位,造成运行信息被破坏,并保存运行信息以供错误分析。
7 g: e3 ^7 g* L4 n
( w8 j3 ?" t6 O. h- Y4 R 9BD)%)FDIY5`E9FAN(}8S1N.png . W8 x8 }9 q" i/ Y* _, x

5 N2 \8 e3 Y2 y/ \& S2 ?/ |$ s# P: o8 C
问题分析
4 y- i5 Z, ]" [$ q1 _利用 IAR 以及 ST-Link V2 进行在线调试,在执行完 WWDG_Enable(127) 指令后,WWDG 寄存器值如下所示。
+ l$ g6 }$ N4 o' P0 I* }3 R9 u9 H$ Z. `
BBJ@S8Q%P`MNU50KF4D9P{G.png & I  z- j! s# X6 e- U; S

; }# |. o- M. L其中提前唤醒中断标志 WDGA@WWDG_SR 被置位,意味着提前唤醒中断触发。在中断服务程序中,存在刷新 WWDG 指令。此时计数器值 T=0x7F@WWDG_CR 不在窗口内(W=0x50@WWDG_CFR),而 WWDG 在非窗口中(不允许刷新阶段)重装载计数器值会导致复位,如下图所示。
! C6 v$ B3 y9 A* a! M/ n2 U
; G  ?9 s8 N( U+ D HU[@GW)6A7XC]L{CZE@T`H3.png & b9 K/ w# R; I8 a) Y) \
. c4 j' ?9 z# t, f" |5 a
经过验证,针对这种情况,有两个解决方案。
: q' o3 {% s' w7 v2 k2 Z解决方案一:
0 b, w/ N2 F+ X2 t在使能 WWDG 之后清除提前唤醒中断标志位 EWI@WWDG_SR,然后使能提前唤醒中断。如下所示。
  M4 u8 \% a& W3 i! q" Y
  1. ……
    & J7 z- I5 T# u; x- `8 K
  2. WWDG_SetWindowValue(80);
    2 Q! A$ r' p9 s
  3. /* 在例程基础上添加,开启窗口看门狗中断 */
    9 y7 p0 Y! r6 S0 c- i2 W( L1 H
  4. WWDG_Enable(127);
    2 |. D% o7 h: T/ g( E- F
  5. ……
    , n! o3 R$ [! ?/ j, s) q" B
  6. NVIC_Init(&NVIC_InitStructure);) O. [$ G. V  ]3 [
  7. WWDG_ClearFlag();
    $ o( b% }2 B/ c' ~
  8. WWDG_EnableIT();
    8 f: i+ t% p" F# |9 p9 h
  9. ……
复制代码
: N- w0 X( Q( R7 [: x# k( ]
解决方案二:
8 a$ Q7 e8 E. Y配置计数器装载值不大于窗口值。如下所示。
5 K' i  J  ~: a, a
  1. WWDG_SetWindowValue(127);4 p" b, \8 ]) Q+ @8 v* j
  2. /* 在例程基础上添加,开启窗口看门狗中断 */' E9 G3 k- p, ]4 s
  3. ……
    8 f% b3 I3 J6 L, P. R7 L9 b4 c- R
  4. NVIC_Init(&NVIC_InitStructure);; }' Z& U( y2 R9 }) S6 v2 {
  5. WWDG_ClearFlag();0 u  [2 h& b) m' D- N( B' O5 ~/ D
  6. WWDG_EnableIT();
    / a; N7 `! [. W0 @' C4 S  H
  7. WWDG_Enable(127);! B% F6 w5 m0 \, A. N; ~' w1 s" ?
  8. ……
复制代码
" E, z3 G- y/ r, C8 `  r2 O8 A2 o& r& O
同时,需要确保唤醒中断的服务程序中存在中断标志位 EWI@WWDG_SR 判断语句,以避免异常。
1 M  ?& H; j& ^" X2 a, {' w  @
, p6 X8 S1 t. S/ V
3 @# ^9 W5 o, q: k' Q* C5 @; B总结3 Q( Q9 x  w" S6 g+ D: M& u
WWDG 不仅提供了一种有别于独立看门狗的程序监测方法。同时提前唤醒中断的存在,也为故障信息的保存以及分析,提供了一种途径。但是,需要注意的是窗口看门狗的时钟源来源于 PCLK1,在STOP、STANDBY 低功耗模式下,WWDG 功能被停止。" T3 N) T# Q0 Q  T  d
. q0 @2 A1 T# c3 T
赞 收藏 评论0 发布时间:2022-2-25 19:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

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