HAL库的us定时

本文介绍了如何在STM32F103ZET6上使用HAL库配置通用定时器实现微秒级延时。通过CubeMX设置定时器时钟分频,然后编写代码在TIM2中进行计数,达到指定微秒数后停止定时器,提供了一种基于HAL_Delay的微秒延时实现方案。
摘要由CSDN通过智能技术生成

最近用到的模块时序要求比较高,要用到us定时,网上的代码页大同小异,在这里作个总结。

一、通用定时器循环等待
1、cubeMX配置(只开一个通用定时器就行,时钟那些基本配置不截图了),我用的是STM32F103ZET6,使用外部时钟72M,所以定时器的分频系数为72-1,然后的得到的就是72M/72=1M Hz,也就是1us。上图:
在这里插入图片描述

2.添加代码
在tim.c中添加

/* USER CODE BEGIN 1 */
#include "stm32f1xx_hal_tim.h"
void HAL_Delay_us(uint32_t us)
{
   uint32_t tem=us;
   __HAL_TIM_SET_COUNTER(&htim2,0);            //将初值设置为0
    HAL_TIM_Base_Start(&htim2);                //开启定时器2
   while(__HAL_TIM_GET_COUNTER(&htim2)<tem);  //计时等待,当count达到所需的us跳出循环
    HAL_TIM_Base_Stop(&htim2);                // 关闭定时器
  
}
/* USER CODE END 1 */

记得在tim.h中声明函数

void HAL_Delay_us(uint32_t us)

至此,完结。

二、基于HAL_Delay()上改动
这个可以去看看这个:stm32之HAL库实现us延时方法
我觉得挺巧妙的!

STM32 HAL库(Hardware Abstraction Layer)是一个高级的硬件抽象层,它提供了一种标准化的方式来访问STMicroelectronics STM32微控制器的各种功能,包括定时器。想要实现1us级别的延时,通常会利用STM32的高精度定时器,比如TIMx。 在HAL库中,你可以使用`HAL_Delay()`函数来实现大约1us的延时,但是由于CPU时钟频率以及实际定时器周期的限制,精确到1us可能会有误差。通常,`HAL_Delay()`底层是通过定时器的预分频和中断机制实现,例如使用TIM3定时器的PWM模式,并设置适当的计数周期,然后在每个计数溢出后处理一次中断,模拟接近1us的延时。 下面是一个简单的示例: ```c // 首先配置TIM3定时器用于1us延时 HAL_TIM_Base_Init(&htim3); htim3.Instance.Init.Prescaler = (SystemCoreClock / 8000000) - 1; // 8M Hz CPU clock and 1us target htim3.Instance.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Instance.Init.Period = 1; HAL_TIM_Base_Start_IT(&htim3); // 启动定时器并等待中断 // 进入一个循环,在这里可以做其他任务 while (__HAL_TIM_GET_FLAG(&htim3,.TIM_FLAG_UPDATE) == RESET) { // 主循环内,如果定时器未更新标志,说明还未达到1us } __HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE); // 清除中断标志 ``` 注意:这只是一个简化示例,实际应用中可能需要考虑中断抢占、优先级调整等因素,同时1us延时在某些性能需求高的场景下可能不够精确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值