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

【经验分享】STM32Cube HAL IDWG独立看门狗/WWDG窗口看门狗

[复制链接]
STMCU小助手 发布时间:2022-4-7 11:36
实验内容:
% c. H1 Q# t- {9 ]2 w) |: w# _% k& G# z
一、原理图
1 q* K! T+ u5 l# R4 t3 x
* v& X! w; G. e# Z3 h ~`B8KDN6X~)RJC(VYCHIXTF.png
% x: P$ s" \. N) s% H' _
9 u9 `1 k3 P( S  R) B ——————————————————独立看门狗——————————————————. {0 H" y" T$ n

7 Y& N9 K) x$ Y! X$ E二、 CubeMX配置. l0 o: U# Z* x# X
0 o  P: t7 m9 `) T
Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。
, n9 g0 H& Z* i$ }, ]4 Q0 f4 Z7 Z' q4 I7 d: e
~VC35QGY$LT7]BKM36_EXDI.png
8 f. i- z, x8 w* k- j. q1 k/ U+ E) B" V' W; d, x
Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。& {  y1 S6 A: i$ K

9 d% I* z4 A; B WAHULLSI5C[``04N~VQW4.png & p# h, z. @8 f- R9 s9 T, [
; }: V$ k, w$ M- F0 x0 N* j* \
0DCI2X2%V)[8A]8YSI1PJYT.png
5 g5 E$ m+ k  w+ r3 P6 `9 j0 |4 @* g; K- r- L/ a: }. T0 j  z
Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)7 z6 S( v( Z) f1 f6 r0 Y) B

- e% W$ {5 B. Q  ~% ^5 {$ b {2FB@N$$U]][`3E$R83TUIV.png $ c* b- d+ `( b; K$ J, v! ?7 j

: {2 J+ }: b7 Q( h) N  XStep4.配置LED灯所涉及到的GPIO口方便我们观察实验现象。
- B- q/ x  X* K' l: Q+ ]3 D. N. v
' H& k- y3 B, m6 b* e5 @ VBRF{_UYCO3DPPZ[MW6M@2S.png
. \3 l0 u: d1 G/ E* _. ^/ [5 e  a9 n  W! e
Step5.设置独立看门狗的参数,因为独立看门狗的时钟是由内部低速时装钟LSI提供,时钟值为40KHZ,我们这边设置分频值为64(寄存器的值为4),计数值为3125,计算可得看门狗超时时间为 64*(3125+1)/40000=5S,超时时间 Tout = (rlv+1)*(4*2^prv) / 40000 (s) ,prv 是预分频器寄存器的值,rlv 是 重装载寄存器的值。
% o% a; Q2 n$ P1 I2 y( }+ ?0 s! l5 d: F
[)2DJ%}K07NF8IKA]B7442L.png : k, g2 O8 M1 x1 w

1 O/ h- J" ?3 G" [+ d到这里关于相关参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。
) E8 k5 S; Q  Q0 K' V9 h8 e
8 X: P# k8 |% D 三、添加功能代码4 d' Y3 J% d) z, w- C
2 X, I! X2 F0 C3 Y; S/ {. p
因为设置的是超时时间为5s,所以只要在5s内喂狗就可以,代码可以通过设置不同的延时时间得到不同实验现象。同时代码中,通过检测标志位区别上电复位和看门狗复位,注意标志位需要手动清除。/ R% k$ }- l7 O& Q7 B6 C

9 {1 F: J! U- s1 {, ]: E
  1. int main(void)
    1 E; j% G  f( W# @1 h3 ]9 ^
  2. {
    3 @4 |* y8 O: @) a+ Q5 N8 x

  3. 2 j; u1 y5 c6 t7 X
  4.   HAL_Init();
    8 k% t# I+ b5 N6 K4 ?# m4 `
  5.   SystemClock_Config();
    ! S0 |- g% l/ W2 h) Q
  6.   MX_GPIO_Init();$ J3 {' \$ C9 q
  7.   MX_IWDG_Init();
    7 p& T1 ~* Z- B- j1 [+ F/ {
  8.         /*判断复位是上电复位还是看门狗复位,看门狗复位:闪红灯,上电复位:闪蓝灯*/
    - J' x3 L) w1 m; Z0 ^% z! }
  9.   if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST))& h, I/ R. e1 i0 b; o9 e& H% u
  10.   {% [, n9 D0 Z: }% u$ \
  11.                 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_RESET);//红灯亮* f! j7 A$ F/ d, S$ }' {
  12.                 HAL_Delay(50);/ P4 i; Q5 C4 {, c  }$ S4 y( f( z' u
  13.                 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET);//红灯灭' F  T- V' @: g; U2 c$ q  A0 P
  14.                 __HAL_RCC_CLEAR_RESET_FLAGS();//需要手动清除复位标志
    / j- W- |0 J+ t5 A& m/ y& r3 c3 e
  15.   }& o/ w0 R4 {0 r. y2 [9 o+ q
  16.   else% L- A& D! n$ p/ E2 @
  17.   {
    ' D0 d( p5 T) v0 n
  18.                 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_RESET);//绿灯亮/ P8 w2 J* z6 l
  19.                 HAL_Delay(50);. l0 R  o* R' {/ ]( k6 g& T
  20.                 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_SET);//绿灯灭& J: m. N1 J( B# H4 R
  21.   }
    : k, w0 C! {4 o3 O, J: U" R
  22.   while (1)0 ~* l' z& {% \& ]: n: a  i
  23.   {9 d5 z% j8 W/ {- N% Z  f
  24.                 2 {7 N! z7 e- U! ^9 ^9 a" l; Z
  25.                 /*设置独立看门超时时间为5秒,可通过不同时间的喂狗来验证看门狗是否起作用*/( {6 ]( ~% U0 t+ D5 C3 ^. x$ ~
  26.                 HAL_Delay(4000);
    ' q2 E5 X( J- y! J
  27.                 //HAL_Delay(6000);
    5 J; c& h9 y; ?4 E
  28.                 HAL_IWDG_Refresh(&hiwdg);//喂狗
    9 e" b. h4 T. u3 w
  29.   }) ^6 M* c9 W7 O, c  r
  30. }
复制代码
! l& m6 t9 B5 j! y$ w6 H

5 B* l; _. E( B  ——————————————————窗口看门狗——————————————————* U9 n, }" Z7 d1 e" I7 m. L

$ A* A4 @1 g* R$ i二、 CubeMX配置( g& X4 x0 S" m% t2 n) |

$ n% C, M- \, N  t# v# pStep1-Step4的配置与独立看门狗基本一致,所以参考独立看门狗即可。
. g! u5 o# x6 V, T5 w3 b7 F" a  ?
; B6 P+ t! X  sStep5.串口配置(主要为了在串口调试助手显示调试数据),因为没有用到中断和DMA所以我们就不过多讲解。, Y& y! I9 W% _
( D5 Z3 N2 T$ K$ _1 I
4TZAP%EOLDQGG0X4]@RFJ)B.png
$ E8 g( L: }9 W. O3 b( q% e& Z- c) s& M* a: v
+ i1 a% I9 T# }( n$ M& u) m
Step6.窗口看门狗的配置。PCLK1时钟频率为36M,计数器时钟频率为CNTCK=PCLK1/4096/(2^WDGTB)。因为分频数配置为8分频,即WDGTB=3,计一个数的时间TCNT=1/PCLK1=910us。窗口值最大值设置为0X49(73),最小值默认为0x40(64),计数的值为0X7F(127),最大超时时间:(127-64+1)*0.91=58.24ms,最小超时时间:(127-73+1)*0.91=50ms, 所以喂狗的时间段为:50ms-58.24ms。$ w8 c) ^7 ?. c( y3 A- c9 K  ~
* \! G. k4 u& C4 k3 ?1 \
JG7BVI6D$Y%P43UAGZY_V.png
' ?# w+ z/ g9 B; ^) o. F: ]! L. u( {/ ~" |( ?2 F
到这里关于相关参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。
9 b5 i: V- Z" D
9 o" o" w6 {1 P& h 三、添加功能代码
$ Z. o% S. }  Y0 n* a/ b
" z2 w- O) G4 L0 i1、我们等会会向串口调试助手发送数据,进行实验结果的验证。 发送数据我们采用printf函数,所有需要重定向c库函数printf到串口。注意使用时需要在keil设置中勾选微库(use mircolib),同时需要添加头文件#include <stdio.h>。* ?8 J8 |& p; M3 ], n
  X! x1 w# f2 U0 j  @/ q1 R
  1. //重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
    8 u- w2 G5 t7 T# k8 J
  2. int fputc(int ch, FILE *f). r5 f' N' Z' }) N
  3. {5 ^% P! H2 l$ i6 Y" {
  4.         /* 发送一个字节数据到串口DEBUG_USART */
    ' [& [8 L* p; |& S
  5.         HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);        
    $ N$ P& P7 m5 e6 R' n
  6.         ( X! q0 {3 k, P9 A. b$ x4 E& z
  7.         return (ch);9 `: u* L/ _! I$ D7 ?, [
  8. }. Y: Z4 x0 s: @( ?% Q. z: L

  9. 2 i3 j6 h% I3 t% i/ W; l, K+ z
  10. //重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数; Y2 T0 M/ x, d( i) o0 Z0 J
  11. int fgetc(FILE *f)! ]3 O* |0 T$ E
  12. {                . [* I6 v+ m' [" Y8 F2 [
  13.         int ch;, @8 E+ `" @$ G. \5 }6 P: ?
  14.         HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);        8 I  s5 B5 W) O+ o  f
  15.         return (ch);
      d$ b& I7 L! x! t8 b
  16. }
    ) k. b1 m6 g- r2 Y8 ]% ^
复制代码
( z8 X9 J; B3 V0 R5 L" y/ B8 i, F# m
2、在主函数while(1)循环中添加检测语句,用于检测计时是够到达窗口值(喂狗的时间段)。在实际程序中,需要计算程序的实际运行时间再来设置窗口值。8 _' h: Y5 y: q4 f! I
4 s9 H6 Q  `  N' a, @
  1. while (1)) k7 U9 ^, h! S3 d' B- H" G9 f
  2.   {$ \1 c$ R2 G# k
  3.     /* USER CODE END WHILE */! y3 o; I+ y! Y0 j5 a% ]7 e7 u
  4.                 /*PCLK1时钟频率为36M,计数器时钟频率为CNTCK=PCLK1/4096/(2^WDGTB),: K" Q$ m5 A$ P) n- \
  5.                 因为分频数配置为8分频,即WDGTB=3,计一个数的时间TCNT=1/PCLK1=910us
    : \: h3 b, v4 p( u1 _* k) t2 g' N. F+ C
  6.                 窗口值最大值设置为0X49(73),最小值默认为0x40(64),计数的值为0X7F(127)
    ' [. T0 X. W2 Q
  7.                 最大超时时间:(127-64+1)*0.91=58.24ms,最小超时时间:(127-73+1)*0.91=50ms: a8 U7 M. {7 v& |
  8.                 所以喂狗的时间段为:50ms-58.24ms*/; G  a% ^8 \3 D$ @/ v; l
  9.                 if(((WWDG->CR)&0x7F)==0X49)//计数值等于0X49(十进制:73),开始喂狗& o9 u- _6 t6 N* e* K
  10.                 {( i4 S/ |- ^- e8 Z
  11.                          HAL_WWDG_Refresh(&hwwdg);//喂狗函数,即刷新计数值为0X7F(127)
    # k$ d+ B( `' w  l( p  H
  12.                          HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);//正常喂狗,绿灯亮3 S3 V/ m1 Z! P# Z
  13.                 }
    & ]1 }# }. J& k2 V$ }( f2 [
  14.     /* USER CODE BEGIN 3 */$ i/ C, s1 @0 w1 a$ K' H
  15.   }
复制代码

& P/ C3 v$ @) F  H4 u3 H3、如果没有正常喂狗,进入死前中断函数,进行一些重要数据的处理。/ g2 o1 l' u4 q
- s- d% z" D+ t* e; [
  1. /*WWDG 中断服务程序,如果发生了此中断,表示程序已经出现了故障,用来保存重要数据等*/
      s! i# C5 z* j7 X$ L+ s+ Y6 O( z
  2. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
    ( z4 B1 @) d, p5 |+ d" o0 [
  3. {
    1 {0 T3 R% r1 m( r! j/ l
  4.         printf("程序已跑飞");
    8 q5 ^" b: @4 U0 H2 l
  5. }
复制代码

; k# O( ]) L7 G' S' _+ a& S关于看门狗的重点:- ^9 Q2 P+ y; v2 {$ |8 v
, H/ R1 g  Y% d
1、独立看门狗和窗口看门狗的区别
# A" e  \0 C* o6 R' q2 s
! ~- \$ ^: @* m3 t) P5 E2 T. V( j P@_1HFM(@P86BV2P@7P{)RU.png
+ Q1 v/ q1 z* ^9 V  I9 Y5 u4 G% h4 F2 X" F9 u2 [( K1 v
2、看门狗超时时间的设置。: b; ^; d+ |' ^% o

% T1 r9 }7 [5 P' p+ K$ q0 W" O9 W& v( y! i
赞 收藏 评论0 发布时间:2022-4-7 11:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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