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 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)