stm32f4延时函数
时间: 2025-01-16 21:54:48 浏览: 53
### STM32F4 单片机延时函数实现方法
#### 使用忙等待延迟
对于简单的应用程序,可以采用基于忙等待的延迟机制。这种方法适用于不需要精确时间控制的情况:
```c
volatile uint32_t timer = 0;
void delay_busy(void) {
while (timer < SOME_VALUE) { // Busy-waiting loop
__NOP(); // No operation to prevent compiler optimization
}
}
// 中断服务程序中更新计数值
void TIMx_IRQHandler(void) {
if (__HAL_TIM_GET_FLAG(&htimx, TIM_FLAG_UPDATE) != RESET) {
__HAL_TIM_CLEAR_IT(&htimx, TIM_IT_UPDATE);
timer++;
}
}
```
此代码展示了如何通过增加全局变量 `timer` 来终止繁忙等待循环[^1]。
#### 利用定时器实现微秒级延时
为了获得更精准的时间延迟,推荐使用硬件定时器如TIM5。当APB1总线频率设定为84 MHz时,预分频寄存器(PSC)设为83可得到1 μs 的滴答间隔:
```c
#define APB1_CLOCK_HZ 84000000UL
#define PRESCALER 83 /* PSC=PRESCALER */
#define COUNTER_PERIOD_US 65535U /* ARR */
static void tim_init_us_delay(TIM_HandleTypeDef *htim) {
htim->Instance = TIM5;
htim->Init.Prescaler = PRESCALER;
htim->Init.CounterMode = TIM_COUNTERMODE_UP;
htim->Init.Period = COUNTER_PERIOD_US;
htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(htim); // 初始化定时器
HAL_TIM_Base_Start(htim); // 启动定时器
}
uint32_t us_to_ticks(uint32_t microseconds) {
return ((microseconds * (APB1_CLOCK_HZ / (PRESCALER + 1))) / 1000000L);
}
void delay_us(uint32_t us) {
__IO uint32_t counter_start = __HAL_TIM_GET_COUNTER(&htim5);
while ((__HAL_TIM_GET_COUNTER(&htim5) - counter_start) < us_to_ticks(us));
}
```
上述代码片段说明了如何初始化并利用定时器产生μs级别的延时[^2].
#### SysTick 定时器实现延时
SysTick 是 Cortex-M 内核自带的一个倒计数定时器,适合用来做短时间内的软件延时操作:
```c
static uint32_t fac_us;
void systick_init(void) {
SystemCoreClockUpdate();
fac_us = SystemCoreClock / 1000000ul; // 计算每微秒所需滴答次数
SysTick_Config(SystemCoreClock / 1000u); // 配置Systick中断每毫秒触发一次
}
void delay_systick_us(uint32_t us) {
uint32_t ticks = us * fac_us;
uint32_t start = SysTick->VAL;
do {
if (start >= SysTick->VAL) break;
} while (((start - SysTick->VAL) + ticks) > SysTick->LOAD);
}
```
这段代码解释了怎样配置SysTick定时器以及编写相应的微秒级别延时子程序[^3].
阅读全文
相关推荐


















