ESP-IDF写esp32延时函数错误

esp32用定时器写一个延时函数,运行不成功

#include 
#include "driver/gpio.h"
#include "driver/timer.h"

void time_init()
{
    timer_config_t tiConfig = {
        .alarm_en = TIMER_ALARM_DIS,
        .counter_en = TIMER_PAUSE,
        .counter_dir = TIMER_COUNT_DOWN,
        .auto_reload = TIMER_AUTORELOAD_EN,
        .divider = 80,
    };
    timer_init(TIMER_GROUP_0, TIMER_0, &tiConfig);
}

void delay(uint64_t t)
{
    uint64_t n;
    uint64_t *timer_val = &n;
    timer_set_counter_value(TIMER_GROUP_0, TIMER_0, t);
    timer_start(TIMER_GROUP_0, TIMER_0);
    do
    {
        timer_get_counter_value(TIMER_GROUP_0, TIMER_0, timer_val);
    } while (n > 0);
    timer_pause(TIMER_GROUP_0, TIMER_0);
}

void app_main(void)
{
    time_init();
    gpio_set_direction(2, 2);
    while (1)
    {
        gpio_set_level(2, 0);
        delay(1000000);
        gpio_set_level(2, 1);
        delay(1000000);
    }
}

不知道错哪了?

参考GPT和自己的思路:

根据代码看,您的延时函数似乎存在以下几个问题:

  1. 没有对变量n进行初始化,导致程序无法正常工作;

  2. 在do-while循环中使用了timer_get_counter_value()函数获取计时器的当前值,但在第19行,n的初始值并没有被赋值,导致第25行的n > 0始终成立,do-while循环会一直执行;

  3. 您的延时函数并没有考虑到计时器溢出的情况,当计时器达到最大值时,程序会出现问题。

建议您可以按照以下方式修改函数:

void delay(uint64_t t)
{
    uint64_t start_time, elapsed_time;
    timer_get_counter_value(TIMER_GROUP_0, TIMER_0, &start_time);
    do
    {
        uint64_t now;
        timer_get_counter_value(TIMER_GROUP_0, TIMER_0, &now);
        elapsed_time = (now >= start_time) ? (now - start_time) : (UINT64_MAX - start_time + now);
    } while (elapsed_time < t);
}

在修改后的代码中,我们使用了start_time变量记录了延时开始时的计时器计数值,在do-while循环中,反复获取当前计时器的值,计算出已经过去了多长时间,直到达到目标时间为止。通过使用UINT64_MAX和检测start_time和now的大小关系,我们还考虑了计时器溢出的情况。

delay修改大一点看看呢