stm32cube us延时
时间: 2025-04-17 09:44:56 浏览: 24
### STM32Cube 实现微秒延时函数
对于需要精确控制时间的应用场景,如DHT11传感器的数据读取,STM32Cube提供了多种实现微秒级延时的方式。一种常见做法是利用通用定时器来创建高精度的延迟功能。
#### 方法一:使用通用定时器
通过配置一个通用定时器(例如TIM3),可以设置其自动重装载寄存器ARR以达到所需的微秒数。下面是一个具体的例子:
```c
void TIM3_Init(void){
__HAL_RCC_TIM3_CLK_ENABLE(); //使能定时器3时钟
htim3.Instance = TIM3;
htim3.Init.Prescaler = 83; //预分频系数,假设APB1=84MHz,则计数频率为1MHz
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999; //向上计数模式下溢出时间为1ms
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK){
Error_Handler();
}
}
// 微妙级别延时函数定义
void delay_us(uint16_t us){
uint16_t temp;
__HAL_TIM_SET_AUTORELOAD(&htim3,us-1); // 设置自动重新加载值
__HAL_TIM_GENERATE_EVENT(&htim3,TIM_EVENTSOURCE_UPDATE);
__HAL_TIM_CLEAR_FLAG(&htim3,TIM_IT_UPDATE);
HAL_TIM_Base_Start(&htim3); // 开始计数
do{
temp = __HAL_TIM_GET_FLAG(&htim3,TIM_FLAG_UPDATE);
}while(temp==RESET);
HAL_TIM_Base_Stop(&htim3); // 停止计数
}
```
这段代码展示了如何初始化并使用TIM3来进行微秒级别的延时操作[^1]。
#### 方法二:基于系统滴答中断(SysTick)
虽然SysTick通常用于提供毫秒级的时间基准,在某些情况下也可以调整它的工作参数从而获得更短周期内的事件触发能力。不过出于兼容性和可移植性的考虑,建议优先选用独立于RTOS之外的基础硬件资源——即上述提到过的专用定时器方案[^3]。
#### 方法三:循环等待法(不推荐)
尽管存在简单地依赖CPU指令执行次数来估算经过了多少时间的方法,这种方法不仅效率低下而且极易受到外部因素干扰而失去准确性,因此除非万不得已否则应避免采用此类手段[^2]。
综上所述,当涉及到亚毫秒量级甚至更低范围内的精准度需求时,借助内置外设比如定时器会是比较理想的选择之一。
阅读全文
相关推荐


















