前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STM32CubeMX | STM32 HAL库方式的微秒延时函数

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

作者头像
全栈程序员站长
发布2022-09-07 15:21:50
1.6K0
发布2022-09-07 15:21:50
举报
文章被收录于专栏:全栈程序员必看

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

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


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


关注公众号雍正不秃头获取更多STM32资源及干货!


方式一:系统滴答定时器

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

代码语言:javascript
复制
#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主频。

代码语言:javascript
复制
void delay_us(uint32_t us)
{ 
   
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
	{ 
   
		;
	}
}

方式三:普通定时器

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

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

【F1系列】

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
#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系列】

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
#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.cn/148285.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • STM32CUBEMX系列教程之HAL库方式的微秒延时函数
    • 方式一:系统滴答定时器
      • 方式二:简单延时
        • 方式三:普通定时器
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档