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和自己的思路:
根据代码看,您的延时函数似乎存在以下几个问题:
没有对变量n进行初始化,导致程序无法正常工作;
在do-while循环中使用了timer_get_counter_value()函数获取计时器的当前值,但在第19行,n的初始值并没有被赋值,导致第25行的n > 0始终成立,do-while循环会一直执行;
您的延时函数并没有考虑到计时器溢出的情况,当计时器达到最大值时,程序会出现问题。
建议您可以按照以下方式修改函数:
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修改大一点看看呢