嵌入式开发--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);

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

相关推荐
坚毅不拔的柠檬柠檬5 小时前
2025:人工智能重构人类文明的新纪元
人工智能·重构
桂月二二5 小时前
异步联邦学习的动态隐私保护框架:重构边缘智能的数据安全边界
重构
楼台的春风5 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
Moonnnn.5 小时前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
LS_learner6 小时前
小智机器人CMakeLists编译文件解析
嵌入式硬件·机器人
小鸡岛保安7 小时前
学习笔记-8MQTT-韦东山
stm32·物联网
暗碳7 小时前
stm32 74hc238流水灯
stm32·单片机·嵌入式硬件
1101 11017 小时前
STM32-温湿度上传OneNET项目
stm32·单片机·嵌入式硬件
余衫马8 小时前
ESP32-S3 实战指南:BOOT-KEY 按键驱动开发全解析
驱动开发·单片机·嵌入式硬件
文军的烹饪实验室11 小时前
处理器架构、单片机、芯片、光刻机之间的关系
单片机·嵌入式硬件·架构