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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 5G科普——5G切片[通俗易懂]

    5G科普——5G切片[通俗易懂]切的是什么?先了解为什么会提出网络切片这一概念。5G服务是多样化的,包括车联网、大规模的互联网、工业自动化、远程医疗、VR/AR等这些服务对我们的要求是不一样的,有的低延时、高可靠;有的高清、高速率;有的大连接、低移动性;因此5G网络要满足差异化的业务,需要能够像搭积木一样灵活部署,方便新业务的上线下线,于是网络切片这一概念应运而生。3GPP定义:网络切片是提供特定网络能力和网络特性的逻辑网…

    2022年10月2日
    0
  • C语言输出格式控制符汇总

    C语言输出格式控制符汇总C语言输出格式控制符汇总标志][输出最小宽度][.精度][长度]类型

    2022年7月24日
    14
  • idea主题插件网址

    idea主题插件网址idea主题插件网址ii​​​​​​​MaterialThemeUI-IntelliJIDEsPlugin|Marketplace

    2022年6月27日
    56
  • postgresql的ALTER经常使用操作

    postgresql的ALTER经常使用操作

    2022年2月6日
    48
  • jq ajax 跨域_解决跨域请求

    jq ajax 跨域_解决跨域请求jQuery中封装了ajax的方法,以下主要讨论在这种方法下跨域的问题1.在服务端添加响应头header(‘Access-Control-Allow-Origin’,’*’)header(‘Access-Control-Allow-Methods’,’PUT,POST,GET,DELETE,OPTIONS’)

    2022年8月24日
    4
  • k8s的apiserver_kube_apiserver

    k8s的apiserver_kube_apiserverAPIserverfunc main() { … #核心 command := app.NewAPIServerCommand() #日志 logs.InitLogs() defer logs.FlushLogs() …}#NewAPIServerCommand#核心是调用run函数 运行AIPserver 永远不会退出return Run(completedOptions, genericapiserver.SetupSignalHandler())#Run#创建

    2022年8月9日
    4

发表回复

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

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