乐鑫技术交流
直播中

杨海清

7年用户 1718经验值
私信 关注
[问答]

如何使用定时器写一个延时函数?

不用中断,就是单纯一个用作延时函数,写了一个下午也没搞明白,可能我理解出错了

void delay_us(int us)
{
    timer_config_t delay;

    timer_set_counter_value(0,0,us);//us延时时间

    delay.alarm_en=0;//不使能报警
    delay.auto_reload=1;//不自动重新加载
    delay.clk_src=0;//默认APB
    delay.counter_dir=1;//向上计数
   
    delay.divider=80;//分频1 000 000hz
//   delay.intr_type=0;//不报警不中断
    delay.counter_en=1;//使能定时器

    timer_init(0,0,&delay);//0组0定时器初始化
};

按照STM32的写法应该还有一个更新状态位,等待定时器计时更新完成就是延时了,esp32是哪个呢?求解答
                                                                                                                                                                        

回帖(1)

李斌

2024-6-14 16:17:57
根据您的描述,您想要使用定时器实现一个延时函数,而不使用中断。以下是一个使用定时器实现延时的示例代码,这里以ESP32为例:

```c
#include "driver/timer.h"
#include "esp_intr_alloc.h"

#define US_TO_TICKS(us, ticks_per_us) ((us) * (ticks_per_us))
#define TIMER_DIVIDER 80 // 根据实际硬件配置调整分频值

// 初始化定时器
void timer_init() {
    timer_config_t config;
    config.divider = TIMER_DIVIDER;
    config.counter_dir = TIMER_COUNT_UP;
    config.auto_reload = false;
    config.intr_type = TIMER_INTR_LEVEL;
    config.counter_en = false;
    timer_init(0, &config); // 使用定时器0
    timer_pause(0);
}

// 延时函数,单位为微秒
void delay_us(int us) {
    static int ticks_per_us = 0;
    if (ticks_per_us == 0) {
        ticks_per_us = (TIMER_BASE_CLK / TIMER_DIVIDER) / 1000000; // 计算每微秒的计数值
    }

    int ticks = US_TO_TICKS(us, ticks_per_us);
    timer_set_counter_value(0, 0); // 设置定时器计数值为0
    timer_start(0); // 启动定时器
    while (timer_get_counter_value(0) < ticks) {
        // 等待计数器达到指定的计数值
    }
    timer_pause(0); // 暂停定时器
}

void app_main() {
    timer_init(); // 初始化定时器

    while (1) {
        delay_us(1000); // 延时1000微秒
        // 在这里执行其他任务
    }
}
```

这段代码首先初始化定时器,设置分频器、计数方向、自动重载等参数。然后定义了一个`delay_us`函数,该函数接受一个整数参数(微秒),并根据这个参数计算出需要等待的计数值。在`delay_us`函数中,我们设置定时器的计数值为0,启动定时器,并在计数器达到指定的计数值之前等待。最后,暂停定时器以节省资源。

请注意,这个示例代码是针对ESP32的,如果您使用的是其他硬件平台,可能需要根据实际硬件配置进行相应的调整。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分