stm32f103怎么编程延时函数

时间:2025-01-28 21:49:36 网络游戏

在STM32F103上编程延时函数,通常使用系统滴答定时器(SysTick)来实现。SysTick是一个24位倒计时器,它以内核时钟频率工作,可以用来产生精确的延时。以下是使用SysTick实现延时函数的步骤:

初始化SysTick定时器

配置SysTick的时钟源。通常选择系统时钟(HCLK)并除以一个因子,以获得所需的延时精度。例如,选择HCLK/8可以得到大约1微秒的时钟周期。

设置SysTick的重载值(LOAD)。重载值应该是期望的延时时间乘以一个因子,这个因子取决于你选择的时钟源和预分频器。

初始化SysTick的当前值(VAL)为0。

启用SysTick计数器。

编写延时函数

微秒级延时:通过循环检查SysTick的计数器是否达到重载值来实现微秒级延时。

毫秒级延时:通过循环调用微秒级延时函数并递减毫秒数来实现毫秒级延时。

秒级延时:通过循环调用毫秒级延时函数并递减秒数来实现秒级延时。

```c

ifndef __DELAY_H__

define __DELAY_H__

include "stm32f10x.h"

void Delay_init(void);

void Delay_us(uint32_t us);

void Delay_ms(uint32_t ms);

endif // __DELAY_H__

include "delay.h"

static int8_t fac_us = 0; // us延时倍乘数

static int16_t fac_ms = 0; // ms延时倍乘数

void Delay_init(void) {

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // 选择外部时钟 HCLK/8

fac_us = SystemCoreClock / 8000000; // 为系统时钟的1/8

fac_ms = (int16_t)fac_us * 1000; // 每个ms需要的systick时钟数

}

void Delay_us(uint32_t us) {

uint32_t temp;

SysTick->LOAD = us * fac_us; // 设置重载值

SysTick->VAL = 0x00; // 清空当前计数值

SysTick->CTRL = 0x00000005; // 设置时钟源为HCLK,启动定时器

while (!(SysTick->CTRL & 0x00010000)); // 等待计数到0

SysTick->CTRL = 0x00000004; // 关闭定时器

}

void Delay_ms(uint32_t ms) {

while (ms--) {

Delay_us(1000); // 将毫秒转换为微秒并调用微秒级延时函数

}

}

```

在使用上述代码时,请确保在主函数或其他适当的地方调用`Delay_init()`来初始化SysTick定时器。这样,你就可以使用`Delay_us()`和`Delay_ms()`函数来实现精确的延时了。

建议

在实际应用中,为了提高延时的精确度,可以考虑使用更高精度的时钟源和更精确的初值和重载值计算。

如果需要更复杂的延时控制,可以考虑使用定时器中断或事件标志来实现更灵活的延时功能。