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

基于STM32F1的CAN通信之IWDG

[复制链接]
攻城狮Melo 发布时间:2023-10-23 20:22
一、IWDG简介
独立看门狗(Independent Watchdog, IWDG),什么是看门狗?字面意思——看门的,有陌生人来,就会叫。实际在嵌入式领域里,看门狗也是这种作用,当软件程序发生故障或者程序跑飞时,看门狗会产生复位信号,复位系统。

二、STM32的IWDG
2.1 STM32的IWDG简介

STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。

IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。

• 自由运行的12位递减计数器
• 时钟由独立的RC振荡器提供(可在停止和待机模式下工作)
• 看门狗被激活后,则在计数器计数至0x000时产生复位

一旦使能IWDG,就无法关闭。只有等到复位之后,才能将IWDG关闭。

2.2 喂狗
通过上面的简介可以知道,独立看门狗实际就是一个12位的递减计数器,当计数器的值递减到0的时候,就会产生复位。但是,如果我们在计数值递减到0之前,重新给计数器赋值,那么就不会再产生复位。这个操作叫做喂狗。


2.3 IWDG框图

微信图片_20231023202157.png


IWDG框图


IWDG的框图很好理解,IWDG由一个由独立的RC振荡器提供时钟。经过一个8位的预分频器对时钟信号进行分频。12位递减计数器按照设置好的初始值和输入时钟递减。当递减计数器递减到0时,产生独立看门狗复位。

在产生复位之前,如果将重装载寄存器传递给递减计数器,那么就会重新开始递减,这叫做喂狗。

键寄存器也叫做关键字寄存器,往该寄存器写入不同的值,有不同的作用

• 写入0x5555——表示允许访问IWDG_PR和IWDG_RLR寄存器
• 写入0xAAAA——将重载寄存器的值传递到递减计数器,也就是喂狗
• 写入0xCCCC——启动独立看门狗功能

中文参考手册中给出了一个时间表

微信图片_20231023202153.png

IWDG的溢出时间表



时间的计算方法是,时间 = 重装载寄存器值  / (输入时钟频率 / 4 * 2^预分频系数)

为什么是4 * 2^预分频系数,可以看一下中文参考手册对于预分频寄存器的描述

微信图片_20231023202150.png

预分频寄存器描述



三、IWDG配置步骤
• 开启寄存器访问(允许访问IWDG_PR和IWDG_RLR寄存器)
• 设置IWDG预分频系数和重装载值
• 将重装载寄存器的值传递到递减计数器(喂狗)
• 开启IWDG


四、IWDG配置程序
44.1 IWDG初始化程序

  1. /*
  2. *==============================================================================
  3. *函数名称:IWDG_Init
  4. *函数功能:初始化IWDG
  5. *输入参数:pre:预分频系数(0~6);rlr:重装载值(0~0xFFF)
  6. *返回值:无
  7. *备  注:独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40(ms)
  8. *==============================================================================
  9. */
  10. void IWDG_Init (u8 pre,u16 rlr)
  11. {
  12.     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);   // 取消寄存器写保护
  13.     IWDG_SetPrescaler(pre);   // 设置预分频系数 0-6
  14.     IWDG_SetReload(rlr);   // 设置重装载值
  15.     IWDG_ReloadCounter();   // 重装载初值
  16.     IWDG_Enable();   // 打开独立看门狗
  17. }
复制代码


4.2 喂狗
  1. /*
  2. *==============================================================================
  3. *函数名称:IWDG_FeedDog
  4. *函数功能:喂狗
  5. *输入参数:无
  6. *返回值:无
  7. *备  注:无
  8. *==============================================================================
  9. */
  10. void IWDG_FeedDog (void)
  11. {
  12.     IWDG_ReloadCounter();   // 重装载初值
  13. }
复制代码

五、应用实例

初始化IWDG,配置2s内不及时喂狗就会复位。通过按下按键WK UP喂狗。串口打印复位和喂狗信息。IWDG初始化程序如下
  1. IWDG_Init(4,1250);   // 看门狗初始化,2s不及时喂狗,复位
复制代码

main函数如下
  1. u8 gKeyValue = 0;   // 记录按键键值变量

  2. int main(void)
  3. {
  4.     Med_Mcu_Iint();   // 系统初始化
  5.     printf("复位系统\r\n");
  6.    
  7.     while(1)
  8.   {
  9.         gKeyValue = Med_KeyScan();   // 获取按键键值
  10.         
  11.         // WK UP按下
  12.         if (gKeyValue == 1)
  13.         {
  14.             IWDG_FeedDog();   // 喂狗
  15.             printf ("喂狗\r\n");
  16.         }
  17.     }
  18. }
复制代码

效果如下

微信图片_20231023202147.png

IWDG效果



按下WK UP喂狗,不会产生系统复位。

一旦2s内,未按下WK UP,就会产生系统复位。


转载自: 二土电子
如有侵权请联系删除


收藏 评论0 发布时间:2023-10-23 20:22

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版