当前位置: 首页 > news >正文

嵌入式开发--STM32延时函数重构

在做嵌入式开发的时候,经常需要用到延时函数,STM32为我们提供了一个标准的毫秒级延时函数:HAL_Delay()。这个函数用起来很方便,括号内的数就是延时的毫秒数。

但是程序中如果需要用到看门狗的话呢,这玩意需要经常喂的,否则一旦超时就会复位。

所以很容易想到,在延时函数中增加喂狗的代码,如下:

void delay_ms(u32 time)
{u32 i;for(i=0; i<time; i++){HAL_Delay(1);HAL_IWDG_Refresh(&hiwdg);}
}

这样当然可以运行,但是不完美,比如在程序调试的时候,我们经常需要关闭看门狗,还有就是这样一来延时会很不准确,特别是系统频繁要进中断的话,实际延时会比预期长不少。

我相信很多人都没有看过这个HAL_Delay()函数实现的代码。具体如下:

__weak void HAL_Delay(uint32_t Delay)
{uint32_t tickstart = HAL_GetTick();uint32_t wait = Delay;/* Add a freq to guarantee minimum wait */if (wait < HAL_MAX_DELAY){wait += (uint32_t)(uwTickFreq);}while ((HAL_GetTick() - tickstart) < wait){}
}

最前面的__weak表明它是一个弱函数,也就是说我们可以自己编程来实现它,把喂狗的功能集成到这个函数内,从外部看,仍然用的是HAL_Delay()这个函数名,代码风格可以和HAL库保持一致。

实现也很简单,自己建一个延时函数LL_delay.c,如下:

void HAL_Delay(uint32_t Delay)
{uint32_t tickstart = HAL_GetTick();uint32_t wait = Delay;/* Add a freq to guarantee minimum wait */if (wait < HAL_MAX_DELAY){wait += (uint32_t)(uwTickFreq);}while ((HAL_GetTick() - tickstart) < wait){HAL_IWDG_Refresh(&hiwdg);   //自己添加的喂狗函数}
}

就是在最后的while循环中增加一行喂狗的代码,再相应添加LL_delay.h,如下:

#ifndef _LL_DELAY_H_
#define _LL_DELAY_H_void HAL_Delay(uint32_t Delay);

这样就几乎不用再操心喂狗的事了

相关文章:

嵌入式开发--STM32延时函数重构

在做嵌入式开发的时候&#xff0c;经常需要用到延时函数&#xff0c;STM32为我们提供了一个标准的毫秒级延时函数&#xff1a;HAL_Delay()。这个函数用起来很方便&#xff0c;括号内的数就是延时的毫秒数。 但是程序中如果需要用到看门狗的话呢&#xff0c;这玩意需要经常喂的…...

OpenAI最新发布的o1-preview模型,和GPT-4o到底哪个更强?

近日&#xff0c;OpenAI又出新作&#xff0c;正式推出了名为o1的新模型&#xff0c;这是其“推理”系列的首个成员&#xff0c;自然引起了业界的广泛关注。本文旨在全面剖析o1模型的核心特征、独特优势&#xff0c;并通过与先前版本GPT-4o的细致对比&#xff0c;为读者揭示这一…...

基于Python+SQLite的课程管理系统

系统需求简介 1.1需求分析 实现一个具体的课程管理系统。按照软件工程思路设计简化的专业课数据库&#xff0c;尽量模拟现有专业课程一个学期的选课排课原型实际情况。&#xff08;注&#xff1a;本系统由本人单独设计、开发完成&#xff09; 1.2 数据结构需求分析 课程管理…...

每日一练 | USG系统默认安全区域

01 真题题目 关于USG系统&#xff08;华为的安全网关产品&#xff09;的安全防火墙的默认安全区域的描述&#xff0c;正确的是&#xff1a; A. 默认安全区域可以删除 B. 默认安全区域可以修改安全级别 C. 默认安全区域不能删除&#xff0c;但可以修改安全级别D. 默认安全区域…...

技术老总眼中的品宣与促销:挑战与对策

在许多技术驱动的企业中&#xff0c;技术老总们往往对产品研发和技术创新拥有深刻的理解&#xff0c;然而当涉及市场营销&#xff0c;特别是“品宣”&#xff08;品牌宣传&#xff09;与“促销”时&#xff0c;他们的观念可能相对简单&#xff0c;有时甚至认为这两者没有本质的…...

[全网首篇]关于 VMSA-2024-0019 安全公告(CVE-2024-38812、CVE-2024-38813)的说明与解决方案

漏洞说明&#xff1a; CVE-2024-38812 CVE 描述&#xff1a; vCenter Server 在实现 DCERPC 协议时存在堆溢出漏洞。VMware 已将此问题的严重性评估 为临界严重性范围&#xff0c;CVSSv3 的最高基本分数为 9.8。 已知攻击&#xff1a; 具有 vCenter Server 网络访问权限…...

监控易监测对象及指标之:全面监控GBase数据库

在数字化时代&#xff0c;数据库作为企业核心数据资产的管理中心&#xff0c;其稳定性和性能直接关系到业务的连续性和企业的运营效率。GBase数据库作为高性能的分布式数据库系统&#xff0c;广泛应用于各类业务场景。为了确保GBase数据库的稳定运行和高效性能&#xff0c;对其…...

推荐五种msvcr71.dll丢失的解决方法,msvcr71.dll为什么会丢失?

当你的电脑提示msvcr71.dll丢失时是什么情况&#xff1f;为什么会出现这样的问题&#xff1f;msvcr71.dll丢失和什么有关呢&#xff1f;那么msvcr71.dll丢失应该如何解决呢&#xff1f;今天就和大家聊聊msvcr71.dll丢失的解决办法的详细解决步骤。 msvcr71.dll丢失是否与系统更…...

Java 内存模型(JMM)

JMM&#xff0c;全称 Java Memory Model &#xff0c;中⽂释义Java内存模型 1. 概述 对于 Java 程序员来说&#xff0c;在虚拟机⾃动内存管理机制下&#xff0c;不再需要像 C/C 程序开发程序员这 样为每⼀个 new 操作去写对应的 delete / free 操作&#xff0c;不容易出现内存…...

用于安全研究的 Elastic Container Project

作者&#xff1a;来自 Elastic Andrew Pease•Colson Wilhoit•Derek Ditch 使用 Docker 启动 Elastic Stack 序言 Elastic Stack 是一个模块化数据分析生态系统。虽然这允许工程灵活性&#xff0c;但建立开发实例进行测试可能很麻烦。建立 Elastic Stack 的最简单方法是使用…...

STM8L101低功耗的理解

一.通过降低时钟频率来降低功耗&#xff1a; 规格书如图 1.code 从flash启动&#xff0c;主频率是16Mhz时&#xff0c;功耗测量2.51ma左右&#xff0c;对应程序如下&#xff1a; 2.code从flash启动&#xff0c;主频率是2Mhz时&#xff08;上电默认值&#xff09;&#xff0c;功…...

Kotlin cancel CoroutineScope.launch的任务后仍运行

Kotlin cancel CoroutineScope.launch的任务后仍运行 import kotlinx.coroutines.*fun main() {runBlocking {val coroutineScope CoroutineScope(Dispatchers.IO)val job coroutineScope.launch {var i 0while (i < Int.MAX_VALUE) {iprintln(i)}}// 2ms 取消协程delay(…...

你是不是分不清哪些字体是商用,哪些非商用?快来看,免得莫名其妙负债。

前言 最近发现有好多小伙伴在做PPT的时候&#xff0c;都有一个很不好的习惯&#xff1a;没有调整好字体。 这里说的没有调整好字体的意思是&#xff1a;在一些公开发布的内容上使用一些可能造成侵权的字体。 字体侵权‌的后果相当严重。轻者可能面临法律纠纷&#xff0c;重者…...

新电脑工作流搭建记录-前端篇

vscode&#xff1a; url: Visual Studio Code - Code Editing. Redefined 插件&#xff1a;Chinese、git history、git graph、codelf、css peek、auto closed tad、auto rename tag、Quokka.js、Image preview Node 官网直接下载&#xff1a;下载 | Node.js node版本管理…...

XXL-JOB 漏洞大全

一、前言 在当今的数字化时代&#xff0c;任务调度平台对于企业级应用来说至关重要。它们负责自动化和协调各种时间敏感或周期性的任务&#xff0c;确保业务流程的顺畅运行。XXL-JOB作为一款流行的分布式任务调度平台&#xff0c;因其强大的功能和易用性&#xff0c;被广泛部署…...

使用 Visual Studio Code 配置 C/C++ 开发环境

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款非常流行的代码编辑器&#xff0c;提供了丰富的扩展和配置支持&#xff0c;使其成为进行 C/C 开发的一款理想工具。本文将详细介绍如何在 VSCode 中配置 C/C 开发环境&#xff0c;涵盖安装必要的工具和插件、编写简…...

STM32与ESP8266的使用

串口透传 “透传”通常指的是数据的透明传输&#xff0c;意思是在不对数据进行任何处理或修改的情况下&#xff0c;将数据从一个接口转发到另一个接口。值得注意的是要避免串口之间无限制的透明&#xff0c;可以采用互斥锁的方式进行限制使用方法 对USART1和USART3(用他俩举例…...

【计算机网络】数据链路层深度解析

概述三个重要问题封装成帧差错检测可靠传输 使用广播信道的数据链路层数据链路层的互连设备 媒体接入MAC地址集线器与交换机区别以太网交换机生成树协议STP 概述 链路就是从一个结点到相邻结点的一段物理线路&#xff0c;而中间没有任何其他的交换结点。数据链路是指把实现通信…...

【基于轻量型架构的WEB开发】【章节作业】

作业1 mybatis核心对象、配置文件和映射文件 一. 单选题&#xff08;共10题&#xff0c;50分&#xff09; 1. (单选题)以下关于<select>元素及其属性说法错误的是()。 A. <select>元素用来映射查询语句,它可以帮助我们从数据库中读取出数据,并组装数据给业务开发…...

一张图解析FastAdmin中的表格列表(bootstrap-table)的功能(备份)

功能描述 请根据图片上的数字索引查看对应功能说明。 1.菜单名称和描述 默认生成的CRUD是没有菜单名称和描述显示的&#xff0c;如果需要显示则可以修改权限管理->菜单规则&#xff0c;给对应菜单的添加上备注信息后即可显示&#xff0c;支持HTML 2.TAB过滤选项卡 在一键…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...