STM32CubeIDE开发(十三), stm32窗口看门狗WWDG的CubeMX配置及HAL库底层实现分析

本文主要是介绍STM32CubeIDE开发(十三), stm32窗口看门狗WWDG的CubeMX配置及HAL库底层实现分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、stm32的WWDG说明

       1.1  WWDG特点:

        1.2 WWDG的cubeMX配置及说明

        1.3 WWDG喂狗时间计算

二、WWDG工程创建及源码分析

       2.1 cubeMX界面配置WWDG

         2.2 WWDG超时时间实例计算

       2.3 工程高级配置

三、WWDG源码分析及应用

        3.1 WWDG的HLA库源码分析

         3.2 延时函数设计

        3.3 WWDG使用程序设计

四、编译及测试

        4.1 编译

         4.2 测试


一、stm32的WWDG说明

       1.1  WWDG特点:

        在前一篇博文介绍独立看门狗时就指出STM32 MCU提供两个看门狗,独立看门狗和窗口看门狗。

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

        相比独立看门狗,窗口看门狗WWDG有以下特点:

        【1】WWDG计数器依赖于系统时钟,准确来说依赖于系统时钟通过分频、倍频得到的PCLK1时钟,即APB1 peripheral clocks输出频率。

        【2】WWDG支持中断功能以及早期唤醒中断。

        1.2 WWDG的cubeMX配置及说明

        现在看一下WWDG在CubeMX中的设置问题,WWDG和IWDG一样,在系统内核栏目开启,开启激活选项后,可以设置5项参数,分别是计数时钟分频值,窗口值、递减计数预设值、早期唤醒中断使能以及中断功能。

        【1】 一旦WWDG启用,将生成系统重置功能并启动其递减计数器,喂狗时,必须在设定的上限时间和下限时间之间喂狗,如果喂狗时间高于上限时间或者低于下限时间,都会导致看门狗触发重启机制。其中下限时间是系统固定的0X40。上限时间(窗口值)是用户可以定义的,大于0X40同时小于0X7F即可。

        【2】程序在达到0x3F值之前刷新计数器(计数器的低六位值,最大值111111=0X3F),到期时触发系统重置(即,当计数器值从0x40向下滚动到0x3F时生成重置,即再次减一时,0x40=0X3F+0X01)。并在计数器达到刷新窗口值之前刷新了计数器值,也会生成MCU重置。这就要求必须在有限的窗口中刷新计数器。另外WWDG启用后,除非通过系统重置,否则无法禁用WWDG。

        【3】如果启用了早期唤醒中断(Early Wakeup Interrupt,EWI)功能,在WWDG到期之前发出警告(即计数器达到0x40时会产生中断)。使用早期唤醒中断(EWI),在生成MCU重置之前可执行特定的安全操作或数据记录。此机制要求在NVIC中启用WWDG中断设置。同样,EWI启用后,EWI中断不能被禁用,除非通过系统重置。中断状态感知可在RCC_CSR寄存器中的WWDGRST标志判断何时发生WWDG重置。

        1.3 WWDG喂狗时间计算

        WWDG计数器输入时钟由PCLK1频率(APB1 peripheral clocks输出频率)除以计数时钟分频值得出。

         WWDG时钟(Hz)=PCLK1/(4096*预分频器);

        WWDG周期(mS)=1000/WWDG时钟(Hz);

        WWDG超时MinT(mS)=WWDG周期(mS)*(计数器-窗口),因此最好设置递减计数值≥窗口值。

        WWDG超时MaxT(mS)=WWDG周期(mS)*(计数器-0x40),0x40=0X3F+0X01;

        WWDG喂狗时间MinT(mS)<t<MaxT(mS)。

二、WWDG工程创建及源码分析

       2.1 cubeMX界面配置WWDG

         本博文基于前面独立看门狗的工程直接增加窗口看门狗功能,并关闭独立看门狗。

        双击.ioc文件打开cubeMX界面,开启WWDG,设置其参数如下,其中分频值2,窗口值0X64(100),递减计数预设值0X64(100),开启早期唤醒中断:

         开启WWDG中断功能

         APB1时钟输出频率设置10MHz(10 000 000Hz),设置该值小一些,主要是本博文采用按键触发切换喂狗时间间隔,而按键捕获到松开是人为操作,反应较慢,实时性不好体现。

         2.2 WWDG超时时间实例计算

        在WWDG的喂狗时间按前面计算公式,喂狗时间范围:

        WWDG周期(mS)=1000ms/10MHz/(4096*8)=3.2768ms。

        WWDG喂狗时间是在WWDG启动后的t时间内:

        t>3.2768ms*(0X64-0X64)=0ms;

        t<3.2768ms*(0X64-0X40)=117.9648ms。

       2.3 工程高级配置

         在工程高级配置中,取消WWDG的自动初始化,本博文将自己添加初始化,主要是HLA的WWDG初始化启动就立即进入计数,会给第一次喂狗造成时间差异较大。

        生成代码输出。

三、WWDG源码分析及应用

        3.1 WWDG的HLA库源码分析

        WWDG会在Core源码目录下的Inc及Src目录,分别生成wwdg.h和wwdg.c驱动文件。在wwdg.c文件中,主要定义了MX_WWDG_Init函数和HAL_WWDG_MspInit函数。MX_WWDG_Init主要做两件事情,一是将CubeMX上配置的参数传递给WWDG缓存Init和生成WWDG句柄Instance,二是调用HLA库的HAL_WWDG_Init来实现真正的初始化设定。HAL_WWDG_MspInit是HLA内的弱函数,根据实际配置CubeMX会生成新的函数覆盖原来的弱函数,而在HAL_WWDG_Init函数中会调用到HAL_WWDG_MspInit函数。

         在stm32l4xx_hal_wwdt.c源文件中定义了HAL_WWDG_Init函数,它做以下事情:诊断配置参数是否合规(如果不是采用CubeMX配置,而是自己手动配置或调整过参数的,这里可能异常);调用HAL_WWDG_MspInit函数完成WWDG时钟以及中断初始化;最后将依据参数写入WWDG寄存器。

         程序在依据参数将WWDG计数器值写入WWDG寄存器CR,将窗口值和时钟分频值写入WWDG寄存器CFR内。

         再回到wwdg.c内,HAL_WWDG_MspInit函数实现了WWDG时钟启动设置和中断初始及启动设置。

         HAL_NVIC_EnableIRQ启动后,如果有WWDG中断事件时,当中断服务例程触发HAL_WWDG_IRQHandler时,将自动清除标志,并执行HAL_WWDG_WakeupCallback用户回调函数报警。该回调函数在stm32l4xx_hal_wwdt.c定义,是个弱函数,用户可以通过自定义回调AL_WWDG_WakeupCallback来添加自己的代码。例如本文将在wwdg.c文件内重新定义该函数:

/* USER CODE BEGIN 1 */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{printf("I know, but do nothing!\r\n");
}
/* USER CODE END 1 */

         3.2 延时函数设计

        在ICore目录下添加delay目录,并在该目录下创建delay.h和delay.c源文件,实现自定义延时函数,主要满足本博文更高精度的延时要求。

        delay.h,声明微妙、毫秒、秒的延时函数。

#ifndef DELAY_DELAY_H_
#define DELAY_DELAY_H_#include "stm32l4xx_hal.h" //HAL库文件声明void delay_us(uint32_t us);	//延时微妙
void delay_ms(uint32_t ms);	//延时毫秒
void delay_s(uint32_t s);	//延时秒#endif /* DELAY_DELAY_H_ */

        delay.c,

#include "delay.h"#define MFP_VAL 8000000    //80MHzvoid delay_us(uint32_t us) //利用CPU循环实现的非精准应用的微秒延时函数
{uint32_t delay = (HAL_RCC_GetHCLKFreq() /  MFP_VAL* us); //使用HAL_RCC_GetHCLKFreq()函数获取主频值,经算法得到1微秒的循环次数while (delay--); //循环delay次,达到1微秒延时
}void delay_ms(uint32_t ms){ //mS毫秒级延时程序while( ms-- != 0){delay_us(1000);	//调用1000微秒的延时}
}void delay_s(uint32_t s){ //S秒级延时程序while( s-- != 0){delay_ms(1000);	//调用1000毫秒的延时}
}

        3.3 WWDG使用程序设计

        在本博文中,我们设计通过按键切换喂狗时间间隔,来测试喂狗窗口及时间间隔效果。

        在main.c源文件中,添加驱动头文件,注意由于在CubeMX取消了自动初始化WWDG,因此需要手动添加wwdg.h头文件:

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

        在main主函数前,声明WWDG句柄,用于喂狗函数是调用

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
extern WWDG_HandleTypeDef hwwdg;
/* USER CODE END 0 */

        在main主函数内,设置各外设功能及手动初始化WWDG驱动。

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

        在main函数主循环体内,进行喂狗测试,默认是10微妙喂狗一次,按键0停止喂狗,按键1间隔10毫秒喂狗,按键2间隔1秒喂狗。注意前面计算得知0<t<117.9648ms内喂狗有效。按键1间隔10毫秒喂狗主要考虑到按键按下及松开时间效应问题,因此不能设置太大,否则可能因为按键动作耽搁时间太久无效。在实际项目中,我们通常会采用独立线程持续喂狗,各种异常触发打断喂狗来设计。

 /* Infinite loop *//* USER CODE BEGIN WHILE */while (1){if(1==wdt_flag){HAL_WWDG_Refresh(&hwwdg);delay_us(10);//等待}if(2==wdt_flag){HAL_WWDG_Refresh(&hwwdg);delay_ms(10);//等待}if(3==wdt_flag){HAL_WWDG_Refresh(&hwwdg);delay_s(1);//等待}if(printf_flag){printf("current wdt_flag=%u!\r\n",wdt_flag);printf_flag = 0;}if(KEY_0()){wdt_flag = 0;printf("WWDG_Refresh stop!\r\n");delay_us(1);//等待printf_flag =1;}if(KEY_1()){wdt_flag = 2;printf("WWDG_Refresh before WIN Time!\r\n");delay_us(1);//等待printf_flag =1;}if(KEY_2()){wdt_flag = 3;printf("WWDG_Refresh after 0X40 Time!\r\n");delay_us(1);//等待printf_flag =1;}/* USER CODE END WHILE */

四、编译及测试

        4.1 编译

         4.2 测试

        打开串口助手,连接上开发板,按键0、1、2观察效果:

这篇关于STM32CubeIDE开发(十三), stm32窗口看门狗WWDG的CubeMX配置及HAL库底层实现分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335270

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设