STM32 HAL库 us延时
时间: 2025-01-07 12:23:42 浏览: 68
### 使用 STM32 HAL 库实现微秒级延时
为了在STM32上实现精确的微秒级延时,可以利用STM HAL库中的`HAL_Delay()`函数,不过此函数仅能提供毫秒级别的延时。对于更精细的时间控制,则需自定义微秒级延时函数。
#### 自定义微秒级延时函数方法一:使用SysTick定时器
通过配置SysTick定时器来达到所需的精度:
```c
#include "stm32f4xx_hal.h"
// 定义全局变量保存系统频率
uint32_t SystemCoreClock;
void delay_us(uint32_t nus){
uint32_t ticks;
uint32_t tellapsed;
uint32_t tickstart = 0U;
// 计算需要等待多少个滴答数
ticks = (SystemCoreClock / 1000000) * nus;
tickstart = HAL_GetTick();
while ((tellapsed = HAL_GetTick() - tickstart) < ticks);
}
```
这种方法简单易懂,但是依赖于系统的滴答中断计数,在多任务环境下可能不够稳定[^1]。
#### 方法二:采用TIMx定时器实现高精度延时
创建一个专门用于延时操作的通用定时器实例,并设置其自动重装载寄存器ARR以及预分频系数PSC以满足不同应用场景下的需求:
```c
static TIM_HandleTypeDef TimHandle;
void delay_init(void){
__HAL_RCC_TIM2_CLK_ENABLE(); // 启用TIM2外设时钟
TimHandle.Instance = TIM2;
// 初始化结构体并填充默认参数值
TimHandle.Init.Period = 9999;
TimHandle.Init.Prescaler = 83;
TimHandle.Init.ClockDivision = 0;
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
TimHandle.Init.RepetitionCounter = 0;
if(HAL_TIM_Base_Init(&TimHandle)!= HAL_OK){
Error_Handler();
}
}
void delay_us(uint32_t us){
uint32_t temp=0;
// 设置自动重载值
__HAL_TIM_SET_AUTORELOAD(&TimHandle,((SystemCoreClock/84)/1000*us)-1);
// 清除标志位
__HAL_TIM_CLEAR_FLAG(&TimHandle,TIM_SR_UIF);
// 开启定时器
__HAL_TIM_ENABLE(&TimHandle);
do{
temp=__HAL_TIM_GET_FLAG (&TimHandle , TIM_FLAG_UPDATE );
}while(temp==RESET);
// 关闭定时器
__HAL_TIM_DISABLE(&TimHandle);
}
```
上述代码片段展示了如何初始化定时器资源并通过轮询方式完成指定时间长度内的阻塞等待[^3]。
阅读全文
相关推荐


















