STM32中delay函数的实现详解
在STM32单片机中,延时函数的实现有多种方法,常见的包括普通延时法和使用SysTick定时器的方法。以下是几种常用的实现方式:
1. 普通延时法
这种方法通过简单的循环来实现延时,代码相对简单,但精度较低。
1.1 微秒级延时
void delay_us(uint16_t time) {
uint16_t i = 0;
while (time--) {
i = 10; // 根据具体的系统时钟频率调整
while (i--);
}
}
1.2 毫秒级延时
void delay_ms(uint16_t time) {
uint16_t i = 0;
while (time--) {
i = 12000; // 根据具体的系统时钟频率调整
while (i--);
}
}
2. 使用SysTick定时器
SysTick定时器是Cortex-M内核中的一个24位倒计数定时器,可以用于精确的延时。
2.1 初始化SysTick定时器
void SysTick_Init(void) {
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // 选择时钟源
fac_us = SystemCoreClock / 8 / 1000000; // 计算1微秒的计数值
fac_ms = fac_us * 1000; // 计算1毫秒的计数值
}
2.2 微秒级延时
void delay_us(uint32_t nus) {
uint32_t temp;
SysTick->LOAD = fac_us * nus; // 设置重装载值
SysTick->VAL = 0x00; // 清空计数器
SysTick->CTRL = 0x01; // 启动定时器
do {
temp = SysTick->CTRL; // 读取当前倒计数值
} while ((temp & 0x01) && (!(temp & (1 << 16)))); // 等待时间到达
SysTick->CTRL = 0x00; // 关闭定时器
SysTick->VAL = 0x00; // 清空计数器
}
2.3 毫秒级延时
void delay_ms(uint16_t nms) {
uint32_t temp;
SysTick->LOAD = fac_ms * nms; // 设置重装载值
SysTick->VAL = 0x00; // 清空计数器
SysTick->CTRL = 0x01; // 启动定时器
do {
temp = SysTick->CTRL; // 读取当前倒计数值
} while ((temp & 0x01) && (!(temp & (1 << 16)))); // 等待时间到达
SysTick->CTRL = 0x00; // 关闭定时器
SysTick->VAL = 0x00; // 清空计数器
}
作者:qq_45880204