STM32毫秒延时函数
时间: 2025-02-24 22:27:48 浏览: 42
### STM32 平台上的毫秒级延时函数实现
对于STM32平台而言,毫秒级别的延时可以通过多种方式实现。其中一种常见的方式是利用硬件定时器或是通过CPU循环来达到所需的时间延迟效果。
#### 方法一:基于空操作指令的软件延时
这种方法适用于简单的应用场景或者是初步的学习阶段。其原理在于根据系统的时钟频率计算出相应的循环次数,从而使得每次调用`__NOP()`指令所花费的时间总和等于期望的延时时间:
```c
void HwDelay(uint32_t milliseconds) {
uint32_t ticks = milliseconds * (STM32_CLOCK_FREQ / 1000);
for (uint32_t i = 0; i < ticks; i++) {
__NOP(); // No Operation (NOP) assembly instruction
}
}
```
此方法虽然简单易懂,但由于依赖于处理器的具体运行情况以及编译优化等因素的影响,因此精度不高且不推荐用于对时间敏感的应用场景[^1]。
#### 方法二:使用SysTick定时器实现精准延时
更专业的做法则是借助STM32内置的SysTick定时器来进行更加精确可靠的延时处理。这种方式不仅能够提供更高的准确性,而且不会受到外部因素干扰而改变实际等待的时间长度:
```c
#include "stm32f1xx_hal.h"
void delay_ms(uint32_t nms) {
SysTick->LOAD = SystemCoreClock / 1000 - 1;
SysTick->VAL = 0x00;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
for (; nms != 0;) {
if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0) {
--nms;
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x00;
SysTick->LOAD = SystemCoreClock / 1000 - 1;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0X00;
}
// 或者简化版本如下所示:
void delay_ms_simple(uint32_t ms){
HAL_Delay(ms); // HAL库自带的延时函数
}
```
上述代码片段展示了如何配置SysTick寄存器以每过1毫秒触发一次中断,并以此为基础构建了一个简易版的毫秒级别延时功能。值得注意的是,在完成延时期间应保持SysTick处于开启状态;而在结束之后则需将其重置回初始设置以便不影响后续的操作逻辑[^3]。
阅读全文
相关推荐


















