stm32f10系列的独立看门狗与窗口看门狗

news2024/11/15 14:09:01

      在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造 成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会 造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测 的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗” (watchdog) 。 

        先说一下这篇文章的思路,这表篇文章将分为3个部分来写。第一部分写基于手册和stm32cube介绍独立看门狗的使用,然后书写代码,通过硬件实现喂狗;第二部分写基于手册和stm32cube介绍窗口狗的使用,然后书写代码,通过软件实现喂狗;第三部分是两个狗的比较。

独立看门狗

一、简介以及本质

 1.简介

      独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效,IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作。

       这个介绍啥意思?还是不懂,没关系,我用两张图给你讲讲啥意思。

 我们知道单片机的许多外设工作时都需要内部时钟的参与,否则就没法精准工作。下图中我把内部的高速与低速时钟都关掉了,我们来看看会是什么情况。

       

  发现了吗?在内部时钟都关闭的情况下,外部LS RC时钟还是可以提供40HKz的时钟让独立看门狗使用,怎么样,够独立吧,他就是一点不依靠内部时钟,有专属的外部时钟,所以这个名字有“独立”两个字当之无愧吧。

2.本质

        本质是一个 12 位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即 IWDG_RESET 。如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。

        通俗来说就是你要在独立看门狗倒计时结束之前人为通过外部的触发给它的计数器刷新到原来的最大值,这样你的程序还可以继续执行。如果你不进行干涉,等到它自己倒计时结束,这时候,它也会自己复位,给自己的计数器刷新到原来的最大值,但是你的程序就要从头开始执行了。就行你看的那些循环的电影,主人公明明今天没了,但是第二天又活了,接着又是同样的场景,周而复始。这里规定时间内你不喂狗,一到规定的时间,狗就把单片机“咬死了”(也就是重启单片机)。然后接着就是单片机“死后重生”。只要你在规定的时间不喂狗,单片机就也会陷入“被咬死在重生“的循环之中。

二、关注的相关寄存器

1.预分频寄存器(IWDG_PR)

        我不直到大家觉得.预分频是干啥用的,直白的说,预分频就是就是用来减小记一个数的频率。你想一下如果我们不分频,原来计数一次的频率是40Hz,现在预分频因子=4,那么计数一次的频率就是40/4=10Hz。频率越大,计一个数时间越短;频率越小,计一个数时间越长。我们的预分频因子由IWDG_PR的最后三位决定,共有八种情况。

2.重装载寄存器(IWDG_RLR)

      这里的重装寄存器相比于定时器那里的重装寄存器,功能比较简单,直白的说就是你要设置一个计数的上限值,这个上限制不超过12位的RL[11:0]即4096就可以了,手册上告诉我们计数的下限是0。当我们配置好之后,每发生复位时,重装载寄存器里的值都会变成我们设的最大值。

3.键寄存器(IWDG_KR)

我们这里使用的是独立看门狗,并不是硬件看门狗。这里有关写入的寄存器操作不必太在意,我们配置stm32cube和HAL库函数的时候其实就用到了。

4.溢出时间计算公式

这里的溢出时间和定时器的算法是一样的,都是用“计一个数的时间*计得个数”,最后就得出了总时间,也就是溢出时间。

三、stm32cube的配置如下图

SYS

RCC

IWDG

四、代码部分

       我们要开启独立看门狗,溢出时间为1秒,使用按键2进行喂狗。

     

#include "main.h"
#include "iwdg.h"
#include "usart.h"
#include "gpio.h"
#include "string.h"
void SystemClock_Config(void);
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_IWDG_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
HAL_UART_Transmit(&huart1, "记得喂狗\r\n", strlen("记得喂狗\r\n"), 100);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
    HAL_IWDG_Refresh(&hiwdg);//喂狗函数,将重装载寄存器变为设置的625
    HAL_Delay(50);
  }
  /* USER CODE END 3 */
}

烧录进单片机,打开串口助手,接可以看到每隔一秒发送"记得喂狗",当我在在一秒之内喂狗或者一直喂狗(一直按着KEY2),就不会重启跳出循环,而是一直调用喂狗函数,将重装载寄存器变为设置的625。

窗口看门狗

一、简介以及本质

1.手册上的简介

       窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运 行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在 一个有限的时间窗口中被刷新。很明显,看的很懵比,没关系继续往下看,接着分析

2.本质

是一个能产生系统复位信号和提前唤醒中断的6位计数器。

产生复位条件: 当递减计数器值从 0x40 减到 0x3F 时复位(即T6位跳变到0(程序重头再来))

计数器的值大于 W[6:0] 值时喂狗会复位(程序重头再来)。

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

在窗口期内重装载计数器的值,防止复位(程序不会重头再来),也就是所谓的喂狗。

看看图再看看文字理解一下

不出意外的话,对上面的说法,结合图片你已经差不多理解了,也明白为啥这条狗的名字里含有“窗口”二字,但是我估计你对图片上的纵轴计数值比较懵逼,没关系,继续往下看。

二、关注的相关寄存器

1.控制寄存器(WWDG_CR)

我们可以看到第七位是控制窗口开门狗开启的,这个我们在stm32cube中可以配置,接着是0到6位,也就是7个位。手册里说的啥意思呢?意思就是说计数器的计数上限最大是2^7也就是127,因为0~6一共7位;计数器的计数下限固定是0x3F,因为一但到了0x3F就会发生复位,将计数器的值再次变为最大值。

说白了,就是说控制寄存器决定了窗口开门狗是否开启以及图片中纵轴计数值的最大值

2.配置寄存器(WWDG_CFR)

这里一共10位可配置,第9位通过stm32cube配置,第八位与第七位是用来配置预分频的,第0~6位是来设置一个值当计数器的值与其相等时,作为窗口与非窗口的分界点,并且这个值要小于等于计数器最大值大于0x3F。

好了,介绍完这些,我们在回到刚刚说的让你很懵逼的计数值纵轴上,我新建一个二维坐标系给你看,你就理解了。

T[6:0]的值作为计数器最大值,W[6:0]的值作为分窗判断值。下现在没有那么懵逼了吧。

3.超时时间计算

Tout是WWDG超时时间(没喂狗)

Fwwdg是WWDG的时钟源频率(最大36M)

4096是WWDG固定的预分频系数 2^WDGTB是WWDG_CFR寄存器设置的预分频系数值

T[5:0]是WWDG计数器低6位,最多63

三、stm32cube的配置如下图

开启窗口看门狗,计数器值设置为 0X7F ,窗口值设置为 0X5F ,预分频系数为 8 。程序启动时点 亮 LED1 ,300ms 后熄灭,随后每隔三秒翻转LED1状态。。在提前唤醒中断服务函数进行喂狗,同时翻转LED2状态。

SYS

RCC

WWDG

GPIO(B89和B9都默认配置为高电平)

四、代码部分

#include "main.h"
#include "wwdg.h"
#include "gpio.h"
void SystemClock_Config(void);
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
	 HAL_WWDG_Refresh(hwwdg);//计数值等于0x40进入中断,然后喂狗,防止复位
	 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);

}
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
  HAL_Delay(300);
  MX_WWDG_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
    HAL_Delay(3000);

  }
  /* USER CODE END 3 */
}

独立看门狗与窗口看门狗的比较

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

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

相关文章

[Note] 汉明码与汉明距离的思考

Hamming distance 定义 汉明距离,定义是两个码字之间的不同的位的数量,例如4’b0000和4’b0011的汉明距离为2,4’b0000和4’b1110的汉明距离为3。 一种编码方式的(最小)汉明距离,它的定义就是,…

与创新者同行,Doris Summit Asia 2023 线下技术峰会圆满落幕!

10 月 21 日,由飞轮科技主办、阿里云与腾讯云联合主办的 Apache Doris 社区首届线下技术峰会 Doris Summit Asia 2023 在一片热潮中落下帷幕。 本届峰会以「与创新者同行」为主题,设置主论坛和智慧金融与政企、先进智造与电信、企业服务与新经济、互联网…

做地推共享wifi贴的如今都怎么样了?

近年来,随着移动互联网的普及和发展,无线网络已经成为人们日常生活中不可或缺的一部分。然而,很多公共场所的WiFi网络并不方便使用,需要输入密码或者注册账号,给用户带来了不便。为了解决这个问题,一种名为…

元对象系统功能

元对象系统功能 建立工程 布局页面 布局页面 修改原件名称 建立元对象 函数作为接口 增加一些固定的属性 #------------------------------------------------- # # Project created by QtCreator 2023-10-24T21:54:44 # #----------------------------…

LLM在text2sql上的应用 | 京东云技术团队

一、前言: 目前,大模型的一个热门应用方向text2sql它可以帮助用户快速生成想要查询的SQL语句。那对于用户来说,大部分简单的sql都是正确的,但对于一些复杂逻辑来说,需要用户在产出SQL的基础上进行简单修改&#xff0c…

金字塔切分注意力模块PSA学习笔记 (附代码)

已有研究表明:将注意力模块嵌入到现有CNN中可以带来显著的性能提升。比如,SENet、BAM、CBAM、ECANet、GCNet、FcaNet等注意力机制均带来了可观的性能提升。但是,目前仍然存在两个具有挑战性的问题需要解决。一是如何有效地获取和利用不同尺度…

主流电商平台价格如何高频监测

双十一来临在即,除了商家很兴奋,品牌和消费者同样持续关注,除了关注不同平台的产品上架情况,价格也是这些渠道参与者最为关注的,品牌需要通过掌握各店铺的价格情况,了解市场情况以及各经销商的渠道治理现状…

从零搭建一个PWA应用需要了解哪些知识

在国内由于小程序的风生水起,PWA 应用在国内的状况一直都不是很好,PWA 和小程序有很多的相似性,但是 PWA 是由谷歌发起的技术,小程序是微信发起的技术,所以小程序在国内得到了大力的扶持,很快就在国内技术界…

docker制作java项目镜像

docker制作java项目镜像 环境步骤Dockerfile 运行容器 环境 当前使用win10安装的docker win10安装Docker参考文章 步骤 将Dockerfile文件和jar包放在同一个目录下 编写Dockerfile文件 Dockerfile #设置镜像基础: jdk8-jre , 比jdk内存小 FROM java:8-jre #维护人员信息 MA…

众和策略可靠吗?dde大单净量可信吗?

可靠 DDE大单净量是指股票成交中的单笔生意量较大且净买入或净卖出的数量。这个方针在股票商场中被广泛运用,尤其是在技术剖析中。但是,有时候人们会怀疑DDE大单净量的可信度,下面我们从几个角度进行剖析。 首要,有些人以为DDE大…

持续性输出,继续推荐5款好用的软件

​ 分享是一种神奇的东西,它使快乐增大,它使悲伤减小,坚持分享一些好用的软件给大家,今天继续为大家带来五款好用的小软件。 1.文件解锁工具——Unlocker ​ Unlocker是一款解决Windows文件被占用无法删除或重命名的问题的小工具…

mysql数据库迁移达梦

迁移前准备: 授权给要迁移的数据库的用户,例如此时是 mysql迁移到达梦里面,所以得把你连接这个mysql数据库的这个用户root授权, CREATE USER root IDENTIFIED BY1123456;GRANT ALL privileges ON *.* TO rootroot WITH GRANT OPTI…

微信小程序菜单导航选中自动居中

菜单导航选中自动居中 示例库 代码片段

Qt之自定义事件QEvent

在Qt中,自定义事件的步骤大概如下: 1.创建自定义事件,自定义事件需要继承QEvent 2.使用QEvent::registerEventType()注册自定义事件类型,事件的类型需要在 QEvent::User 和 QEvent::MaxUser 范围之间,在QEvent::User之前是预留给系统的事件 3.使用sendEvent() 和 postEv…

迅为RK3399开发板Android 系统--打印级别设置(printk日志等级设置)

在内核源码 include/linux/kern_levels.h 文件中预定义了内核 log 等级,一共有八个等级,从 0 到 7,优先级依次降低,如下所示: // include/linux/kern_levels.h #define KERN_SOH "\001" /* ASCII Start Of…

Khronos: 面向万亿规模时间线的性能监控引擎建设实践

作者:余文清 阿里巴巴智能引擎事业部自研的 Khronos 系统是阿里内部接入规模最大的性能数据存储引擎。Khronos 支持动态生命周期的存储计算分离架构,采用 schemaless 的 data model 设计,在万亿数据规模下为业务提供易用、高效、经济的服务&a…

自媒体创业秘籍:视频号视频下载助你打造热门账号

​自媒体创业者们都知道,视频号已经成为拓展影响力和吸引更多用户的热门平台之一。然而,要想在这个竞争激烈的市场中脱颖而出,并打造一个热门账号,你需要掌握一些技巧和秘籍。在本文中,我将分享关于视频号视频下载的方…

ModelSim【紫光】

这软件是查看波形的。 如果ModelSim频繁弹窗,关闭电脑杀毒软件和电脑管家。 尤其是荣耀管家

Python学习8

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…