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


相关推荐

  • tasklist 结束进程_转Tasklist(windows)

    tasklist 结束进程_转Tasklist(windows)目录Tasklist简述1、”Tasklist”命令是一个用来显示运行在本地或远程计算机上的所有进程的命令行工具,带有多个执行参数。类似Linux系统的ps命令2、显示结果由五部分组成:映像名称(进程名)、PID、会话名、会话#、内存使用使用格式tasklist[/s[/u[\][/p]]][{/m|/svc|/v}][/fo{table|list|csv}…

    2025年6月11日
    7
  • SIMD and Avx2

    SIMD and Avx2SIMD一条指令可以执行多个数据group的计算和输出。对于SIMD相对应的SISD.intel SSE2 ,AVX2,AVX-512假设有一个任务是统计字符串中每一个字符出现的次数,我们可以用128bit的SISD指令进行统计。每8个bit代表一个字符,所以只需要两个SIMD指令(movemask、popcount)。详细测试:#include<stdio.h>#include<thread>#defineINC_TO1000000//o

    2022年5月7日
    33
  • 使用Postman做mock测试

    使用Postman做mock测试为什么要做mock测试?一般在对第三方接口(如银联、支付宝、微信等),使用mock来模拟被请求的接口还有是在业务依赖的关系接口未开发出来时,测试人员为了保证项目的测试进度不受影响,就需要构造出来一个虚拟的接口来进行一系列的接口测试一、打开postman,创建mockserver在左上角有一个New,点开后会有下拉列表展示,选择里面的MockServer勾选Request-Body(请求内容)填写mock测试的各个请求参数之后点击Next,下一步createmockserv.

    2022年6月20日
    45
  • VS2017 安装 Microsoft Visual Studio Installer Project

    VS2017 安装 Microsoft Visual Studio Installer Project1.安装打包插件:MicrosoftVisualStudio2017安装程序项目2.联机查找下面的组件,然后安装,重启VS,进行插件安装3.新建安装项目,另外,有些人可能会想这么多安装类型,怎么选。因为我们这里说的Windows程序打包,输出文件格式为.exe或者.msi,大概看一下介绍就能知道,第一个和第四个是合适的。这两个又该怎么选呢?那其实第四个就是对一些属性多了些引导,最…

    2022年7月20日
    17
  • netty 自定义协议_自定义annotation

    netty 自定义协议_自定义annotationNetty实现自定义协议

    2022年4月22日
    55
  • es7之Reflect Metadata

    es7之Reflect MetadataReflectMetad 是 ES7 的一个提案 它主要用来在声明的时候添加和读取元数据 想要了解其内容 我们来讲解几个概念 MetaData 也称元数据 元数据是用来描述数据的数据 举个例子 元数据概念其实是跟数据库的字段名 field 一致 在传统的数据库中就天然包含元数据的概念 比如 name phone 它们就是元数据 Reflect es6 规范中 Reflect 已存在 简单来说 这个 API 的作用就是可以实现对变量操作的函数化 也就是反射 具体可看阮一峰 es6 关于 reflec

    2026年3月16日
    3

发表回复

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

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