stm32hal延时函数delay
时间: 2025-01-06 13:39:59 浏览: 9
### STM32 HAL 延时函数 `HAL_Delay` 的用法与实现
#### 函数原型
```c
__weak void HAL_Delay(uint32_t Delay);
```
此函数用于创建指定毫秒数的延迟。参数 `Delay` 表示希望等待的毫秒数量。
#### 实现细节
在进入具体实现之前,先初始化系统滴答定时器(SysTick),这通常是在系统的初始化过程中完成。SysTick 定时器每经过一毫秒就会使全局变量 `uwTick` 自增一次[^1]。
实际执行延时期间,`HAL_Delay` 首先记录调用时刻的时间戳 `tickstart = HAL_GetTick()` 。接着计算预期等待周期 `wait = Delay` ,并在此基础上增加一个频率补偿值 `(uint32_t)(uwTickFreq)` 来确保即使设定的延时非常短也能得到适当处理。
随后通过循环检测当前时间减去起始时间是否超过了预定的等待周期来决定何时结束延时过程:
```c
while ((HAL_GetTick() - tickstart) < wait)
{
// 循环直到满足条件
}
```
这段代码不断检查自 `tickstart` 开始到现在过去了多少时间,一旦达到或超过所期望的延时长度即跳出循环继续后续程序运行。
#### 使用注意事项
由于该方法依赖于 SysTick 计数器来进行计时,在多任务环境中可能会因为其他高优先级的任务抢占 CPU 而导致实际延时不准确。因此对于精确度要求较高的应用场景建议采用硬件定时器替代软件延时方案。
相关问题
stm32 HAL库延时函数delay
### STM32 HAL库延时函数 `HAL_Delay` 的使用方法与实现原理
#### 使用方法
在STM32 HAL库中,`HAL_Delay()` 是用于毫秒级延迟的标准API。此函数接受一个参数——表示等待时间的无符号整型数值(单位为毫秒),并在此期间挂起当前线程。
要调用该函数,需先确保已经初始化了系统的滴答定时器(SYSTICK),通常是在项目启动文件(`main.c`)中的`HAL_InitTick()`被调用之后完成这一操作[^1]。
```c
// Example of using HAL_Delay function.
HAL_Delay(1000); // Delay for 1 second (1000 milliseconds).
```
#### 实现原理
`HAL_Delay()` 函数依赖于Systick定时器来提供精确的时间基准。当程序执行到这个函数时,它会记录下当前时刻,并不断查询直到达到指定数量的周期才返回控制权给后续指令继续运行。具体来说:
- Systick是一个24位向下计数的倒计数定时器;
- 当配置好预设值后,每过一次系统时钟频率对应的周期就减去一;
- 到达零的时候会产生溢出事件通知CPU更新全局变量SysTick->VAL重新加载重装载寄存器里的初值;
- 同时也会触发中断服务例程(ISR)增加由硬件维护的一个递增计数器ms_ticks[]。
因此,通过这种方式可以实现较为精准可靠的软件延时效果。
然而需要注意的是,在某些特定场景比如ISR内部不应该直接调用`HAL_Delay()`因为这可能会造成不可预测的行为甚至死锁现象发生,正如提到过的按键消抖应用案例所示[^3]。
对于更短时间尺度上的微秒级别延迟,则可能需要用到其他机制如基于DWT(Deprecated Watchdog Timer)组件的方法或是利用更高精度的通用TIMx外设来进行编程设计[^2]。
STM32 HAL 延时函数
STM32 HAL是STMicroelectronics提供的一套针对STM32系列微控制器的硬件抽象层(Hardware Abstraction Layer)库。它提供了一系列的API函数,用于简化STM32微控制器的底层驱动和操作。
在STM32 HAL库中,延时函数是用来实现延时操作的函数。延时函数可以用于在程序中添加一定的时间延迟,以满足特定的需求,比如等待外设初始化完成、产生特定的时间间隔等。
在HAL库中,提供了两种常用的延时函数:
1. HAL_Delay(ms):该函数用于实现毫秒级别的延时,参数ms表示延时的毫秒数。
2. HAL_Delay_us(us):该函数用于实现微秒级别的延时,参数us表示延时的微秒数。
这两个函数底层使用了系统滴答定时器(SysTick)来实现延时功能。SysTick定时器是STM32微控制器内置的一个定时器,可以用来生成固定时间间隔的中断。
使用延时函数时,需要注意以下几点:
1. 在使用延时函数之前,需要先初始化SysTick定时器。
2. 延时函数会阻塞当前线程的执行,直到延时时间到达。
3. 延时时间并不是绝对准确的,受到系统时钟频率和其他中断的影响。
阅读全文