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

基于STM32F1的CAN通信之IWDG

[复制链接]
攻城狮Melo 发布时间:2023-10-23 20:22
一、IWDG简介
: I7 i4 R' H1 c+ l  l独立看门狗(Independent Watchdog, IWDG),什么是看门狗?字面意思——看门的,有陌生人来,就会叫。实际在嵌入式领域里,看门狗也是这种作用,当软件程序发生故障或者程序跑飞时,看门狗会产生复位信号,复位系统。
4 k, H. l! I9 q. ^1 F0 k# Y4 J. F& d0 o
二、STM32的IWDG
  E' L; G( b: m2 B7 E2.1 STM32的IWDG简介
$ E5 [- ?2 M" U7 L, t$ x& X
STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
9 K, H8 n; t4 N/ z2 d% V$ r3 [8 ?8 Y2 f% }5 q0 H5 @& B) F) l
IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。
) I, T  D2 I$ T) o' k6 G
* ]* ]  @( Y' Z4 Y# N: |5 J
• 自由运行的12位递减计数器
7 G+ Z) f9 R- n% _3 G  _  e• 时钟由独立的RC振荡器提供(可在停止和待机模式下工作)
; F: k3 w6 R( U2 H, f9 Q5 [$ d• 看门狗被激活后,则在计数器计数至0x000时产生复位7 h: \' Z: `) z0 A
6 S- |& n; \1 E# @7 ?3 _5 Y9 L8 ?
一旦使能IWDG,就无法关闭。只有等到复位之后,才能将IWDG关闭。5 \6 ]/ L& |4 o( x

5 ~& k0 r( {; y/ J2.2 喂狗- Y: |1 Y- y% q2 F6 U
通过上面的简介可以知道,独立看门狗实际就是一个12位的递减计数器,当计数器的值递减到0的时候,就会产生复位。但是,如果我们在计数值递减到0之前,重新给计数器赋值,那么就不会再产生复位。这个操作叫做喂狗。
8 N* [" U4 {( \/ T* \$ O/ V+ a& s: i8 V6 k" s0 Z
  W* n* y& x' S. C: K4 K
2.3 IWDG框图
. L5 \# _2 |7 s) F3 |* |2 ?2 p2 J! c; ?+ p9 E3 ]! m/ L
微信图片_20231023202157.png
( L6 ^+ j- x7 L4 ~) Y/ v

* p( z0 e; I. z. A
IWDG框图

# [6 Y  g7 N. v. v
$ y- E3 p3 a' ?, v4 U
IWDG的框图很好理解,IWDG由一个由独立的RC振荡器提供时钟。经过一个8位的预分频器对时钟信号进行分频。12位递减计数器按照设置好的初始值和输入时钟递减。当递减计数器递减到0时,产生独立看门狗复位。
: S  \; D* V+ V4 i

6 b& T6 Y& o9 O9 }+ z# Q在产生复位之前,如果将重装载寄存器传递给递减计数器,那么就会重新开始递减,这叫做喂狗。8 Z6 d3 `0 q- l0 n% c/ a& t7 A1 a
0 C* m8 x  l+ W+ n' Q
键寄存器也叫做关键字寄存器,往该寄存器写入不同的值,有不同的作用0 Y5 Z: }: O+ ]0 I1 Q7 D

4 n* x3 s; F$ ^! A& |. j0 b$ o, b1 a, e• 写入0x5555——表示允许访问IWDG_PR和IWDG_RLR寄存器  t, D2 {- f$ I: @5 T
• 写入0xAAAA——将重载寄存器的值传递到递减计数器,也就是喂狗9 z3 v. j3 Y: `; w3 \( m/ w
• 写入0xCCCC——启动独立看门狗功能
; Z) A  A! O; b( Y' L! q) V# x* b5 T' V  a6 l' v) ^$ J! B
中文参考手册中给出了一个时间表
! }5 J2 E2 Z$ o/ N8 I0 M9 Y! a2 g5 D  J" z5 ^
微信图片_20231023202153.png

7 j* G' S  J% b' j$ U& v# o
IWDG的溢出时间表

' P1 z/ P/ R/ I9 v2 g* L+ h
$ Y9 K5 x! C' f6 l7 b" s

5 E6 ?5 w( G9 b; Q6 ~2 M
时间的计算方法是,时间 = 重装载寄存器值  / (输入时钟频率 / 4 * 2^预分频系数), \) m: _+ V( y, A6 |

6 j9 b( U+ R, B5 B7 T" _为什么是4 * 2^预分频系数,可以看一下中文参考手册对于预分频寄存器的描述
/ k" ^0 X/ M% U/ i  i6 y
! \5 f3 o5 z( q" R) X7 d
微信图片_20231023202150.png
- n8 p- f. n4 A
预分频寄存器描述

. a0 u8 b3 l+ ]# b0 e6 H2 w4 u! F# R9 Y

- |! R$ E( p# V7 u2 ]; R
3 w/ P: B: I( a. j
三、IWDG配置步骤
8 N' E. J/ z& ?8 U: Q• 开启寄存器访问(允许访问IWDG_PR和IWDG_RLR寄存器)
5 k9 j  i: D' ]• 设置IWDG预分频系数和重装载值  e* i9 T! _! Z2 v
• 将重装载寄存器的值传递到递减计数器(喂狗)6 G; W- I' P! \; Y2 t
• 开启IWDG
* p& L: u- {! R. [! r3 M2 j
! l) O: k2 _5 Z  z; |

, w9 o; g+ `3 ~& m% E+ R/ a0 N$ H1 l四、IWDG配置程序
5 V! U) G; Y5 L/ p44.1 IWDG初始化程序

/ O0 q& i9 {8 C) Z( w5 ?
  1. /*0 S' x3 `$ N5 n6 n6 U. u0 A7 m
  2. *==============================================================================# q+ [% ~/ ]8 q) s* c
  3. *函数名称:IWDG_Init
    5 V3 @# L1 ~5 f. G& d9 E$ ]- F" k
  4. *函数功能:初始化IWDG
    8 |/ M0 o* u- y+ n0 w
  5. *输入参数:pre:预分频系数(0~6);rlr:重装载值(0~0xFFF)
    $ |1 i, j7 z$ n% E5 y' B4 R
  6. *返回值:无
    ; l' [- l* t# ?! d
  7. *备  注:独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40(ms)
    0 {" T. o' a' C8 e
  8. *==============================================================================& D, C9 D1 `2 j  m/ P% j$ F
  9. */
    5 ^# T3 a7 R; N" S
  10. void IWDG_Init (u8 pre,u16 rlr)
    1 }. y6 ^. y+ i, N
  11. {
    " Y$ S$ `( `# K4 u% c: j! L. `! H* R. m% y
  12.     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);   // 取消寄存器写保护) z8 k" Y; N0 Q1 f9 B
  13.     IWDG_SetPrescaler(pre);   // 设置预分频系数 0-6
    ' O4 o( x5 x8 U7 e; Z8 C$ J' U
  14.     IWDG_SetReload(rlr);   // 设置重装载值
    4 H# b6 G1 S0 U- D  P8 K" b0 y
  15.     IWDG_ReloadCounter();   // 重装载初值* P; u- B+ A+ }# C; k, @
  16.     IWDG_Enable();   // 打开独立看门狗
    + H; k/ D8 J( }3 S$ [
  17. }
复制代码
9 r: t; E. l/ T* r* H' R

5 F3 T7 {: \/ X' G4.2 喂狗# q4 a/ @5 }( H7 c
  1. /*
    ! ~1 O: R. ?; @
  2. *==============================================================================
    / ^# A  n$ D! B+ C
  3. *函数名称:IWDG_FeedDog
    1 ^" s( _' F0 H- M
  4. *函数功能:喂狗
    & u% R  k8 ?1 C; ?  Q' f) _8 O
  5. *输入参数:无
    " Z. u4 Q, n1 `, S7 U
  6. *返回值:无
    1 L4 r6 q# a4 W' z) |" n
  7. *备  注:无
    " A- }. H3 E, v' T  {+ D) z
  8. *==============================================================================
    / [' B/ r3 f3 M% w; V8 Y
  9. */
    " I9 _8 M& F9 d1 u" x1 i4 z! P
  10. void IWDG_FeedDog (void); ?" w2 U/ {; ]- j
  11. {
    " O# j% y0 \& A/ p0 r
  12.     IWDG_ReloadCounter();   // 重装载初值7 B; P9 s3 s7 T- Q  X
  13. }
复制代码
9 H' O/ X: w. q$ f$ g7 z* W
五、应用实例

' t, @6 k+ z% z" y初始化IWDG,配置2s内不及时喂狗就会复位。通过按下按键WK UP喂狗。串口打印复位和喂狗信息。IWDG初始化程序如下& U4 S- S! u3 d; U- q
  1. IWDG_Init(4,1250);   // 看门狗初始化,2s不及时喂狗,复位
复制代码
. m. L6 b+ D* M
main函数如下
$ n( m: i  z/ {5 n3 @$ F( t6 j) T
  1. u8 gKeyValue = 0;   // 记录按键键值变量
    & f- U9 u* _: q) s7 k+ M7 C
  2. 5 }+ I% J- @! i! c8 U
  3. int main(void)6 Q! m! H7 H; |0 @
  4. {, y$ k+ m- b- u7 G9 t6 Y
  5.     Med_Mcu_Iint();   // 系统初始化/ {9 A' U8 `0 a8 j% Y
  6.     printf("复位系统\r\n");% j, l5 m' B' k
  7.     3 ?, A/ t( K" o5 ~
  8.     while(1)% q5 ]! x8 y3 f4 f! v. g; o
  9.   {
    7 U: K; x8 l6 f  Q" J2 E* I
  10.         gKeyValue = Med_KeyScan();   // 获取按键键值
    . L9 w( S, `: r# {6 K, b6 H
  11.         0 ~: O% i3 s1 i) V
  12.         // WK UP按下! N# ^, J' B+ M
  13.         if (gKeyValue == 1). q4 f$ n$ N, k5 w9 `; g+ A8 S% n- O
  14.         {3 N/ ~9 }% a; e+ w) {: V  h
  15.             IWDG_FeedDog();   // 喂狗: X% C0 Q8 z' H8 ?6 i
  16.             printf ("喂狗\r\n");" S+ q& k7 y1 l6 @
  17.         }: X4 M& V& f& T8 G* C
  18.     }0 h: |; J& G8 R) P  ]1 N- b
  19. }
复制代码

" R. ?$ p- N/ ?* I! ^! m) R效果如下
; D& `$ i2 z& X. k  h' Q
0 p+ k( @4 a4 q! ]' q
微信图片_20231023202147.png
; G8 j: E: V! F
IWDG效果
, H% v: t. X4 Y$ e7 o6 y- g

7 Y$ u3 |8 A; D; I1 i) }% Y: S! K( s, p! b5 }0 Y6 c
按下WK UP喂狗,不会产生系统复位。
  u' f  {& g. ~9 `9 Y
; t/ w9 \. J# D( C一旦2s内,未按下WK UP,就会产生系统复位。
9 t7 E+ A% y* A5 T# D% e; D! i& B: }
' \  Q5 c) O6 ?& T; `4 B

: s) {1 ?+ W% R( S转载自: 二土电子9 Z; j5 i* K/ T0 n; T
如有侵权请联系删除. I; Y& w9 F5 t- n, J
% m3 ?6 Z8 q/ l5 B) p8 R, x, d
, K# ]! r  v# F" Z1 j2 \
赞 收藏 评论0 发布时间:2023-10-23 20:22

举报

0个回答

所属标签

相似技术帖

官网相关资源

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