STM32CubeMX | STM32 HAL库方式的微秒延时函数

STM32CubeMX | STM32 HAL库方式的微秒延时函数STM32CUBEMX系列教程之HAL库方式的微秒延时函数标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库官方使用SysTick的地方非常多,改代码容易引起错乱。网上的代码使用定时器进行微秒级别延时(不知道该方式的请自行搜索),总是卡在__HAL_TIM_GET_COUNTER,所以自己实现一个微秒级别延时函数尤为重要。#defineCPU_FREQUENCY_MHZ…

大家好,又见面了,我是你们的朋友全栈君。

STM32CUBEMX系列教程之HAL库方式的微秒延时函数


标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库将SysTick定时器用做了库函数的超时定时器,使用的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱。所以此时就需要自己实现一个微秒级别延时函数。


扫描以下二维码,关注公众号雍正不秃头获取更多STM32资源及干货!
在这里插入图片描述


方式一:系统滴答定时器

优点:全系列通用,只需要将宏定义CPU_FREQUENCY_MHZ根据时钟主频修改即可。
缺点:系统滴答定时器是HAL库初始化的,且必须有HAL库初始化。

#define CPU_FREQUENCY_MHZ 72 // STM32时钟主频
void delay_us(__IO uint32_t delay)
{ 
   
    int last, curr, val;
    int temp;

    while (delay != 0)
    { 
   
        temp = delay > 900 ? 900 : delay;
        last = SysTick->VAL;
        curr = last - CPU_FREQUENCY_MHZ * temp;
        if (curr >= 0)
        { 
   
            do
            { 
   
                val = SysTick->VAL;
            }
            while ((val < last) && (val >= curr));
        }
        else
        { 
   
            curr += CPU_FREQUENCY_MHZ * 1000;
            do
            { 
   
                val = SysTick->VAL;
            }
            while ((val <= last) || (val > curr));
        }
        delay -= temp;
    }
}

方式二:简单延时

优点: 实现简单,如果是F1系列,HAL_RCC_GetHCLKFreq()获取的值是72000000,此方式经过测试还是比较准的,如果不考虑通用性,F1系列建议使用此种方式。

缺点: 只适用F1系列72M主频。

void delay_us(uint32_t us)
{ 
   
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
	{ 
   
		;
	}
}

方式三:普通定时器

优点: STM32全系列通用
缺点: 占用一个定时器

该方法的思路是将定时器设置为1MHZ的计数频率,定时器计一个数就是1us,实现如下:

【F1系列】
在这里插入图片描述

#define DLY_TIM_Handle (&htim4)
void delay_us(uint16_t nus)
{ 
   
	__HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);
	__HAL_TIM_ENABLE(DLY_TIM_Handle);
	while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus)
	{ 
   
	}
	__HAL_TIM_DISABLE(DLY_TIM_Handle);
}

【F4系列】
在这里插入图片描述

#define DLY_TIM_Handle (&htim7)

void delay_us(uint16_t nus)
{ 
   
	__HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);
	__HAL_TIM_ENABLE(DLY_TIM_Handle);
	while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus)
	{ 
   
	}
	__HAL_TIM_DISABLE(DLY_TIM_Handle);
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148285.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月29日 上午10:16
下一篇 2022年6月29日 上午10:16


相关推荐

  • 阿里短信单发,批量发送_如何用阿里小号发短信

    阿里短信单发,批量发送_如何用阿里小号发短信1.导入<!–阿里云短信–><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId>&lt…

    2025年6月25日
    5
  • SpringBoot注解验证参数

    SpringBoot注解验证参数注解 作用类型 解释 NotNull 任何类型 属性不能为 null NotEmpty 集合 集合不能为 null 且 size 大于 0 NotBlanck 字符串 字符 字符类不能为 null 且去掉空格之后长度大于 0 AssertTrue Boolean boolean 布尔属性必须是 true Min 数字类型 原子和包装 限定数字的最小值 整型 Max 同 Min 限定数字的最大值 整型

    2026年3月16日
    2
  • C语言实战–QQ友爱机

    C语言实战–QQ友爱机VS2017 运行通过 其他编译器不详版权由本人编写 禁止魔改用于商业用途 include stdio h include windows h windows 系统的一些资源 单键 voidPressKey BYTEvkey keybd event vkey 0 0 0 Sleep 50 keybd event vkey 0 2 0 Sleep 50 双键 voidPressKey BYTEvkey1 windows h stdio h

    2026年3月19日
    2
  • python官网下载步骤64位-windows下载并安装Python的具体步骤

    python官网下载步骤64位-windows下载并安装Python的具体步骤安装Python下载并安装PythonPython的官网是www.python.org,我们可以直接从官网下载Python。这里介绍在微软Windows和苹果MacOS两种系统中的安装方式。如果Python官网页面之后有所更新,那请大家用自己的思维能力和观察力,大胆地尝试,推测如何下载安装,解决问题。1.5.1Windows系统进入https://www.python.org/页面,选…

    2022年6月3日
    74
  • libxml2 c教程_linux怎么用gcc编译

    libxml2 c教程_linux怎么用gcc编译我的开发环境是ubuntu18嵌入式的环境也是ubuntu,只需要执行下面的动作即可虚拟机上执行,设备上也执行apt-getinstalllibxml2apt-getinstalllibxml2-dev虚拟机上建立连接sudoln-s/usr/include/libxml2/libxml/usr/include/libxml开发的时候引入”x…

    2025年5月24日
    4
  • 开源低代码Agent工作流搭建:n8n与dify的实践指南

    开源低代码Agent工作流搭建:n8n与dify的实践指南

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号