stm32f103zet6延时函数
时间: 2025-05-08 16:17:08 浏览: 27
### STM32F103ZET6 延时函数实现
对于 STM32F103ZET6 的延时函数实现,可以通过基于系统滴答定时器(SysTick)或者通过调用微秒级延迟函数来完成毫秒级延时功能。以下是具体实现方式:
#### 方法一:基于 `delay_us()` 函数的毫秒延时
可以利用已有的微秒级延时函数 `delay_us()` 来构建毫秒级延时函数。这种方法简单易懂,适合初学者使用。
```c
void delay_xms(u32 nms) {
u32 i;
for (i = 0; i < nms; i++) {
delay_us(1000); // 调用微秒级延时函数,每次延时1000微秒即1毫秒
}
}
```
上述代码实现了毫秒级延时功能[^1]。其中,`u32` 是无符号整型变量类型定义,通常可以在项目中的 `typedef.h` 文件中找到其宏定义。
#### 方法二:基于 SysTick 定时器的延时函数
SysTick 是 Cortex-M3/M4 内核自带的一个 24 位向下计数定时器,常用于实现精确的时间管理。以下是一个典型的基于 SysTick 的延时函数实现:
```c
#include "sys tick.h"
// 初始化 SysTick 计时器
void SysTick_Init(void) {
if (SystemCoreClock <= 10000000) {
SysTick->LOAD = SystemCoreClock / 1000 - 1; // 设置重装载寄存器
} else {
SysTick->LOAD = (SystemCoreClock >> 3) / 1000 - 1; // 如果频率过高,则分频
}
SysTick->VAL = 0; // 清空当前值寄存器
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk | // 使用内部时钟源
SysTick_CTRL_ENABLE_Msk | // 启动计时器
SysTick_CTRL_TICKINT_Msk; // 开启中断
}
// 毫秒级延时函数
void delay_ms(uint32_t ms) {
uint32_t ticks = ms * (SystemCoreClock / 1000);
uint32_t reload = SysTick->LOAD;
SysTick->LOAD = ticks - 1; // 配置重载值
SysTick->VAL = 0; // 清零当前值寄存器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 启动计时器
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) {} // 等待计时结束标志位置1
SysTick->LOAD = reload; // 恢复原来的重载值
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计时器
}
```
此方法的优点在于能够充分利用硬件资源并提供更精准的延时控制[^3]。
---
### 注意事项
如果在编译过程中遇到错误提示 `"main.h" file not found`,这通常是由于未正确配置头文件路径所致。建议检查项目的 Include 路径设置,并确认所有必要的头文件均已包含到工程目录下。
另外,在实际应用中需要注意避免因长时间阻塞操作而导致的任务调度问题。例如,在 I2C 或其他外设通信场景中加入超时机制是一种良好的实践[^2]。
---
阅读全文
相关推荐


















