当前位置: 首页 > 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);

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

http://www.lryc.cn/news/441991.html

相关文章:

  • OpenAI最新发布的o1-preview模型,和GPT-4o到底哪个更强?
  • 基于Python+SQLite的课程管理系统
  • 每日一练 | USG系统默认安全区域
  • 技术老总眼中的品宣与促销:挑战与对策
  • [全网首篇]关于 VMSA-2024-0019 安全公告(CVE-2024-38812、CVE-2024-38813)的说明与解决方案
  • 监控易监测对象及指标之:全面监控GBase数据库
  • 推荐五种msvcr71.dll丢失的解决方法,msvcr71.dll为什么会丢失?
  • Java 内存模型(JMM)
  • 用于安全研究的 Elastic Container Project
  • STM8L101低功耗的理解
  • Kotlin cancel CoroutineScope.launch的任务后仍运行
  • 你是不是分不清哪些字体是商用,哪些非商用?快来看,免得莫名其妙负债。
  • 新电脑工作流搭建记录-前端篇
  • XXL-JOB 漏洞大全
  • 使用 Visual Studio Code 配置 C/C++ 开发环境
  • STM32与ESP8266的使用
  • 【计算机网络】数据链路层深度解析
  • 【基于轻量型架构的WEB开发】【章节作业】
  • 一张图解析FastAdmin中的表格列表(bootstrap-table)的功能(备份)
  • 【数据结构】假设二叉树采用二叉链表存储,编写一棵二又树中序遍历的非递归算法。
  • 李宏毅结构化学习 02
  • Android AlertDialog圆角背景不生效的问题
  • 探讨基于AI技术的相亲交友系统设计与实现
  • (2024.9.20)Endnote插入的参考文献字号太大怎么办?
  • DataGrip在Windows和MacOS平台上的快捷键
  • CSS---序号使用css设置,counter-reset、counter-increment、content配合实现备注文案的序号展示
  • Liquor 表达式引擎基本使用
  • AI美女屠版小红书火了,被当真人推流,颜值博主慌了
  • 本地搭建我的世界服务器(JAVA)简单记录
  • 哪个快?用300万个图斑测试ArcGIS Pro的成对叠加与经典叠加