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

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

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

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

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

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

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

c 复制代码
__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,如下:

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,如下:

c 复制代码
#ifndef _LL_DELAY_H_
#define _LL_DELAY_H_

void HAL_Delay(uint32_t Delay);

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

相关推荐
路上有只喵2 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇 11
单片机·嵌入式硬件
不昀2 小时前
开关电源电流互感器怎么选:匝比、采样电阻与复位的计算笔记
单片机·嵌入式硬件·电子元器件
小李不想当小白5 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
youcans_7 小时前
【嵌入式软件AI编程】(3)面向 AI 协同开发的 STM32 硬件信息标准化
人工智能·stm32·嵌入式硬件·ai编程
Zw-awa8 小时前
看不见的线怎么选:蓝牙、Wi-Fi、ZigBee、LoRa 与蜂窝网络
stm32
开目软件9 小时前
圆满验收 | 泰胜风能 & 开目MOM,数智重构风电塔筒制造内核
重构·制造
智者知已应修善业9 小时前
【51单片机实现从下到上,从上到下,从中间到两边,两边到中间】2024-10-23
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
辰哥单片机设计10 小时前
STM32智能药盒丨2027单片机新项目
stm32·单片机·嵌入式硬件
KKKlucifer20 小时前
国内数据安全服务的产品智能化转型:大模型赋能下的技术能力重构分析
大数据·数据库·重构