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

[复制链接]
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)
    {
        // 主从模式配置错误处理
    }
}
xiaoyaodz 发表于 2024-9-6 18:48 | 显示全部楼层
配置定时器的时钟源和预分频器,使得定时器的计数频率与所需的微秒延时相匹配。
启动定时器,并在循环中等待定时器计数达到指定的值。
停止定时器,并清除相关标志位以便下次使用。
belindagraham 发表于 2024-9-6 20:22 | 显示全部楼层
HAL库主要依赖于SysTick定时器来实现延时,而SysTick定时器通常被用于实现毫秒(ms)级别的延时。
timfordlare 发表于 2024-9-6 21:56 | 显示全部楼层
延时精度受CPU主频和编译器优化程度的影响较大。
在不同的编译器设置下,相同的循环可能产生不同的延时。
modesty3jonah 发表于 2024-9-7 10:25 | 显示全部楼层
对于精确的微秒级延时,推荐使用定时器
ingramward 发表于 2024-9-7 11:58 | 显示全部楼层
可以通过配置其他定时器来实现微秒级别的延时。
averyleigh 发表于 2024-9-7 13:33 | 显示全部楼层
通过修改SysTick定时器的加载值(LOAD寄存器)和计数(VAL寄存器)来实现延时。需要注意的是,由于SysTick定时器可能正在被HAL库用于其他目的,直接修改其配置可能会影响库函数的正常运行。
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)
    {
        // 等待定时器计数达到目标值
    }
}
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);
}
hudi008 发表于 2024-9-7 18:12 | 显示全部楼层
对于简单的应用,也可以利用循环来实现粗略的延时。但是需要注意的是,基于循环的延时函数不会很精确
1988020566 发表于 2024-9-7 19:50 | 显示全部楼层
如果对延时精度有较高要求且不希望占用额外的硬件资源,可以考虑使用优化后的指令延时方法;如果系统中有足够的定时器资源且对延时精度有严格要求,则推荐使用普通定时器来实现微秒延时
hilahope 发表于 2024-9-7 21:24 | 显示全部楼层
STM32 HAL库(Hardware Abstraction Layer)提供了一种抽象的方式来访问和控制STM32微控制器的硬件资源。
digit0 发表于 2024-9-8 10:15 | 显示全部楼层
对于精确的微秒延迟,建议使用定时器
天天向善 发表于 2024-9-9 10:14 | 显示全部楼层
对于简单的应用程序,您也可以使用循环来实现粗略的延迟。然而,应该注意,基于环路的延迟函数不会非常精确
AdaMaYun 发表于 2024-9-9 16:04 | 显示全部楼层
HAL库方式的微秒延时函数可以直接调用
Pretext 发表于 2024-9-10 23:46 | 显示全部楼层
hal库不直接提供微秒(μs)级的延迟功能
单芯多芯 发表于 2024-9-11 10:46 | 显示全部楼层
Hal库不直接提供微秒(μs)量级的等待时间,
AutoMotor 发表于 2024-9-11 21:06 | 显示全部楼层
精确的延迟仍然需要通过计时器来实现
未来AI 发表于 2024-9-12 08:15 | 显示全部楼层
Hal库不直接提供微秒级的延迟,
LOVEEVER 发表于 2024-9-12 15:13 | 显示全部楼层
HAL库自带滴答时钟进行程序调用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
快速回复 在线客服 返回列表 返回顶部