stm32f4 us级延时函数
时间: 2025-03-20 21:13:01 浏览: 41
### STM32F4 微秒级延迟函数实现
对于 STM32F4 的微秒级延迟函数实现,可以基于 SysTick 定时器完成。SysTick 是 Cortex-M 内核自带的一个 24 位向下计数定时器,其分辨率取决于系统时钟频率。以下是具体实现方式以及代码示例。
#### 实现原理
SysTick 的工作模式依赖于系统时钟 (System Clock),通过配置重装载寄存器 `STK_LOAD` 和使能中断或轮询的方式,可以实现高精度的延迟功能。假设系统时钟为 168 MHz,则每滴答一次的时间间隔为:
\[ \text{Tick Time} = \frac{\text{System Clock}}{\text{Reload Value} + 1} \]
因此可以通过设置合适的重装载值来控制延迟时间长度[^3]。
#### 代码实现
以下是一个典型的微秒级延迟函数实现示例:
```c
#include "stm32f4xx.h"
// 延迟初始化函数
void Delay_Init(void) {
SystemCoreClockUpdate(); // 更新系统时钟变量
}
// 微秒级延迟函数
void delay_us(uint32_t us) {
uint32_t ticks;
uint32_t reload;
reload = SysTick->LOAD; // 获取当前重载值
ticks = us * (SystemCoreClock / 1000000); // 计算所需的滴答次数
SysTick->LOAD = ticks - 1; // 设置新的重载值
SysTick->VAL = 0; // 清零计数值
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk; // 启动 SysTick 并选择内部时钟源
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); // 等待直到标志位置位
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭 SysTick
SysTick->LOAD = reload; // 恢复原来的重载值
}
```
上述代码中,`delay_us` 函数利用了 SysTick 来实现精确到微秒级别的延迟。注意,在调用此函数之前需确保已正确配置系统时钟并启用 SysTick 中断控制器。
另外一种更简单的实现方式如下所示,它不涉及修改 SysTick 配置而是单纯依靠循环操作达到近似效果:
```c
#define DELAY_US_PER_LOOP ((float)(1.0 / (SystemCoreClock / 1e6)))
static inline void _nop_(void) { asm volatile("nop"); }
void delay_us_simple(uint32_t us) {
float loops_per_us = 1 / DELAY_US_PER_LOOP;
uint32_t loop_count = (uint32_t)(us * loops_per_us);
for (volatile uint32_t i = 0; i < loop_count; ++i) {
_nop_();
}
}
```
这种方法虽然简单易懂但不够精准,因为每次 NOP 指令的实际执行周期可能受到编译优化等因素影响而有所偏差[^4]。
#### 注意事项
当使用 SysTick 进行长时间测量或者频繁切换不同任务间的延迟计算时,应特别留意最大可测范围限制以及上下文中断优先级设定等问题。
阅读全文
相关推荐


















