cubeIDE开发, stm32独立看门狗IWDT的CubeMX配置及HAL库底层实现分析

news2024/11/14 23:35:44

一、STM32 的IWDT简介

        2.1 看门狗原理

        看门狗本质上就是一种计数器,和我们现实生活中一炷香现象、沙漏现象等是同理的,计数器一般有两种做法,一种是递增,超过固定阀值报警;一种是递减,通常值降到0时报警。后面一种比较贴切生活场景,因此较常用,STM32的独立看门狗(Independent Watchdog,IWDT)就是采用后面这一种做法。

        如下图所示,假设我们设定一个初始值RL,设定一个计数变量V在开始时等于RL,然后每经过一个时钟周期就减1,如果减到为0值时,触发报警。如果在V值降为0前,重新设定一下V值等于RL,然后V值又重新计算,从而又争取到一段时间,定期去反复设定V值(喂狗),保持V值不降为0,就能一直保持正常态势。

         STM32中的看门狗有两种,一个是独立看门狗(Independent Watchdog,IWDT),就是本博文要分析学习的,另一种是窗口看门狗wwdg(window Watchdog,WWDT)。

        1.2 STM32独立看门狗时钟计算

        Iwdg由独立时钟(内部低速时钟LSI)计时,所以不受系统硬件影响的系统故障探测器。主要用于监视硬件错误。而wwdg由系统时钟计时,如果系统时钟不走了,它也就失去作用了,主要用于监视软件错误。

        前面提到看门狗的计数是每经过一个时钟周期减1,那么时钟周期CT是如何获得计算呢。STM32内,IWDT依赖于内部低速时钟LSI,采用该时钟的频率来计时。频率是单位时间内完成周期性变化的次数,是描述周期运动频繁程度的量,常用符号f或ν表示,单位为秒分之一。为了纪念德国物理学家赫兹的贡献,人们把频率的单位命名为赫兹,简称“赫”,符号为Hz。

        而时钟周期CT和频率成反比,即f=1/CT(其中f为频率,CT为时钟周期)。

        在STM32CubeMX上,我们开启IWDT后,用户可以设置的数值依次是计数时钟分频值,窗口值及重装载值,其中计数时钟分频值取值是固定的枚举值2^{n}(2<n<8),即4、8、16、32、64、128、256,而窗口值及重装载值的设置范围12bit的数据,即0X000~0XFFF,如下图所示:

         而IWDT的最终输出时钟频率是直接依赖于LSI,MCU芯片的内部低速时钟是多少,它就是多少。

        那么,看门狗时钟频率=LSI(内部低速时钟)的频率F/计数时钟分频值P;

         如上述两图设置的数值,RL=4095,F=32KHz,P=32,那么时钟周期:

        ct = 1s/f32KHz/32=1000ms/32000HZ/32=1ms,也就大概一个时钟周期是1毫秒,喂狗要求在4095*1ms以内。

        1.3 STM32的IWDT使用注意

        需要注意的是,看门狗的时钟计算不是精确的,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。另外应该还注意到窗口值的存在,通常窗口值和重装载值一致的,如果Window参数(WV)与Window寄存器值相同,只需重新加载计数器值即可退出,具有精确时基函数。否则修改窗口寄存器。这将自动重新加载看门狗计数器:

        窗口计数值WV决定什么时候喂狗。狗喂早了,复位就“早”,即在重装载值(V)>窗口值(WV),也就是计数器值还没有减到窗口值以下,当 0x40 < 计数器值(V) < 窗口值(WV) 时,这时候最适合喂狗了,也只有在这时候喂狗才合适;计数器值(V) 从0x40变到0x3F的时候,将产生看门狗复位(准备复位);在要产生复位的前一段时间,如果开启了提前唤醒中断,那么就会进入中断,在中断函数里,我们需要及时喂狗,否则会产生复位。

        另外IWDG可以通过软件或硬件启动(可通过选项字节配置),由于是低速内部时钟(LSI)计时,因此即使主时钟发生故障,IWDG仍保持活动状态。并IWDG是在VDD电压域中实现,在STOP(停止)和STANDBY(待机)模式下仍可正常工作(IWDG重置可将CPU从STANDBY唤醒)。RCC控制状态寄存器中的IWDGRST标志可用于通知何时发生IWDG重置。

二、IWDT工程创建

        2.1 创建工程及配置IWDT

        本文采用的是STM32L496VGT6-ali开发板,是基于前面工程的.ioc在CubeIDE开发平台创建了新工程,并移植了前面工程已经实现的按键、LED灯及lpuart1串口调试功能,可参考前面博文:

        假设已经完成了按键、LED灯及lpuart1串口调试功能后,双击.ioc文件打开cubeMX界面,配置IWDT,如下图所示,开启IWDT并设置参数32、4095,另外IWDT时钟频率是32KHz。

         配置很简单,完成配置后,单击保存或生成代码按钮,输出生成代码。

        2.2 IWDT的HAL实现源码分析

        cubeMX会为IWDT在Core/Inc和Core/Src生成独立看门狗的头文件及源文件,实现源码也很简单,定义独立看门狗句柄(IWDT寄存器)及初始化函数MX_IWDG_Init。

         在MX_IWDG_Init函数中,只做了两件事,将在cubeMX上配置的参数传递给IWDT参数缓存区及实例化IWDT寄存器,调用HLA看门狗初始化函数(HAL_IWDG_Init)实现真正的初始化。

        在stm32L4xx_HLA_iwdg.c驱动文件中,HAL_IWDG_Init函数内,首先对cubeMX上配置参数的合理性诊断,然后开启IWDG和使能写入访问,将已经缓存的配置参数写入IWDG寄存器,并检查设置是否合理,在HAL_IWDG_DEFAULT_TIMEOUT内完成寄存器更新,最后设置计数器值V等于重装载值RL,开启真正计数。

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)
{
  uint32_t tickstart;

  /* Check the IWDG handle allocation */
  if (hiwdg == NULL)
  {
    return HAL_ERROR;
  }

  /* Check the parameters */
  assert_param(IS_IWDG_ALL_INSTANCE(hiwdg->Instance));
  assert_param(IS_IWDG_PRESCALER(hiwdg->Init.Prescaler));
  assert_param(IS_IWDG_RELOAD(hiwdg->Init.Reload));
  assert_param(IS_IWDG_WINDOW(hiwdg->Init.Window));

  /* Enable IWDG. LSI is turned on automatically */
  __HAL_IWDG_START(hiwdg);

  /* Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers by writing
  0x5555 in KR */
  IWDG_ENABLE_WRITE_ACCESS(hiwdg);

  /* Write to IWDG registers the Prescaler & Reload values to work with */
  hiwdg->Instance->PR = hiwdg->Init.Prescaler;
  hiwdg->Instance->RLR = hiwdg->Init.Reload;

  /* Check pending flag, if previous update not done, return timeout */
  tickstart = HAL_GetTick();

  /* Wait for register to be updated */
  while ((hiwdg->Instance->SR & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u)
  {
    if ((HAL_GetTick() - tickstart) > HAL_IWDG_DEFAULT_TIMEOUT)
    {
      if ((hiwdg->Instance->SR & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u)
      {
        return HAL_TIMEOUT;
      }
    }
  }

  /* If window parameter is different than current value, modify window
  register */
  if (hiwdg->Instance->WINR != hiwdg->Init.Window)
  {
    /* Write to IWDG WINR the IWDG_Window value to compare with. In any case,
    even if window feature is disabled, Watchdog will be reloaded by writing
    windows register */
    hiwdg->Instance->WINR = hiwdg->Init.Window;
  }
  else
  {
    /* Reload IWDG counter with value defined in the reload register */
    __HAL_IWDG_RELOAD_COUNTER(hiwdg);
  }

  /* Return function status */
  return HAL_OK;
}

        同样,在stm32L4xx_HLA_iwdg.c驱动文件中,HLA库提供了喂狗函数HAL_IWDG_Refresh,需要我们在规定时间内(由在cubeMX上配置的参数和时钟频率来决定),使用中调用该函数喂狗,就可以防止看门狗复位。

/**
  * @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)
{
  /* Reload IWDG counter with value defined in the reload register */
  __HAL_IWDG_RELOAD_COUNTER(hiwdg);

  /* Return function status */
  return HAL_OK;
}

         2.3 IWDG使用

        本文在IWDG使用设计是,通过按键输入触发不再喂狗,这时是否系统复位,通过lpuart1调试信息确认是否成功。

        在main.c文件中,引入按键、LED灯及串口驱动头文件。

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "../../ICore/key/key.h"
#include "../../ICore/led/led.h"
#include "../../ICore/print/print.h"
#include "../../ICore/usart/usart.h"
/* USER CODE END Includes */

        在main.c文件中,extern声明IWDG寄存器句柄。

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
extern IWDG_HandleTypeDef hiwdg;
/* USER CODE END 0 */

         在main主函数中,初始化串口,开启中断接收。

/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_LPUART1_UART_Init();
  MX_IWDG_Init();  
/* USER CODE BEGIN 2 */
  ResetPrintInit(&hlpuart1);
  HAL_UART_Receive_IT(&hlpuart1,(uint8_t *)&HLPUSART_NewData, 1); //再开启接收中断
  HLPUSART_RX_STA = 0;
  //
  uint8_t wdt_flag = 1;    //是否继续喂狗标记
  printf("app restart now!\r\n");
  /* USER CODE END 2 */

        在main主函数中,实现喂狗功能。

  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  if(KEY_2())
  	  {
		  wdt_flag = 0;
		  printf("IWDG_Refresh stop!\r\n");
  	  }
	  if(wdt_flag){
		  HAL_IWDG_Refresh(&hiwdg);
		  HAL_Delay(10);//等待
	  }
    Toggle_led1();
    /* USER CODE END WHILE */

三、编译及测试

        3.1 编译

        编译通过

         下载程序

        3.2 测试

        打开串口工具,连接上串口,观察窗口日志输出情况,按键KEY2测试如下:

         测试成功,不在喂狗时,等待一、两秒系统重启。

 

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

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

相关文章

数据结构训练营5

开启蓝桥杯备战计划&#xff0c;每日练习算法一题&#xff01;&#xff01;坚持下去&#xff0c;想必下一年的蓝桥杯将会有你&#xff01;&#xff01;笔者是在力扣上面进行的刷题&#xff01;&#xff01;由于是第一次刷题&#xff01;找到的题目也不咋样&#xff01;所以&…

Databend in 2022

上一次写总结还是在回顾 Datafuse Labs 成立一周年&#xff0c;转眼来到 22 年末&#xff0c;Databend 也快要开始第三个年头的征程了。 今天就让我们一起回顾一下 Databend 在 2022 年的成果。 开源 Databend 是一款强大的云数仓&#xff0c;专为弹性和高效设计&#xff0c…

Spring Authorization Server 1.0 提供 Oauth 2.1 和 OpenID Connect 1.0 实现

1. 概述 在引入Java 社区两年半之后&#xff0c;VMWare发布了Spring Authorization Server 1.0。Spring 授权服务器项目构建在Spring Security之上&#xff0c;支持创建OpenID Connect 1.0身份提供者和OAuth 2.1授权服务器。该项目取代了不再维护的 Spring Security OAuth项目…

RHCEansible虚拟机初始化配置,ansible配置和安装

1.保证三台主机能互相通信&#xff0c;需要设置同一种网络模式&#xff08;nat&#xff09; 2.配置静态ip地址&#xff08;命令行&#xff0c;图形界面都可以&#xff09; server---192.168.171.100 node1---192.168.171.222 node2---192.168.171.10 3.更改主机名 永久更…

C++代码编程学习(1):简易通讯录的创建

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ CSDN诚邀各位技术er分享关于圣诞节的各种技术创意&#xff0c;展现你与众不同的精彩&#xff01;参与本次投稿即可获得【话题达人】勋章【圣诞快乐】定制勋章&#xff08;1年1次&#xff0c;错过要等下一年喔&#…

消费市场的“跨年”:2023,数字新消费将引领市场何去何从?

配图来自Canva可画 2022&#xff0c;变局如同一个过滤器&#xff0c;每一个身处其中的消费者和消费品牌都在经受考验。我国人口红利在消退&#xff0c;竞争在加剧&#xff0c;需求在变化。光大证券研究所的数据显示&#xff0c;2022年来我国居民收入增速小幅改善&#xff0c;但…

Spring之Bean创建过程

1. 前言 Spring提供了xml、注解、JavaConfig多种方式来配置bean&#xff0c;不论何种方式&#xff0c;Spring最终都会将bean封装成BeanDefinition对象&#xff0c;Spring创建bean的依据也是通过BeanDefinition来完成的。 当我们调用getBean()方法获取bean实例时&#xff0c;不…

jmeter使用教程之登录接口(工作日记)

首先我们打开jmeter 快捷按钮&#xff1a;winr 会弹出快捷运行弹框&#xff0c;我们输入cmd 后点击回车 会弹出一个控制窗口&#xff0c;我们输入jmeter&#xff0c;然后回车 首次进入jmeter&#xff0c;页面显示空白页且默认英文 我们可以切换语言 【Options - Choose Lan…

AI前沿 | 利用训练好的模型库进行一键抠图(实例演示)

来源&#xff1a;投稿 作者&#xff1a;Struggling cyanobacteria 编辑&#xff1a;学姐 深度学习平台飞浆paddle的环境搭建 ① 效率更高的 gpu 版本的安装 通过 python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple来进行安装。 paddle.utils…

Dockerfile了解

目录 1.自定义centos&#xff0c;具备vim及ifconfig作用 2.自定义tomcat8 1.自定义centos&#xff0c;具备vim及ifconfig作用 cd /javaxl/software mkdir mydocker vi mycentosDockerfile 向 mycentosDockerfile 编辑内容 FROM centos:7 MAINTAINER zwc "zwcqq.com"…

解决Windows下使用cmd执行Python文件报错 ModuleNotFoundError: No module named ‘XXXX‘

一、问题产生 我在IDEA中可以正常执行的Python文件&#xff0c;想把它配置成每天固定时间执行的定时任务。我写了一个脚本在每天9点时执行Python文件&#xff0c;但是我在cmd中测试执行时遇到以下报错&#xff1a; Traceback (most recent call last):File "D:\dev\code…

AD5328手册翻译不完全(仅供参考)

最近要用到DAC生成数据波形&#xff0c;但是都是英文不好阅读&#xff0c;于是花费点时间翻译了大致数据内容并记录 一、特性 AD5308:16导联TSSOP中的8个缓冲8位DAC A版本&#xff1a;1 LSB INL&#xff0c;B版本&#xff1a;0.75 LSB INR AD5318:16导联TSSOP中的8个缓冲10…

互联网时代,VR全景营销的意义是什么?

互联网时代&#xff0c;很多事项我们都可以在手机上解决&#xff0c;随着互联网的不断发展&#xff0c;年轻人每天花在手机上的时间也在日益增加&#xff0c;这就将压力给到了线下实体店铺&#xff0c;年轻人不喜欢逛街&#xff0c;线下店铺的获客成本就会越来越高。同时也是由…

无人机测深三种方法-激光雷达,测深仪和探地雷达

最近搜素了论文和相关网页&#xff0c;博主总结了一下无人机测深总共有三种办法&#xff1a; &#xff08;1&#xff09;激光雷达&#xff1b; &#xff08;2&#xff09;测深仪&#xff1b; &#xff08;3&#xff09;探地雷达&#xff08;GPR&#xff09;。 1、激光雷达 …

如何在匿名上位机中显示自定义数据波形

匿名上位机相信很多人都用过&#xff0c;以前在调飞控的时候使用过&#xff0c;可以很直观的显示数据的波形&#xff0c;比如飞机姿态等。 最近在调试foc。很多数据在调试过程中&#xff0c;仅仅使用串口打印出来显示是很不直观的&#xff0c;比如正弦波&#xff0c;经典的马鞍…

Python冷知识-优雅的文档属性

Python是一门学习成本低但是使用场景广泛的语言&#xff0c;0基础2周左右就可以进行简单的脚本编写&#xff0c;但也正是因为这个原因&#xff0c;导致很多小伙伴的Python代码比较粗糙&#xff0c;那么我们来聊聊使用文档属性让Python代码更加的优雅。 设置文档属性 作为一名…

JUC并发编程学习笔记(二)Lock接口及线程间通信

2 Lock 接口 2.1 Synchronized 2.1.1 Synchronized 关键字回顾 synchronized 是 Java 中的关键字&#xff0c;是一种同步锁。它修饰的对象有以下几种&#xff1a; 修饰一个代码块&#xff0c;被修饰的代码块称为同步语句块&#xff0c;其作用的范围是大括号{}括起来的代码&…

软件测试中白盒测试的优缺点是什么?

白盒测试的优缺点白盒测试在计算机领域行业用以检查程序的状态&#xff0c;确定实际运行状态与预期状态是否一致&#xff0c;来看看白盒测试的优点和缺点是什么吧。 白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符…

Android学习进阶——Dagger 2 使用及原理

概述 Dagger 2 是 Google 开源的一款依赖注入框架&#xff0c;它的前身是 square 的 Dagger 1&#xff0c;Dagger 2 在 Android 中有着较为广泛的应用。 Dagger 2 基于 Java 注解&#xff0c;采用 annotationProcessor&#xff08;注解处理器&#xff09; 在项目编译时动态生…

AS-REPRoasting

讲在前面&#xff1a; 最近笔者发布的几篇文章&#xff0c;大家不难发现&#xff0c;都是和kerberos协议相关的。国内外各类的研究员对于该协议的研究愈发的深入&#xff0c;从该协议产生的漏洞就会越来越多甚至越来越严重。当然这只是笔者的一点拙见。 在介绍了Kerberoastin…