stm32 HAL DELAY
时间: 2025-01-02 21:39:41 浏览: 11
### STM32 HAL 库中的延迟函数
#### HAL_Delay 函数介绍
`HAL_Delay()` 是一个基于滴答定时器 (systick timer) 的阻塞型毫秒级延时函数。该函数会暂停程序执行直到指定的时间过去为止[^1]。
```c
void HAL_Delay(uint32_t Delay);
```
参数 `Delay` 表示要等待的毫秒数。此函数内部通过循环查询 systick 定时器来判断时间是否到达设定值,在这段时间内 CPU 将处于忙碌状态,无法处理其他任务。
#### Systick Timer 配置
Systick 定时器初始化通常由 HAL 库自动完成,当调用 `HAL_Init()` 或者创建项目时自动生成的启动文件已经包含了必要的配置代码。如果需要手动调整滴答中断频率,则可以通过修改 `HAL_TimeBase_Init()` 来改变默认设置。
#### 自定义计数器实现延时
除了使用 `HAL_Delay()`, 还可以利用通用定时器(TIMx)作为硬件计数器来自行编写更精确或灵活的延时子程序。这种方式的优点在于不会占用CPU资源,并允许同时运行多个独立的任务。
```c
// 初始化 TIMx 用于产生周期性的更新事件
static void MX_TIMx_Init(void){
__HAL_RCC_TIMx_CLK_ENABLE();
TIM_HandleTypeDef htim;
htim.Instance = TIMx;
htim.Init.Prescaler = SystemCoreClock / 1000000 - 1; // 设置预分频系数得到微秒级别精度
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = usValue - 1; // 设定自动重装载寄存器ARR, 即延时期间
if(HAL_TIM_Base_Init(&htim)!= HAL_OK){
Error_Handler();
}
}
// 调用 HAL_TIM_Base_Start() 开始计数并进入等待模式直至溢出发生
void delay_us(uint32_t us){
uint32_t tickstart = HAL_GetTick();
while((HAL_GetTick()-tickstart)<us);
}
```
上述例子展示了如何借助外部定时器模块构建自己的微秒级延时功能,这种方法特别适合于那些对实时性能有较高要求的应用场景。
阅读全文