stm32f4us级别的延时
时间: 2025-08-05 12:43:01 AIGC 浏览: 15
在 STM32F4 微控制器上实现微秒级别的延时,可以通过使用内核定时器 SysTick 或者简单的循环延迟函数来实现。以下是两种常见的实现方式:
### 使用 SysTick 实现微秒级别的延时
SysTick 是一个 24 位的递减定时器,通常用于操作系统的时间片调度。它可以根据系统时钟频率进行精确的延时控制。
#### 示例代码:
```c
#include "stm32f4xx.h"
void Delay_Init(void) {
SysTick->CTRL = 0; // 关闭 SysTick
SysTick->LOAD = 0xFFFFFF; // 设置最大重载值
SysTick->VAL = 0; // 清空当前计数值
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; // 开启 SysTick,使用处理器时钟源
}
void Delay_us(uint32_t us) {
uint32_t ticks = us * (SystemCoreClock / 1000000); // 计算需要的时钟周期数
uint32_t reload = ticks % 0xFFFFFF;
if (reload == 0) {
reload = 0xFFFFFF;
}
SysTick->LOAD = reload; // 设置重载值
SysTick->VAL = 0; // 清空当前计数值
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待计数到达0
}
```
上述代码中,`Delay_Init()` 函数用于初始化 SysTick 定时器,而 `Delay_us()` 函数则用于实现微秒级别的延时[^4]。
### 使用循环实现微秒级别的延时
另一种方法是使用简单的循环来实现微秒级别的延时。这种方法依赖于 CPU 的指令周期,因此需要根据具体的系统时钟频率调整循环次数。
#### 示例代码:
```c
void DHT11_Delay_Microsecond(uint32_t n) {
while (n--) {
for (uint8_t i = 0; i < 12; i++) {
__NOP(); // 空操作,占用一个时钟周期
}
}
}
```
在这个例子中,`DHT11_Delay_Microsecond()` 函数通过嵌套循环和 `__NOP()` 指令实现了微秒级别的延时[^1]。
### 总结
- **SysTick 方法**:适用于需要高精度延时的场景,且不会占用额外的硬件资源。
- **循环方法**:简单易用,但精度依赖于系统时钟频率,且可能占用较多的 CPU 时间。
选择哪种方法取决于具体的应用需求和系统资源情况。
阅读全文
相关推荐




















