打印
[应用相关]

HAL库方式的微秒延时函数

[复制链接]
1026|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wakayi|  楼主 | 2021-8-4 15:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
方式一:系统滴答定时器
优点:全系列通用,只需要将宏定义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;
    }
}


使用特权

评论回复
沙发
wakayi|  楼主 | 2021-8-4 15:42 | 只看该作者
方式二:简单延时
优点: 实现简单,如果是F1系列,HAL_RCC_GetHCLKFreq()获取的值是72000000,此方式经过测试还是比较准的,如果不考虑通用性,F1系列建议使用此种方式。

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

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


使用特权

评论回复
板凳
wakayi|  楼主 | 2021-8-4 15:42 | 只看该作者
方式三:普通定时器
优点: 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);
}



使用特权

评论回复
地板
wakayi|  楼主 | 2021-8-4 15:43 | 只看该作者
【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);
}



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

4087

帖子

1

粉丝