打印
[STM32F1]

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

[复制链接]
楼主: olivem55arlowe
手机看帖
扫描二维码
随时随地手机跟帖
21
benjaminka| | 2024-9-6 17:15 | 只看该作者 回帖奖励 |倒序浏览
#include "stm32f1xx_hal.h"

TIM_HandleTypeDef htim2;

void MX_TIM2_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};

    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 84 - 1; // 84MHz / 84 = 1MHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 1000 - 1; // 1MHz / 1000 = 1kHz, 1ms
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.RepetitionCounter = 0;
    if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
    {
        // 初始化错误处理
    }

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
    {
        // 配置时钟源错误处理
    }

    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
    {
        // 主从模式配置错误处理
    }
}

使用特权

评论回复
22
xiaoyaodz| | 2024-9-6 18:48 | 只看该作者
配置定时器的时钟源和预分频器,使得定时器的计数频率与所需的微秒延时相匹配。
启动定时器,并在循环中等待定时器计数达到指定的值。
停止定时器,并清除相关标志位以便下次使用。

使用特权

评论回复
23
belindagraham| | 2024-9-6 20:22 | 只看该作者
HAL库主要依赖于SysTick定时器来实现延时,而SysTick定时器通常被用于实现毫秒(ms)级别的延时。

使用特权

评论回复
24
timfordlare| | 2024-9-6 21:56 | 只看该作者
延时精度受CPU主频和编译器优化程度的影响较大。
在不同的编译器设置下,相同的循环可能产生不同的延时。

使用特权

评论回复
25
modesty3jonah| | 2024-9-7 10:25 | 只看该作者
对于精确的微秒级延时,推荐使用定时器

使用特权

评论回复
26
ingramward| | 2024-9-7 11:58 | 只看该作者
可以通过配置其他定时器来实现微秒级别的延时。

使用特权

评论回复
27
averyleigh| | 2024-9-7 13:33 | 只看该作者
通过修改SysTick定时器的加载值(LOAD寄存器)和计数(VAL寄存器)来实现延时。需要注意的是,由于SysTick定时器可能正在被HAL库用于其他目的,直接修改其配置可能会影响库函数的正常运行。

使用特权

评论回复
28
lzmm| | 2024-9-7 15:06 | 只看该作者
void Delay_us(uint32_t nTime)
{
    uint32_t tickstart = 0;

    // 获取当前定时器的计数值
    tickstart = __HAL_TIM_GET_COUNTER(&htim2);

    while ((__HAL_TIM_GET_COUNTER(&htim2) - tickstart) < nTime)
    {
        // 等待定时器计数达到目标值
    }
}

使用特权

评论回复
29
plsbackup| | 2024-9-7 16:39 | 只看该作者
#include "stm32f1xx_hal.h"

void HAL_Delay_microseconds(uint32_t Delay_microseconds)
{
    uint32_t tickstart = HAL_GetTick();
    uint32_t wait = Delay_microseconds;

    if (wait < 0x0FFFFFFF)
    {
        wait += 1;
    }

    while((HAL_GetTick() - tickstart) < wait);
}

使用特权

评论回复
30
hudi008| | 2024-9-7 18:12 | 只看该作者
对于简单的应用,也可以利用循环来实现粗略的延时。但是需要注意的是,基于循环的延时函数不会很精确

使用特权

评论回复
31
1988020566| | 2024-9-7 19:50 | 只看该作者
如果对延时精度有较高要求且不希望占用额外的硬件资源,可以考虑使用优化后的指令延时方法;如果系统中有足够的定时器资源且对延时精度有严格要求,则推荐使用普通定时器来实现微秒延时

使用特权

评论回复
32
hilahope| | 2024-9-7 21:24 | 只看该作者
STM32 HAL库(Hardware Abstraction Layer)提供了一种抽象的方式来访问和控制STM32微控制器的硬件资源。

使用特权

评论回复
33
digit0| | 2024-9-8 10:15 | 只看该作者
对于精确的微秒延迟,建议使用定时器

使用特权

评论回复
34
天天向善| | 2024-9-9 10:14 | 只看该作者
对于简单的应用程序,您也可以使用循环来实现粗略的延迟。然而,应该注意,基于环路的延迟函数不会非常精确

使用特权

评论回复
35
AdaMaYun| | 2024-9-9 16:04 | 只看该作者
HAL库方式的微秒延时函数可以直接调用

使用特权

评论回复
36
Pretext| | 2024-9-10 23:46 | 只看该作者
hal库不直接提供微秒(μs)级的延迟功能

使用特权

评论回复
37
单芯多芯| | 2024-9-11 10:46 | 只看该作者
Hal库不直接提供微秒(μs)量级的等待时间,

使用特权

评论回复
38
AutoMotor| | 2024-9-11 21:06 | 只看该作者
精确的延迟仍然需要通过计时器来实现

使用特权

评论回复
39
未来AI| | 2024-9-12 08:15 | 只看该作者
Hal库不直接提供微秒级的延迟,

使用特权

评论回复
40
LOVEEVER| | 2024-9-12 15:13 | 只看该作者
HAL库自带滴答时钟进行程序调用

使用特权

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

本版积分规则