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

物联沃分享整理
物联沃-IOTWORD物联网 » STM32中delay函数的实现详解

发表回复