stm32延时delay.h
时间: 2025-06-19 20:50:37 浏览: 28
### STM32延时函数及delay.h头文件的使用教程
在STM32微控制器中,延时功能通常通过SysTick定时器实现,这种方式既简单又高效。以下是对`delay.h`头文件及其相关功能的详细介绍和示例代码。
#### 1. 延时函数的基本原理
延时函数的核心是通过计数器或定时器来控制程序执行的时间间隔。对于STM32,最常见的方法是利用SysTick定时器生成精确的毫秒级或微秒级延时[^1]。SysTick定时器的时钟源默认为系统时钟(SYSCLK)的1/8,因此可以通过配置其重装载值(LOAD寄存器)来设置延时时间。
#### 2. `delay.h`头文件的功能
`delay.h`通常包含延时函数的声明以及相关的初始化代码。以下是常见的函数定义:
- `delay_init(u8 SYSCLK)`:初始化延时函数,设置SysTick定时器的时钟源和重装载值。
- `delay_ms(u16 nms)`:实现毫秒级延时。
- `delay_us(u16 nus)`:实现微秒级延时。
这些函数的具体实现通常位于`delay.c`文件中[^3]。
#### 3. 示例代码
以下是一个完整的示例代码,展示如何使用`delay.h`头文件实现延时功能:
```c
// delay.h 文件内容
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f4xx_hal.h"
void delay_init(void);
void delay_ms(uint16_t nms);
void delay_us(uint16_t nus);
#endif
// delay.c 文件内容
#include "delay.h"
volatile uint32_t fac_us = 0;
volatile uint32_t fac_ms = 0;
void delay_init(void) {
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; // 设置时钟源为HCLK/8
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; // 开启中断
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 启用SysTick
fac_us = SystemCoreClock / 8000000; // 每微秒需要的SysTick时钟数
fac_ms = fac_us * 1000; // 每毫秒需要的SysTick时钟数
}
void delay_ms(uint16_t nms) {
uint32_t ticks = nms * fac_ms;
uint32_t reload = SysTick->VAL;
while (ticks > reload) {
reload += SysTick->LOAD + 1;
if (reload >= SysTick->VAL) {
break;
}
}
}
void delay_us(uint16_t nus) {
uint32_t ticks = nus * fac_us;
uint32_t reload = SysTick->VAL;
while (ticks > reload) {
reload += SysTick->LOAD + 1;
if (reload >= SysTick->VAL) {
break;
}
}
}
// main.c 文件内容
#include "delay.h"
#include "stm32f4xx_hal.h"
int main(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
delay_init(); // 初始化延时函数
while (1) {
delay_ms(500); // 延时500毫秒
// 执行其他任务
}
}
```
#### 4. 注意事项
- 确保系统时钟配置正确,否则会影响延时精度[^2]。
- 在多任务环境中使用延时函数时,需注意任务调度对延时精度的影响。
- 如果使用RTOS(如UCOS),需要额外配置SysTick中断以支持操作系统时钟节拍[^3]。
#### 5. 相关问题
阅读全文
相关推荐
















