qq_62513284 2023-03-16 18:53 采纳率: 88%
浏览 47
已结题

ESP-IDF写esp32延时函数错误

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

#include <stdio.h>
#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);
    }
}

不知道错哪了?

  • 写回答

3条回答 默认 最新

  • 追cium 2023-03-16 19:31
    关注

    参考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的大小关系,我们还考虑了计时器溢出的情况。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月24日
  • 已采纳回答 3月16日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 CARSIM前车变道设置
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败