ESP32S3-Cam实践(MPU6050姿态解算)

0.参考

        2_小学生都能搞定的MPU6050DMP库向STM32HAL库的移植

        详解:MPU6050官方DMP的移植和使用

        stm32f103 MPU6050利用DMP进行姿态解算(硬件iic,hal库)

        陀螺仪mpu6050的调试与dmp库的移植经历

1.挂载MPU6050芯片

        以ESP-IDF v5.5.0的Basic I2C Master Example为基础进行修改。

改动1:Example中使用的SDA和SDL引脚改为自己的硬件连接。

改动2:配置寄存器,完成对MPU6050初始化,使其开始工作。

    ESP_ERROR_CHECK(mpu6050_register_write_byte(dev_handle, MPU6050_PWR_MGMT_1_REG_ADDR, 1 << MPU6050_RESET_BIT));
    vTaskDelay(100 / portTICK_PERIOD_MS);
    ESP_ERROR_CHECK(mpu6050_register_write_byte(dev_handle, MPU6050_PWR_MGMT_1_REG_ADDR, 0 << MPU6050_RESET_BIT));
    ESP_ERROR_CHECK(mpu6050_register_write_byte(dev_handle, MPU6050_GYRO_CONFIG_REG_ADDR, 0x18));
    ESP_ERROR_CHECK(mpu6050_register_write_byte(dev_handle, MPU6050_ACCEL_CONFIG_REG_ADDR, 0x00));
    ESP_ERROR_CHECK(mpu6050_register_write_byte(dev_handle, MPU6050_INT_ENABLE_REG_ADDR, interrupt_enable));
    ESP_ERROR_CHECK(mpu6050_register_write_byte(dev_handle, MPU6050_SAMPLE_RATE_DIVIDER_REG_ADDR, sample_rate_divider));
    ESP_ERROR_CHECK(mpu6050_register_write_byte(dev_handle, MPU6050_DLPF_CFG_REG_ADDR, dlpf));
    ESP_ERROR_CHECK(mpu6050_register_write_byte(dev_handle, MPU6050_PWR_MGMT_1_REG_ADDR, 0x01));
    ESP_ERROR_CHECK(mpu6050_register_write_byte(dev_handle, MPU6050_PWR_MGMT_2_REG_ADDR, 0x00));

改动3:增加持续读取寄存器数据并打印显示的代码逻辑

    /* Read the MPU6050 WHO_AM_I register, on power up the register should have the value 0x68 */
    ESP_ERROR_CHECK(mpu6050_register_read(dev_handle, MPU6050_WHO_AM_I_REG_ADDR, whoami, 1));
    ESP_LOGI(TAG, "WHO_AM_I = %X", whoami[0]);

///////////////////////////////////////////////////////////
    /*
        持续读取寄存器数据并打印显示
    */
    while (whoami[0] == 0x68)
    {
        vTaskDelay(200 / portTICK_PERIOD_MS);
        ESP_ERROR_CHECK(mpu6050_register_read(dev_handle, MPU6050_ACCEL_XOUT_H_REG_ADDR, measurements_buffer+0, 14));
        //ESP_LOGI(TAG, "俯仰Pitch(-90/+90) 方向Yaw(-180/+180) 滚转Roll(-180/+180)");
        ESP_LOGI(TAG, "Temperature Register Value(%d)",*temperature_ptr);
        ESP_LOGI(TAG, "Gyro Register Value(%d,%d,%d)", *gyro_x_ptr, *gyro_y_ptr, *gyro_z_ptr);
        ESP_LOGI(TAG, "Accel Register Value(%d,%d,%d)", *accel_x_ptr, *accel_y_ptr, *accel_z_ptr);
    }

监视器输出

I (6778) example: Temperature Register Value(7408)
I (6778) example: Gyro Register Value(1792,-6145,-2049)
I (6778) example: Accel Register Value(2303,-19966,30785)
I (6978) example: Temperature Register Value(6128)
I (6978) example: Gyro Register Value(1536,-6145,-2049)
I (6978) example: Accel Register Value(7423,-24062,15937)
I (7178) example: Temperature Register Value(6640)
I (7178) example: Gyro Register Value(1792,-6401,-1793)
I (7178) example: Accel Register Value(4351,-24062,29249)

2.姿态解算

        使用MPU6050的DMP进行姿态解算。下载DMP库,获取的文件如下图。将DMP库源码文件并入工程。

主程序改动1:将stm32f103 MPU6050利用DMP进行姿态解算(硬件iic,hal库)中的MPU5060.c.h文件整合到main中。代码无改动。

主程序改动2:主程序中持续调用mpu6050_dmp_get_gyroscope函数读取姿态并打印显示。

    do {
        result = mpu6050_dmp_init();
    }while(result);

    while(1) {
        mpu6050_dmp_get_attitude(&pitch, &roll, &yaw);
        ESP_LOGI(TAG, "Pitch:%.2f  Yaw:%.2f  Roll:%.2f", pitch, yaw, roll);

        vTaskDelay(200 / portTICK_PERIOD_MS);
    }

主程序改动3:将DMP的源文件和头文件加入到CMakeList.txt中。

监视器输出

        DMP库源码并入工程后在不改动的情况下会出现以下的编译error。分析并解决这些error来完成DMP库的移植。

inv_mpu_dmp_motion_driver.c: In function 'dmp_set_accel_bias':
inv_mpu_dmp_motion_driver.c:75:2: error: #error Gyro driver is missing the system layer implementations.
   75 | #error  Gyro driver is missing the system layer implementations.

inv_mpu_dmp_motion_driver.c: In function 'dmp_read_fifo':
inv_mpu_dmp_motion_driver.c:638:5: error: implicit declaration of function '__no_operation' [-Wimplicit-function-declaration]
  638 |     __no_operation();

inv_mpu_dmp_motion_driver.c: In function 'dmp_read_fifo':
inv_mpu_dmp_motion_driver.c:1342:5: error: implicit declaration of function 'get_ms'; did you mean 'gets'? [-Wimplicit-function-declaration]
 1342 |     get_ms(timestamp);

inv_mpu.c:119:2: error: #error Gyro driver is missing the system layer implementations.
  119 | #error  Gyro driver is missing the system layer implementations.
inv_mpu.c:123:2: error: #error Which gyro are you using? Define MPUxxxx in your compiler options.
  123 | #error  Which gyro are you using? Define MPUxxxx in your compiler options.
inv_mpu.c:379:1: error: empty enum is invalid  
  379 | };
inv_mpu.c:642:9: error: 'st' undeclared (first use in this function)
inv_mpu.c:678:13: error: implicit declaration of function 'i2c_read' [-Wimplicit-function-declaration]
  678 |         if (i2c_read(st.hw->addr, ii, 1, &data))
inv_mpu.c:680:9: error: implicit declaration of function 'log_i' [-Wimplicit-function-declaration]
  680 |         log_i("%#5x: %#5x\r\n", ii, data);
inv_mpu.c:722:5: error: implicit declaration of function 'delay_ms' [-Wimplicit-function-declaration]
  722 |     delay_ms(100);
inv_mpu.c:776:9: error: implicit declaration of function 'reg_int_cb' [-Wimplicit-function-declaration]
  776 |         reg_int_cb(int_param);
inv_mpu.c:905:9: error: implicit declaration of function 'get_ms'; did you mean 'gets'? [-Wimplicit-function-declaration]
  905 |         get_ms(timestamp);
inv_mpu.c:2114:19: error: 'test' undeclared (first use in this function); did you mean 'test_s'?
 2114 |         data[0] = test.reg_accel_fsr;
inv_mpu.c:2860:22: error: implicit declaration of function 'min'; did you mean 'fmin'? [-Wimplicit-function-declaration]
 2860 |         this_write = min(LOAD_CHUNK, length - ii);
inv_mpu.c:699:1: error: control reaches end of non-void function [-Werror=return-type]
inv_mpu.c:1439:1: error: control reaches end of non-void function [-Werror=return-type]

DMP库移植改动1:inv_mpu.h 增加适配ESP32S3平台的结构。

#define  EMPL_TARGET_ESP32S3  1
struct int_param_s {
#elif defined EMPL_TARGET_ESP32S3
    void *arg;
}

DMP库移植改动2:inv_mpu.c 增加适配ESP32S3平台的接口实现。

/* The following functions must be defined for this platform:
 * i2c_write(unsigned char slave_addr, unsigned char reg_addr,
 *      unsigned char length, unsigned char const *data)
 * i2c_read(unsigned char slave_addr, unsigned char reg_addr,
 *      unsigned char length, unsigned char *data)
 * delay_ms(unsigned long num_ms)
 * get_ms(unsigned long *count)
 */
#elif defined EMPL_TARGET_ESP32S3
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "driver/i2c_master.h"
extern i2c_master_dev_handle_t dev_handle;
int esp32s3_i2c_write(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char const *data)
{
}
int esp32s3_i2c_read(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char *data)
{
}
void esp32s3_delay_ms(unsigned long num_ms)
{
}
void esp32s3_get_ms(unsigned long *count)
{
}
#define i2c_write  esp32s3_i2c_write
#define i2c_read   esp32s3_i2c_read
#define delay_ms   esp32s3_delay_ms
#define get_ms     esp32s3_get_ms
#define MPU6050

监视器输出

inv_mpu.c: In function 'mpu_init':
inv_mpu.c:809:9: error: implicit declaration of function 'reg_int_cb' [-Wimplicit-function-declaration]
  809 |         reg_int_cb(int_param);

DMP库移植改动3:屏蔽掉mpu_init中的四行。

DMP库移植改动4:1.inv_mpu_dmp_motion_dirver.c中35-76行的编译控制宏与inv_mpu.c中定义的相同,没有用,删除掉;2.注释__no_operation();添加__asm__ __volatile__("nop");;3.文件头部添加extern void esp32s3_get_ms(unsigned long *count);;4.dmp_read_fifo函数中调用的get_ms改成esp32s3_get_ms;

至此,Build Successfully,运行能不能成功,不知道。

果然没有那么顺利......mpu_load_firmware()失败,返回值-2。挂载MPU6050驱动芯片时验证了I2C的读写接口都是没问题的,问题出在哪里呢?

for (ii = 0; ii < length; ii += this_write) {}
//这个循环中,mpu_write_mem 和 mpu_read_mem都没有报错。比较写入内容和读取内容时出现不一致。
//为了让代码继续执行,注释掉这部分比较的代码,先看程序能不能正常运行(即默认I2C写入成功)

继续不顺利。。。mpu_run_self_test()失败,返回值0x07。查看函数代码

    accel_result = accel_self_test(accel, accel_st);
    gyro_result = gyro_self_test(gyro, gyro_st);

    result = 0;
    if (!gyro_result)
        result |= 0x01;
    if (!accel_result)
        result |= 0x02;

#ifdef AK89xx_SECONDARY
    compass_result = compass_self_test();
    if (!compass_result)
        result |= 0x04;
#else
        result |= 0x04;//源码中通过条件编译扩展了支持的芯片,为支持MPU6050增加了标记。所以自检成功的标志应该是0x07

DMP库移植改动5:将自检通过的标志改为0x7

    result = mpu_run_self_test(gyro, accel);
    ESP_LOGI(TAG, "mpu_run_self_test result:%d", result);
    if (result == 0x7) {
        /* Test passed. We can trust the gyro data here, so let's push it down
         * to the DMP.
         */
    }

监视器输出,继续不顺利。。。感觉DMP没干活啊。难道真的是固件写入出错了?

I (261) main_task: Started on CPU0
I (281) main_task: Calling app_main()
I (281) example: I2C initialized successfully
I (1841) example: mpu6050_dmp_init result:0
I (1841) example: Pitch:0.00  Yaw:0.00  Roll:0.00
I (2041) example: Pitch:0.00  Yaw:0.00  Roll:0.00
I (2241) example: Pitch:0.00  Yaw:0.00  Roll:0.00

DMP库移植改动6:检查了esp32s3_i2c_write。把mpu_load_firmware中注释的代码恢复。

监视器输出,GoodGood

I (75941) example: Pitch:-0.556098  Yaw:-23.384480  Roll:0.820657
I (76091) example: Pitch:-0.556098  Yaw:-23.384480  Roll:0.820657
I (76191) example: Pitch:-0.573516  Yaw:-23.378716  Roll:0.785903
[977/1082] Building CXX object esp-idf/OLED/CMakeFiles/__idf_OLED.dir/OLED.C.obj D:/ESP32/1/components/OLED/OLED.C: In function &#39;void I2C_Init()&#39;: D:/ESP32/1/components/OLED/OLED.C:103:5: warning: missing initializer for member &#39;i2c_master_bus_config_t::intr_priority&#39; [-Wmissing-field-initializers] 103 | }; | ^ D:/ESP32/1/components/OLED/OLED.C:103:5: warning: missing initializer for member &#39;i2c_master_bus_config_t::trans_queue_depth&#39; [-Wmissing-field-initializers] D:/ESP32/1/components/OLED/OLED.C:103:5: warning: missing initializer for member &#39;i2c_master_bus_config_t::<unnamed struct>::allow_pd&#39; [-Wmissing-field-initializers] D:/ESP32/1/components/OLED/OLED.C:115:5: warning: missing initializer for member &#39;i2c_device_config_t::scl_wait_us&#39; [-Wmissing-field-initializers] 115 | }; | ^ [1074/1082] Performing configure step for &#39;bootloader&#39; -- Found Git: C:/esp32/Espressif/tools/tools/idf-git/2.39.2/cmd/git.exe (found version "2.39.2.windows.1") -- Minimal build - OFF -- The C compiler identification is GNU 14.2.0 -- The CXX compiler identification is GNU 14.2.0 -- The ASM compiler identification is GNU -- Found assembler: C:/esp32/Espressif/tools/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc.exe -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: C:/esp32/Espressif/tools/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc.exe - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: C:/esp32/Espressif/tools/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++.exe - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Building ESP-IDF components for target esp32s3 -- Project sdkconfig file D:/ESP32/1/sdkconfig -- Compiler supported targets: xtensa-esp-elf -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld -- Bootloader project name: "bootloader" version: 1 -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld -- Adding linker script C:/esp32/v5.5.1/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.rom.ld -- Components: bootloader bootloader_support efuse esp_app_format esp_bootloader_format esp_common esp_hw_support esp_rom esp_security esp_system esptool_py freertos hal log main micro-ecc newlib partition_table soc spi_flash xtensa -- Component paths: C:/esp32/v5.5.1/esp-idf/components/bootloader C:/esp32/v5.5.1/esp-idf/components/bootloader_support C:/esp32/v5.5.1/esp-idf/components/efuse C:/esp32/v5.5.1/esp-idf/components/esp_app_format C:/esp32/v5.5.1/esp-idf/components/esp_bootloader_format C:/esp32/v5.5.1/esp-idf/components/esp_common C:/esp32/v5.5.1/esp-idf/components/esp_hw_support C:/esp32/v5.5.1/esp-idf/components/esp_rom C:/esp32/v5.5.1/esp-idf/components/esp_security C:/esp32/v5.5.1/esp-idf/components/esp_system C:/esp32/v5.5.1/esp-idf/components/esptool_py C:/esp32/v5.5.1/esp-idf/components/freertos C:/esp32/v5.5.1/esp-idf/components/hal C:/esp32/v5.5.1/esp-idf/components/log C:/esp32/v5.5.1/esp-idf/components/bootloader/subproject/main C:/esp32/v5.5.1/esp-idf/components/bootloader/subproject/components/micro-ecc C:/esp32/v5.5.1/esp-idf/components/newlib C:/esp32/v5.5.1/esp-idf/components/partition_table C:/esp32/v5.5.1/esp-idf/components/soc C:/esp32/v5.5.1/esp-idf/components/spi_flash C:/esp32/v5.5.1/esp-idf/components/xtensa -- Configuring done (18.4s) -- Generating done (0.3s) -- Build files have been written to: D:/ESP32/1/build/bootloader [1075/1082] Performing build step for &#39;bootloader&#39; [1/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/util.c.obj [2/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj [3/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj [4/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj [5/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_lock.c.obj [6/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj [7/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj [8/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj [9/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj [10/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj [11/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_timestamp.c.obj [12/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj [13/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj [14/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj [15/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj [16/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj [17/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj [18/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj [19/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj [20/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj [21/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj [22/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj [23/123] Linking C static library esp-idf\log\liblog.a [24/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj [25/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj [26/123] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj [27/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj [28/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj [29/123] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj [30/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj [31/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj [32/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj [33/123] Linking C static library esp-idf\esp_rom\libesp_rom.a [34/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj [35/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj [36/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj [37/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj [38/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj [39/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj [40/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj [41/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj [42/123] Linking C static library esp-idf\esp_common\libesp_common.a [43/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj [44/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj [45/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj [46/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj [47/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj [48/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj [49/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj [50/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj [51/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj [52/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj [53/123] Linking C static library esp-idf\esp_hw_support\libesp_hw_support.a [54/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj [55/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj [56/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_loader.c.obj [57/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj [58/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj [59/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj [60/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console_loader.c.obj [61/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_soc.c.obj [62/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj [63/123] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj [64/123] Linking C static library esp-idf\esp_system\libesp_system.a [65/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj [66/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console.c.obj [67/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_panic.c.obj [68/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj [69/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj [70/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj [71/123] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj [72/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj [73/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj [74/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj [75/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj [76/123] Linking C static library esp-idf\efuse\libefuse.a [77/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_init.c.obj [78/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj [79/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj [80/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj [81/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj [82/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj [83/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj [84/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj [85/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj [86/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj [87/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_esp32s3.c.obj [88/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj [89/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj [90/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj [91/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj [92/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj [93/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj [94/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj [95/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj [96/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj [97/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj [98/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj [99/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj [100/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj [101/123] Generating project_elf_src_esp32s3.c [102/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj [103/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj [104/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj [105/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj [106/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj [107/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj [108/123] Building C object CMakeFiles/bootloader.elf.dir/project_elf_src_esp32s3.c.obj [109/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj [110/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj [111/123] Linking C static library esp-idf\bootloader_support\libbootloader_support.a [112/123] Building C object esp-idf/micro-ecc/CMakeFiles/__idf_micro-ecc.dir/uECC_verify_antifault.c.obj [113/123] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/bootloader_start.c.obj [114/123] Linking C static library esp-idf\esp_bootloader_format\libesp_bootloader_format.a [115/123] Linking C static library esp-idf\spi_flash\libspi_flash.a [116/123] Linking C static library esp-idf\hal\libhal.a [117/123] Linking C static library esp-idf\micro-ecc\libmicro-ecc.a [118/123] Linking C static library esp-idf\soc\libsoc.a [119/123] Linking C static library esp-idf\xtensa\libxtensa.a [120/123] Linking C static library esp-idf\main\libmain.a [121/123] Linking C executable bootloader.elf [122/123] Generating binary image from built executable esptool.py v4.10.0 Creating esp32s3 image... Merged 2 ELF sections Successfully created esp32s3 image. Generated D:/ESP32/1/build/bootloader/bootloader.bin [123/123] C:\WINDOWS\system32\cmd.exe /C "cd /D D:\ESP32\1\build\bootloader\esp-idf\esptool_py && c:\esp32\Espressif\tools\python_env\idf5.5_py3.11_env\Scripts\python.exe C:/esp32/v5.5.1/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 D:/ESP32/1/build/bootloader/bootloader.bin" Bootloader binary size 0x5240 bytes. 0x2dc0 bytes (36%) free. [1080/1082] Linking CXX executable 1.elf FAILED: 1.elf C:\WINDOWS\system32\cmd.exe /C "cd . && C:\esp32\Espressif\tools\tools\xtensa-esp-elf\esp-14.2.0_20241119\xtensa-esp-elf\bin\xtensa-esp32s3-elf-g++.exe -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -fno-builtin-stpcpy -fno-builtin-strncpy -nostartfiles -Wl,--cref -Wl,--defsym=IDF_TARGET_ESP32S3=0 -Wl,--Map=D:/ESP32/1/build/1.map -Wl,--no-warn-rwx-segments -Wl,--orphan-handling=warn -fno-rtti -fno-lto -Wl,--gc-sections -Wl,--warn-common -T esp32s3.peripherals.ld -T esp32s3.rom.ld -T esp32s3.rom.api.ld -T esp32s3.rom.bt_funcs.ld -T esp32s3.rom.libgcc.ld -T esp32s3.rom.wdt.ld -T esp32s3.rom.version.ld -T esp32s3.rom.ble_master.ld -T esp32s3.rom.ble_50.ld -T esp32s3.rom.ble_smp.ld -T esp32s3.rom.ble_dtm.ld -T esp32s3.rom.ble_test.ld -T esp32s3.rom.ble_scan.ld -T esp32s3.rom.libc.ld -T esp32s3.rom.newlib.ld -T memory.ld -T sections.ld @CMakeFiles\1.elf.rsp -o 1.elf && cd ." C:/esp32/Espressif/tools/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/main/libmain.a(main.c.obj):(.literal.app_main+0x0): undefined reference to `OLED_Init&#39; C:/esp32/Espressif/tools/tools/xtensa-esp-elf/esp-14.2.0_20241119/xtensa-esp-elf/bin/../lib/gcc/xtensa-esp-elf/14.2.0/../../../../xtensa-esp-elf/bin/ld.exe: esp-idf/main/libmain.a(main.c.obj): in function `app_main&#39;: D:/ESP32/1/main/main.c:13:(.text.app_main+0x8): undefined reference to `OLED_Init&#39; collect2.exe: error: ld returned 1 exit status ninja: build stopped: subcommand failed.
最新发布
11-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值