STM32实现看门狗(HAL库)

文章目录

  • 一. 看门狗
    • 1. 独立看门狗(IWDG)
      • 1.1 原理
      • 1.2 相关配置
      • 1.3 相关函数
    • 2. 窗口看门狗(WWDG)
      • 2.1 原理
      • 2.2 相关配置
      • 2.3 相关函数

一. 看门狗

单片机在日常工作中常常会因为用户配置代码出现BUG,而导致芯片无法正常工作;或者会受到来自外界电磁场的干扰,造成程序跑飞 ,或陷入死循环 ,如果无法系统复位,那么整个系统都会卡死,这对产品的使用是灾难性的后果。

出于对单片机运行状态进行实时监测的考虑,产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称看门狗(WatchDog)

在STM32中,看门狗分为独立看门狗(IWDG)还有窗口看门狗(WWDG) ,二者的主要区别如下:

独立看门狗 IWDG窗口看门狗 WWDG
时钟源独立时钟LSI (40KZ低速时钟)PCLK1 时钟
中断没有中断,超时直接复位超时产生中断,可做复位前函数操作或重新喂狗
复位条件递减计数到0窗口期外或者递减到0x3F
计数器位数12位 (最大计数范围4096-0)6位(最大计数范围127-63)
应用场合防止程序跑飞、死循环检测程序时效,防止软件异常

1. 独立看门狗(IWDG)

1.1 原理

低速时钟 LSI经过预分频器 分频后用作驱动12 位的递减计数器,当递减至重装载值时,若还没有及时喂狗,系统就会产生一个复位信号,CPU收到复位信号,系统复位重新运行。具体步骤可以参考下面的框图。

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。额外注意的是,独立看门狗由 V D D V_{DD} VDD电压域供电,即使MCU在停止模式和待机模式下依然工作,除非使用RTC唤醒后喂狗,否则STM32进入低功耗模式后会因为没有及时喂狗而被唤醒。

1.2 相关配置

HAL库使用独立看门狗非常简单,使用STM32CubeMX配置IWDG只有三个参数:
· IWDG counter clock prescaler:分频系数
· IWDG down-counter reload value:重装载值
· IWDG window value : 窗口值(默认不修改。当计数器的值大于窗口值时,如果执行重载操作,则会产生复位)


IWDG溢出时间计算公式:

T o u t = N p r e s c a l e r ∗ N r e l o a d f I W D G T_{out}= \frac{N_{prescaler}*N_{reload}}{f_{IWDG}} Tout=fIWDGNprescalerNreload

其中 N p r e s c a l e r N_{prescaler} Nprescaler是分频系数, N r e l o a d N_{reload} Nreload为重装载值, f I W D G f_{IWDG} fIWDG为低速时钟源的频率。

1.3 相关函数

初始化函数:

/*** @brief  Initialize the IWDG according to the specified parameters in the*         IWDG_InitTypeDef and start watchdog. Before exiting function,*         watchdog is refreshed in order to have correct time base.* @param  hiwdg  pointer to a IWDG_HandleTypeDef structure that contains*                the configuration information for the specified IWDG module.* @retval HAL status*/
HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)

喂狗函数:

/*** @brief  Refresh the IWDG.* @param  hiwdg  pointer to a IWDG_HandleTypeDef structure that contains*                the configuration information for the specified IWDG module.* @retval HAL status*/
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)

2. 窗口看门狗(WWDG)

2.1 原理

窗口看门狗的流程框图如下图所示:

窗口看门狗的的时钟信号来自PCLK1,然后经过看门狗预分频器进行分频处理。

看门狗控制寄存器(WWDG_CR)为8位寄存器,其中首位为使能位,用于开启看门狗。后面为T[6:0] 的值。寄存器后六位为递减计数器(CNT),由分频后的时钟信号进行驱动。

看门狗配置寄存器(WWDG_CFR),寄存器的值为窗口上限值,当看门狗控制寄存器的值W6大于看门狗配置寄存器的值T6,则说明已经进入窗口期(比较器输出0),否则为非窗口期(比较器输出1)。

图中三个逻辑门电路(A、B、C)的作用分别如下:

A: 与门,输出1的条件是看门狗被使能的同时B输出为1。
B: 或门,输出1的条件要么是递减计数器减至窗口下限值(T6为0),要么是c门输出1。
C: 与门,输出1的条件是递减计数器减至窗口上限值的同时被喂狗(即WWDG_CR被写入)。

相比于独立看门狗,窗口看门狗(WWDG)是一个既能产生系统复位信号和提前唤醒中断的六位递减计数器。

  (1)复位的条件: 1.当递减计数器值从0x40递减到0x3F时复位(即T6位跳变到0)

             2. 计数器的值大于W[6:0]值时喂狗会复位。

  (2)中断的条件: 1.当递减计数器等于0x40时可产生提前唤醒中断 (EWI)。

  (3)喂狗条件 : 需要在窗口期(0x3F<窗口期< W[6:0])重装载计数器的值,才能防止复位。

2.2 相关配置

使用STM32CubeMX配置WWDG主要有五个参数:

  1. WWDG counter clock prescaler:分频系数

  2. WWDG window value : 窗口上限值,即W[6:0](即喂狗的窗口区间在0x3F ~ WWDG window value之间)

  3. WWDG free-running downcounter value:每次复位后重新装载的值,递减到窗口区间内才可以刷新。这个值必须大于0x40和WWDG window value。

  4. Early wakeup interrupt :早期唤醒中断,开启后当计数器到达0x40时会产生中断,可以在中断中进行喂狗或者函数操作。

  5. Window watchdog interrupt:窗口看门狗全局中断。在NVIC Settings中,若Early wakeup interrupt为Enable,则该中断需要打开。

2.3 相关函数

1. 初始化函数:

/*** @brief  Initialize the WWDG according to the specified.*         parameters in the WWDG_InitTypeDef of  associated handle.* @param  hwwdg  pointer to a WWDG_HandleTypeDef structure that contains*                the configuration information for the specified WWDG module.* @retval HAL status*/
HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)

2. 喂狗函数:

/*** @brief  Refresh the WWDG.* @param  hwwdg  pointer to a WWDG_HandleTypeDef structure that contains*                the configuration information for the specified WWDG module.* @retval HAL status*/
HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)

3. 看门狗中断服务函数:

/*** @brief  Handle WWDG interrupt request.* @note   The Early Wakeup Interrupt (EWI) can be used if specific safety operations*         or data logging must be performed before the actual reset is generated.*         The EWI interrupt is enabled by calling HAL_WWDG_Init function with*         EWIMode set to WWDG_EWI_ENABLE.*         When the downcounter reaches the value 0x40, and EWI interrupt is*         generated and the corresponding Interrupt Service Routine (ISR) can*         be used to trigger specific actions (such as communications or data*         logging), before resetting the device.* @param  hwwdg  pointer to a WWDG_HandleTypeDef structure that contains*                the configuration information for the specified WWDG module.* @retval None*/
void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)

4. 早期唤醒回调函数:

/*** @brief  WWDG Early Wakeup callback.* @param  hwwdg  pointer to a WWDG_HandleTypeDef structure that contains*                the configuration information for the specified WWDG module.* @retval None*/
__weak void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{/* Prevent unused argument(s) compilation warning */UNUSED(hwwdg);/* NOTE: This function should not be modified, when the callback is needed,the HAL_WWDG_EarlyWakeupCallback could be implemented in the user file*/
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask项目搭建及部署(完整版!全网最全)

flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、创建flask项目&#xff1a; 创建完成后整个项目结构树&#xff1a; app.py: 项⽬管理⽂件&#xff0c;通过它管理项⽬。 static: 存放静态文…

map和set的原理、优劣势、应用场景和示例代码,统统告诉你。

map和set的原理都是基于哈希表实现的&#xff0c;通过哈希值来快速查找和插入元素&#xff0c;从而实现高效的数据存储和管理&#xff0c;那么他们之间有什么不同呢&#xff0c;该如何选择&#xff0c;本文带你了解。 一、map和set的原理 map和set都是数据结构&#xff0c;用…

【分布式系统三】监控平台Zabbix对接grafana(截图详细版)

目录 一.安装grafana并启动 二.浏览器访问 三.导入zabbix数据&#xff0c;对接grafana 四.如何导入模版 以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署&#xff08;命令截图版&#xff09;-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 …

白骑士的C语言教学高级篇 3.2 高级数据结构

系列目录 上一篇&#xff1a;白骑士的C语言教学高级篇 3.1 高级指针技术 在计算机科学中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;不同的数据结构适用于不同的问题和算法。本节将介绍链表、栈与队列以及树与图&#xff0c;这些高级数据结构在实际编程中非常常用…

java ReadWriteLock接口

在 Java 中&#xff0c;ReadWriteLock 接口的实现类ReentrantReadWriteLock 类提供了一种允许多个线程同时读取某一资源但只允许一个线程写的锁定机制。这种机制可以提高并发性能&#xff0c;特别是在读操作远多于写操作的场景下。 特性&#xff1a; 可重入&#xff1b;不存…

使用Redis实现缓存穿透的解决方案

使用Redis实现缓存穿透的解决方案 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在缓存系统中&#xff0c;缓存穿透是指访问不存在的数据&#xff0c;导致请求直接穿透缓存层&#xff0c;直接访问…

前端使用Threejs加载机械臂并控制机械臂跳舞

1. 前言 在我的第一篇博客中,大致讲解了如何使用threejs导入机械臂模型,以及如何让机械臂模型动起来的案例,可以看一下之前的博客前端使用Threejs控制机械臂模型运动 本篇博客主要讲解的是在原来的基础上添加GSAP动画库的应用,可以通过动画,来让机械臂进行指定轨迹位姿的运动…

基于SpringBoot的休闲娱乐代理售票系统

本系统主要包括管理员和用户两个角色组成&#xff1b;主要包括&#xff1a;首页、个人中心、用户管理、折扣票管理、分类管理、订单信息管理、退票信息管理、出票信息管理、系统管理等功能的管理系统。 &#x1f495;&#x1f495;作者&#xff1a;Weirdo &#x1f495;&#x…

释放计算潜力:SKlearn模型并行训练指南

释放计算潜力&#xff1a;SKlearn模型并行训练指南 在机器学习任务中&#xff0c;训练模型往往需要大量的计算资源和时间&#xff0c;特别是当处理大规模数据集时。Scikit-learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中一个广泛使用的机器学习库&#xf…

Python酷库之旅-第三方库Pandas(009)

目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …

GTP/GTX 手动对齐,谈谈思路。

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【server】springboot 整合 redis

1、redis 使用模式 1.1 单机模式 1.1.1 编译安装方式 1.1.1.1 下载 Redis的安装非常简单&#xff0c;到Redis的官网&#xff08;Downloads - Redis&#xff09;&#xff0c;下载对应的版本&#xff0c;简单几个命令安装即可。 1.1.1.2 编译安装 tar xzf redis-stable.tar.…

GPU发展史(二):改变游戏规则的3Dfx Voodoo

小伙伴们&#xff0c;大家好呀&#xff0c;我是老猫。 在上一篇GPU发展史&#xff08;一&#xff09;文章中&#xff0c;我们介绍了1976-1995期间早期显卡的发展故事&#xff0c;今天我们将介绍在1995-1999年这段时间显卡的故事&#xff0c;而这段故事的主角就是——3Dfx 提起…

探索多模态预训练:MAnTiS、ActionCLIP、CPT与CoOp的Prompt技巧

上一篇博文整理了 预训练新范式&#xff08;Prompt-tuning&#xff0c;Prefix-tuning&#xff0c;P-tuning&#xff09; &#xff0c;主要是围绕NLP上的成果&#xff0c;具体的概念本文也不做过多赘述。本篇文章将主要整理几篇有代表性的Prompt方法在多模态领域中的应用。 Mult…

【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进…

RabbitMQ(集群相关部署)

RabbitMQ 集群部署 环境准备&#xff1a;阿里云centos8 服务器&#xff0c;3台服务器&#xff0c;分别进行安装&#xff1b; 下载Erlang Erlang和RabbitMQ版本对照&#xff1a;https://www.rabbitmq.com/which-erlang.html 创建yum库配置文件 vim /etc/yum.repos.d/rabbi…

序列化和反序列化以及重写SerialVersionUID属性

序列化和反序列化是编程中常见的概念&#xff0c;特别是在数据存储、通信和对象持久化等场景下。 序列化 序列化是将对象转换为字节流的过程&#xff0c;以便于存储或传输。在Java中&#xff0c;序列化通常涉及将对象转换为字节序列&#xff0c;可以存储到文件中或通过网络发送…

【环境搭建】MAC M3-MAX芯片安装scikit-learn库报错。

问题 首先想安装scikit-learn库在mac终端显示顺利安装完成&#xff0c;但是测试的时候报错如下所示&#xff1a; /opt/anaconda3/envs/dtc/bin/python /Users/chenfaquan/PycharmProjects/TimeSeries/data_create.py Traceback (most recent call last):File "/Users/c…

10、Redis-位图(Bitmap)与计数位图(Counting Bitmap)以及布隆过滤器

1. 引言 位图&#xff08;Bitmap&#xff09;是一种高效的二进制数据结构&#xff0c;用于表示和操作大规模的集合数据。通过使用位数组&#xff08;bit array&#xff09;&#xff0c;位图能够在非常小的内存空间内快速进行查找和存储操作。本文将详细介绍位图的基本概念、工…

详细分析Sql中SELECT TOP的基本知识

目录 前言1. 基本知识2. 彩蛋 前言 在Sql server中查询比较消费占用空间&#xff0c;对此需要从子句中从结果集中选择前面的若干行 在不同的数据库系统中&#xff0c;这个功能的实现方式略有不同 1. 基本知识 Microsoft SQL Server 使用 TOP 关键字来限制返回的行数 SELEC…