STM32 HAL库 STM32CubeMX -- IWDG(独立看门狗)

STM32 HAL库 STM32CubeMX -- IWDG

  • 一、IWDG简介
  • 二、独立看门狗的工作原理
  • 三、驱动函数
    • 初始化函数HAL IWDG Init()
    • 初始化函数HAL IWDG Init()
    • 其他宏函数
  • 四、超时时间计算
    • 第一种办法
    • 第二种办法(推荐)

一、IWDG简介

看门狗(Watchdog)就是MCU上的一种特殊的定时器,用于监视系统的运行,在发生错误(例如程序出现死循环)时,能触发一个中断或产生系统复位,防止程序跑飞。STM32 有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬。

二、独立看门狗的工作原理

独立看门狗(Independent Watchdog,IWDG)是由内部 32kHz 低速时钟 LSI 驱动的自由运行的 12 位递减计数器。LSI在时钟树上的位置如下图所示。
在这里插入图片描述
独立看门狗的内部功能框图如下图所示。
在这里插入图片描述

本节先分析独立看门狗的功能框图和它的应用;

独立看门狗用通俗一点的话来解释就是一个12 位的递减计数器,当计数器的值从某个值一直减到0 的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是喂狗 。

独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序50ms 多一点,如果超过60ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。

看门狗功能由VDD 电压域供电,在停止模式和待机模式下仍能工作。

1、独立看门狗时钟
独立看门狗的时钟由独立的RC 振荡器LSI 提供,即使主时钟发生故障它仍然有效,非常独立。LSI 的频率一般在30~60KHZ 之间,根据温度和工作场合会有一定的漂移,所以独立看门狗的定时时间并不一定非常精确,只适用于对时间精度要求比较低的场合。

2、计数器时钟
递减计数器的时钟由LSI 经过一个8 位的预分频器得到,在预分频器寄存器 IWDG_PR 里,有 PR[2:0]用于设置分频系数,分频系数从 4、8、16 到 256。

3、计数器
独立看门狗的计数器是一个12 位的递减计数器,最大值为0XFFF,当计数器减到0 时,会产生一个复位信号:IWDG_RESET,让程序重新启动运行,如果在计数器减到0 之前刷新了计数器的值的话,就不会产生复位信号,重新刷新计数器值的这个动作我们俗称喂狗。

4、重装载寄存器
重独立看门狗有一个重载寄存器IWDG RLR,可以设置一个 12位的重载值,例如 4000。在看门狗的递减计数器的值变为0之前,将IWDG_RLR 里的值重新载入看门狗计数器,就可以避免产生复位。超时时间Tout = (预分频因子*(重装载值+1))/LSI。关于计算超时时间在下面会详细介绍。

5、键寄存器
独立看门狗还有一个关键字寄存器 IWDG KR,其 KEY[15:0]是一个只可以写的关键字写入不同的关键字有不同的作用。
●写入 0xAAAA 时,重载寄存器 IWDG RLR 中的 12 位值就会被写入计数器,从而使计数器从头开始递减计数,避免系统复位。此操作称为刷新看门狗。
●写入 0x5555 后,才可以修改预分频器寄存器IWDG PR 和重载寄存器 IWDG_RLR 的内容。
●写入 0xCCCC 时,启动独立看门狗。
LSI时钟频率是 32kHz,看门狗最大重载值是4095(对应0xFFF),根据预分频系数可以计算出IWDG 的最长超时(timeout),如下表所示。
在这里插入图片描述

6、状态寄存器
状态寄存器SR 只有位0:PVU 和位1:RVU 有效,这两位只能由硬件操作,软件操作不了。RVU:看门狗计数器重装载值更新,硬件置1 表示重装载值的更新正在进行中,更新完毕之后由硬件清0。PVU: 看门狗预分频值更新,硬件置’1’指示预分频值的更新正在进行中,当更新完成后,由硬件清0。所以只有当RVU/PVU 等于0 的时候才可以更新重装载寄存器/预分频寄存器。

三、驱动函数

独立看门狗的驱动函数比较只有2个常规函数和几个宏函数。独立看门狗没有中断。

初始化函数HAL IWDG Init()

结构体 IWDG HandleTypeDef的定义如下,各成员变量的意义见注释:

typedef struct
{
  IWDG_TypeDef                 *Instance;  /*!< IWDG寄存器基地    */
  IWDG_InitTypeDef             Init;       /*!< IWDG 的参数 */
} IWDG_HandleTypeDef;

其中的成员变量 Init 是结构体类型 IWDG_ImitTypeDef,它定义了IWDG的参数,这个结构体定义如下,各成员变量的意义见注释:

typedef struct
{
  uint32_t Prescaler;  /*!< IWDG 预分频系数,也就是预分频寄存器IWDG_PR里的 PR[2:0] */

  uint32_t Reload;     /*!< IWDG计数器重载值,也就是重载寄存器IWDG_RLR 的值 */

} IWDG_InitTypeDef;

初始化函数HAL IWDG Init()

HAL IWDG Refresh()用于刷新看门狗,就是将重载寄存器IWDG_RLR 的值重新载入看门狗计数器,避免产生系统复位。函数HAL_IWDG _Refresh()的原型定义如下,只需使用IWDC对象指针作为函数参数:
HAL_StatusTypeDef HAL IWDG Refresh(IWDG HandleTypeDef *hiwdg);

其他宏函数

文件 stm32f4xx hal iwdg.h 还有几个主要的宏函数,这些函数的输入参数__HANDLE__是独立看门狗对象指针。
●HAL_IWDGSTART(HANDLE),启动独立看门狗,就是向关键字寄存器IWDG_KR写入 0x0000CCCc。
●HAL_IWDG_RELOADCOUNTER(HANDLE),重置看门狗计数器的值,就是向关键字寄存器 IWDG_KR 写入 0x0000AAAA,这会导致重载寄存器IWDG_RLR中的值载入看门狗计数器。这个宏函数与函数HAL_IWDG_RefreshO的功能相同。
●IWDG_ENABLE_WRITE ACCESS(HANDLE),使预分频寄存器IWDG_PR 和重载存器 IWDG_RLR 变为可写的,其代码就是向关键字寄存器 IWDG_KR 写入 0x00005555。
●IWDG_DISABLE_WRITEACCESS(HANDLE),使预分频寄存器IWDG_PR 和重载寄存器 IWDG_RLR 变为不可写的,其代码就是向关键字寄存器 IWDG KR 写入0x00000000。

四、超时时间计算

在这里插入图片描述
通过查阅多个文档和网上各种资料,有两种计算办法
两种办法大家酌情选择

第一种办法

Tout = ( (4*2^PR) * (RLV+1) )/ LSI;其中PR为上图中预分频系数对应的PR[2:0]位、RLV为重装载值(0 ~ 4095)、LSI为内部低速时钟,也就是驱动IWDG的时钟,F1一般LSI为40kHz ;

示例:
以F1为例,LSI为40kHz、预分频系数为8,PR为1、RLV为04095
最短时间:RLV为0,Tout = ((4*2^PR)*(RLV+1)) / LSI = ((4*2)*(0+1)) / 40000 = 0.0002s = 0.2ms
最长时间:RLV为4095,Tout = ((4*2^PR)*(RLV+1)) / LSI = ((4*2)*(4095+1)) / 40000 = 0.8192s = 8192ms

第二种办法(推荐)

Tout = (预分频系数 * (重装载值+1)) / LSI;其中预分频系数和重装载值为直接设置的,后面结合配置STM32Cube MX会很方便;LSI为内部低速时钟,F1一般为40kHz;

示例:
以F1为例,LSI为40kHz、预分频系数为8,重装载值为04095
最短时间:重装载值为0,Tout = (预分频系数*重装载值) / LSI = (8*1) / 40000 = 0.0002s = 0.2ms
最长时间:重装载值为4095,Tout = (预分频系数*重装载值) / LSI = (8*4096) / 40000 =0.8192s = 8192ms

这两种办法都可以算出上表中的数值,其实仔细分析这两种办法,原理其实都一样,为例方便算一点推荐使用第二种办法。

四、STM32Cube MX 配置
基础STM32Cube MX的配置参考这篇博客:STM32 CubeMx教程 – 基础知识及配置使用教程

配置RCC,使用外部晶振模式
在这里插入图片描述

配置SYS,debug模式选择Serial Wire
在这里插入图片描述

参数设置部分只有两个参数:
配置IWDG,先启用独立看门狗,配置预分频系数为32,重装载值为124;
Tout = (32*(124+1))/ 40000 = 100ms
在这里插入图片描述

使用一个串口用来打印调试信息,设置为异步通信模式
在这里插入图片描述

配置时钟树,从图上可以看到里面默认的LSI RC振荡时钟 40kHz ,LSI时钟配置到了IWDG
在这里插入图片描述

涉及到IWDG(独立看门狗)的函数有两个:

MX_IWDG_Init(); 	//独立看门狗初始化
HAL_IWDG_Refresh(&hiwdg);	//喂狗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/390432.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

悦纳自己:拥抱个人局限,开启成长之旅

悦纳自己&#xff1a;拥抱个人局限&#xff0c;开启成长之旅 在人生的旅途中&#xff0c;我们每个人都会面临无数的挑战和选择。有时我们会因为这些挑战而感到焦虑和不安&#xff0c;因为我们害怕失败&#xff0c;害怕无法达到预期的目标。然而&#xff0c;真正重要的是我们如何…

前端开发:Vue框架与前端部署

Vue Vue是一套前端框架&#xff0c;免除原生)avaScript中的DOM操作&#xff0c;简化书写。是基于MVVM(Model–View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。简单来说&#xff0c;就是数据变化的时候, 页面会自动刷新, 页面变化的时…

leetcode hot100爬楼梯

在本题目中&#xff0c;要求爬第n阶有多少种爬法&#xff0c;并且每次只能爬1个或者2个&#xff0c;这明显是动态规划的问题&#xff0c;我们需要用动态规划的解决方式去处理问题。动态规划就是按照正常的顺序由前向后依次推导。而递归则是从结果往前去寻找&#xff08;个人理解…

【打工日常】使用docker部署可视化工具docker-ui

一、docker-ui介绍 docker-ui是一个易用且轻量化的Docker管理工具&#xff0c;透过Web界面的操作&#xff0c;方便快捷操作docker容器化工作。 docker-ui拥有易操作化化界面&#xff0c;不须记忆docker指令&#xff0c;仅需下载镜像即可立刻加入完成部署。基于docker的特性&…

​电容的“隔直流、通交流”特性

习惯性的认为&#xff0c;电容就是“隔直流、通交流”的&#xff0c;细看下这张图杠一杠。 第一个问题&#xff1a;请问电容中间的介质是绝缘材质还是导电材质&#xff1f;答案是绝缘材质吧。如果是导体材质&#xff0c;那岂不是成了大电阻。 既然是绝缘材质&#xff0c;当左侧…

嵌入式Qt Qt中的信号处理

一.Qt中的信号处理 Qt消息模型&#xff1a; - Qt封装了具体操作系统的消息机制 - Qt遵循经典的GUI消息驱动事件模型 Qt中定义了与系统消息相关的概念; Qt中的消息处理机制&#xff1a; Qt的核心 QObject::cinnect函数&#xff1a; Qt中的“新”关键字&#xff1a; 实验1 初探…

定时器外部时钟

一、相较于内部时钟中断改动&#xff1a; 1.Timer.c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——JAVA

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 1. Java 1. 和 equals的区别 比较基本数据类型是比较的值&#xff0c;引用数据类型是比较两个是不是同一个对象&#xff0c;也就是引用是否指向同 一个对象&…

Mybatis——Javaweb进阶学习(五)

目录 一、Mybatis快速入门1.创建Springboot工程&#xff0c;数据库表user&#xff0c;实体类User2.引入Mybaties相关依赖3.编写Sql语句 二、lombok1.基本概念2.使用方法 三、基础操作1.环境准备a.数据库准备b.创建员工实体类Emp数据类型对比命名对比 c.Mapper接口创建 2.删除操…

通讯录的实现(未优化的完全版)

目录 一、前言 二、通讯录的实现 1.关于通讯录的前期准备 &#xff08;1&#xff09;关于全局变量的定义 &#xff08;2&#xff09;菜单的实现 &#xff08;3&#xff09;关于联系人结构体的创建 &#xff08;4&#xff09;实现菜单选项的功能 2、通讯录的功能实现 &a…

网络安全防御保护 Day5

今天的任务如下 要求一的解决方法&#xff1a; 前面这些都是在防火墙FW1上的配置。 首先创建电信的NAT策略 这里新建转换后的地址池 移动同理&#xff0c;不过地址池不一样 要求二的解决方法&#xff1a; 切换至服务器映射选项&#xff0c;点击新建&#xff0c;配置外网通过…

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章&#xff0c;转载请注明原文出处。 本文介绍嵌入式轻量化图形库LVGL 8.2移植到Linux开发板ATK-RK3568上的步骤。 主要是参考大佬博客&#xff1a; LVGL v8.2移植到IMX6ULL开发板_lvgl移植到linux-CSDN博客 一、环境 1、平台&#xff1a;rk3568 2、开发板:…

每日五道java面试题之java基础篇(十)

目录: 第一题 JVM有哪些垃圾回收器&#xff1f;第二题 垃圾回收分为哪些阶段&#xff1f;第三题 线程的⽣命周期&#xff1f;线程有⼏种状态&#xff1f;第四题.ThreadLocal的底层原理第五题.并发、并⾏、串⾏之间的区别 第一题 JVM有哪些垃圾回收器&#xff1f; ● 新⽣代收集…

ChatGPT绘图指南:DALL.E3玩法大全(二)

在前一篇文章中&#xff0c;我们介绍了什么是 DALL.E3 模型&#xff0c; DALL.E3 有什么优势&#xff0c;使用DALL.E3 的两种方法&#xff0c;以及DALL.E3 绘图的基本规则&#xff0c; 感兴趣的朋友请前往查看: ChatGPT绘图指南&#xff1a;DALL.E3玩法大全(一). 接下来&#…

【医学图像分割 2024】BEFUnet

文章目录 【医学图像分割 2024】BEFUnet摘要1. 介绍2. 相关工作2.1 基于CNN的分割网络2.2 ViT2.3 用于医学图像分割的Transformer 3. 方法3.1 双支路编码器3.1.1 边缘编码器3.1.2 主体编码器 3.2 LCAF模块3.2.1 双级融合模块(DLF) 3.3 损失函数3.3.1 边缘监督损失3.3.2 整体边缘…

GET 和 POST 方法有什么区别?

1.概述 当客户端通过 Web 与服务器通信时&#xff0c;此过程由超文本传输​​协议 ( HTTP) 启用。HTTP 是客户端和服务器之间的请求-响应协议。 GET 和 POST 方法是两种最常见的HTTP 请求方法。它们用于检索数据或将数据发送到服务器。它们是客户端-服务器模型的组成部分&…

云计算基础-存储基础

存储概念 什么是存储&#xff1a; 存储就是根据不同的应用程序环境&#xff0c;通过采取合理、安全、有效的方式将数据保存到某些介质上&#xff0c;并能保证有效的访问&#xff0c;存储的本质是记录信息的载体。 存储的特性&#xff1a; 数据临时或长期驻留的物理介质需要保…

EasyRecovery2024功能强大的电脑数据恢复软件

EasyRecovery是一款功能强大的数据恢复软件&#xff0c;支持从各种存储介质中恢复丢失或删除的文件。以下是EasyRecovery的下载教程、功能介绍以及最新版本简介&#xff1a; EasyRecovery支持多种操作系统版本。对于Windows系统&#xff0c;它支持Windows XP、Windows Vista、W…

linux系统zabbix监控分布式监控的部署

分布式监控 服务器安装分布式监控安装工具安装mysql导入数据结构配置proxy端浏览器配置 zabbix server端监控到大量zabbix agent端&#xff0c;这样会使zabbix server端压力过大&#xff0c;使用zabbix proxy进行分布式监控 服务器安装分布式监控 安装工具 rpm -Uvh https://…

从MobileNetv1到MobileNetv3模型详解

简言 MobileNet系列包括V1、V2和V3&#xff0c;专注于轻量级神经网络。MobileNetV1采用深度可分离卷积&#xff0c;MobileNetV2引入倒残差模块&#xff0c;提高准确性。MobileNetV3引入更多设计元素&#xff0c;如可变形卷积和Squeeze-and-Excitation模块&#xff0c;平衡计算…