在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()`函数来实现精确的延时了。
建议:
在实际应用中,为了提高延时的精确度,可以考虑使用更高精度的时钟源和更精确的初值和重载值计算。
如果需要更复杂的延时控制,可以考虑使用定时器中断或事件标志来实现更灵活的延时功能。