从零玩转CanMV-K230(9)-Timer、RTC、ADC、WDT、File


前言

本章介绍K230常用外设的使用方法,相关内容的详细介绍可以参考K210的教程,这里主要展示K230的使用代码


一、Timer

定时器(Timer)的作用在于生成精确的计时,当达到预设的时间点时,提醒我们进行特定的操作。
Timer类位于machine模块下,因此在使用该类时,需要从machine模块中进行引用。

构造函数

timer = Timer(index, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)

【参数】

index: Timer号,取值:[-1,5],-1代表软件定时器

mode: 运行模式,单次或周期,可选参数

freq: Timer运行频率,支持浮点,单位Hz,可选参数,优先级高于period

period: Timer运行周期,单位ms,可选参数

callback: 超时回调函数,必须设置,要带一个参数

arg: 超时回调函数参数,可选参数

注意: [0-5]硬件Timer暂不可用

初始化

Timer.init(mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)

初始化定时器参数

【参数】

mode: 运行模式,单次或周期,可选参数

freq: Timer运行频率,支持浮点,单位Hz,可选参数,优先级高于period

period: Timer运行周期,单位ms,可选参数

callback: 超时回调函数,必须设置,要带一个参数

arg: 超时回调函数参数,可选参数

【返回值】

无

销毁函数

Timer.deinit()

释放Timer资源

【参数】

无

【返回值】

无

示例代码

from machine import Timer
import time

def fun(i):
   print("Timer callback")

#使用软件定时器,编号-1
tim = Timer(-1)
tim.init(mode=Timer.PERIODIC, period=100, callback=fun) #周期为100ms

while True:

    time.sleep(0.01) #避免CPU满跑

二、RTC

RTC全称是Real Time Clock,可以用来进行精准的时间计时,我们现在常用的万年历或数字时钟常常就是使用类似的芯片DS1302等等实现计时的功能。K230内置一个RTC,但是这块板子上没有额外的电池,所以要想让RTC一直工作的话,需要板子一直进行上电。

RTC类位于machine模块下,因此我们在使用这个类的时候要从machine模块中进行引用。

RTC的主要功能就是获取实时的时间,当然也可以使用函数进行重新设定时间。

构造函数

rtc = RTC()

【参数】

无

init

rtc.init(year,mon,day,hour,min,sec,microsec)

【参数】

year: 年

mon: 月

day: 日

hour: 时

min: 分

sec: 秒

microsec: 微秒

【返回值】

无

datetime

print(rtc.datetime())

【参数】

无

【返回值】

year: 年

mon: 月

day: 日

hour: 时

min: 分

sec: 秒

microsec: 微秒

示例代码

代码如下(示例):

from machine import RTC
import time

rtc = RTC()

if rtc.datetime()[1] != 10:
    rtc.datetime((2024, 12, 30, 0, 0, 0, 0, 0))

while True:

    print(rtc.datetime())

    time.sleep(1)

三、ADC

物理世界中的大部分的信号都是模拟量,但是随着单片机的发展,越来越多需要数字信号的处理,因此将模拟信号转换成为数字信号就显得尤为重要。

K230内置了一个ADC,其具有6个通道(该开发板引出了四个ADC通道,分别是0-4,其中0和1的量程为0-3.6V,2和3的量程为0-1.8V),采样分辨率为12bit,采样的速率可以达到1MHz。

ADC类位于machine模块下,因此我们在使用这个类的时候要从machine模块中进行引用。

API

adc = ADC(channel)

【参数】

channel: ADC通道号,取值:[0,5]

ADC.read_u16()

获取通道采样值

【参数】

无

【返回值】

返回当前ADC通道采样值,[0-4095]

ADC.read_uv()

获取通道电压值

【参数】

无

【返回值】

返回当前ADC通道电压值,[0-1800000]

示例代码

from machine import ADC
import time

adc = ADC(0)

while True:

    print(adc.read_u16())
    print('%.2f'%(adc.read_uv()/1000000*2), "V")

    time.sleep(1)

四、WDT

看门狗是单片机用来防止软件程序跑飞,从而出现问题的一种内部机制。其本质可以看作是一个定时器,当开启看门狗后,定时器开始运行,在定时器到达设定的重启时间之前要进行喂狗(即重置一下定时器),若超过设定的时间没有进行喂狗,就会通过软件复位的方式,将程序进行复位,从而避免了程序跑飞出现的问题。
K230内部包含两个WDT硬件模块,用于在应用程序崩溃且最终进入不可恢复状态时重启系统。一旦开始,当硬件运行期间没有定期进行喂狗(feed)就会在超时后自动复位。

API

wdt = WDT(id=1, timeout=5)

【参数】

id: WDT号,取值:[0,1],默认1

timeout: 超时值,单位s,默认5

注意: WDT0暂不可用

WDT.feed()

喂狗操作

【参数】

无

【返回值】

无

示例代码

from machine import WDT
import time

wdt = WDT(1,3)

for i in range(3):

    time.sleep(1)
    print(i)

    wdt.feed()

while True:

    time.sleep(0.01)

五、File

在其他的单片机中我们要是想断电后保存一些数据的话,通常会使用EEPROM或者Flash进行数据的存储。在K230中自带一个文件系统,因此我们直接使用K230的文件系统就可以实现数据的存储和获取。

K230进行文件操作的方式和Python的文件操作方式是一样的。K230的文件路径为/sdcard,所创建的文件,直接存储在这个路径下即可。

示例代码

f = open('/sdcard/1.txt', 'w')
f.write('EEWORLD')
f.close()

f = open('/sdcard/1.txt', 'r')
text = f.read()
print(text)
f.close()

总结

本章提供了Timer、RTC、ADC、WDT、File的基本用法,供参考,后面我们开始K230在AI领域的应用例程。

[980/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.6s) -- 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/log/CMakeFiles/__idf_log.dir/src/noos/log_lock.c.obj [5/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj [6/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_timestamp.c.obj [7/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.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_gpio.c.obj [10/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj [11/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj [12/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.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 ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj [15/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj [16/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj [17/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj [18/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.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] Linking C static library esp-idf\log\liblog.a [23/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj [24/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj [25/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj [26/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj [27/123] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.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_fields.c.obj [32/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj [33/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj [34/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj [35/123] Linking C static library esp-idf\esp_rom\libesp_rom.a [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_clk.c.obj [40/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj [41/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.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/secure_boot.c.obj [51/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj [52/123] Linking C static library esp-idf\esp_hw_support\libesp_hw_support.a [53/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj [54/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.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/esp32s3/bootloader_soc.c.obj [58/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj [59/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj [60/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj [61/123] Linking C static library esp-idf\esp_system\libesp_system.a [62/123] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj [63/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console_loader.c.obj [64/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj [65/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console.c.obj [66/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj [67/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj [68/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_panic.c.obj [69/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj [70/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj [71/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj [72/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj [73/123] Linking C static library esp-idf\efuse\libefuse.a [74/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj [75/123] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj [76/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_init.c.obj [77/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj [78/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj [79/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj [80/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj [81/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj [82/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj [83/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj [84/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj [85/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.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/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj [88/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_esp32s3.c.obj [89/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_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/rmt_periph.c.obj [92/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj [93/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj [94/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj [95/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj [96/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj [97/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj [98/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj [99/123] Generating project_elf_src_esp32s3.c [100/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj [101/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj [102/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj [103/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj [104/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj [105/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj [106/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj [107/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj [108/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj [109/123] Building C object CMakeFiles/bootloader.elf.dir/project_elf_src_esp32s3.c.obj [110/123] Linking C static library esp-idf\bootloader_support\libbootloader_support.a [111/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj [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
从你最新的编译日志来看,项目已经**成功通过了源码编译阶段**(`.c/.cpp` 文件已正确编译),但在最后的 **链接阶段失败**,报错如下: --- ### 🔴 链接错误(Linker Error) ```bash undefined reference to `OLED_Init&#39; ``` #### 完整错误信息: ```bash C:/.../ld.exe: esp-idf/main/libmain.a(main.c.obj):(.literal.app_main+0x0): undefined reference to `OLED_Init&#39; C:/.../ld.exe: 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. ``` --- ### ✅ 错误原因分析 虽然你的 `OLED.C` 文件已经被成功编译(说明组件被识别),但函数 `OLED_Init()` **未被链接器找到**,说明: > ❌ 编译成功 ≠ 链接成功。 > 函数定义存在,但链接器找不到其实现。 常见原因包括: | 原因 | 说明 | |------|------| | 1️⃣ `OLED_Init()` 函数未在 `OLED.C` 中实现 | 虽然头文件有声明,但 `.C` 文件中没有实际函数体 | | 2️⃣ `OLED.C` 没有被正确入构建 | 组件未注册或 CMakeLists.txt 配置错误 | | 3️⃣ 头文件与实现文件命名不一致 | 如声明为 `void OLED_Init();` 但实现写成了 `void oled_init()` | | 4️⃣ C++ 编译导致符号名 mangling | 如果是 `.C` 文件且包含 C++ 代码,而主程序以 C 方式调用,可能需要 `extern "C"` | --- ### ✅ 解决方案 #### ✅ 步骤 1:确认 `OLED_Init()` 函数是否正确定义 打开 `components/OLED/OLED.C`,确保有类似以下代码: ```cpp void OLED_Init() { I2C_Init(); // 初始化 OLED 屏幕命令... } ``` > ⚠️ 注意函数名拼写必须完全一致:`OLED_Init`(大小写敏感)! --- #### ✅ 步骤 2:检查 `OLED.h` 是否声明该函数 `components/OLED/OLED.h` 应包含: ```c #ifndef __OLED_H__ #define __OLED_H__ #ifdef __cplusplus extern "C" { #endif void OLED_Init(void); #ifdef __cplusplus } #endif #endif // __OLED_H__ ``` > ✅ 添 `extern "C"` 是为了防止 C++ 名称修饰(mangling)导致链接失败。 --- #### ✅ 步骤 3:确保 `components/OLED/CMakeLists.txt` 正确配置 文件内容应为: ```cmake set(COMPONENT_SRCS "OLED.C") set(COMPONENT_ADD_INCLUDEDIRS ".") register_component() ``` - `.C` 扩展名表示它是 C++ 文件,需由 `g++` 编译。 - `register_component()` 确保组件入构建系统。 --- #### ✅ 步骤 4:主程序中包含正确的头文件路径 在 `main.c` 中: ```c #include "OLED.h" // 推荐小写,避免 Windows/Linux 差异 ``` > ❗ 不要用 `"OLED.H"`,Windows 下可能匹配,但 ESP-IDF 构建系统对大小写敏感。 --- #### ✅ 步骤 5:清理并重新构建 ```bash idf.py clean idf.py build ``` > 避免旧目标文件残留导致问题。 --- ### 💡 补充建议 - 使用统一命名规范:全部使用小写文件名如 `oled.h`, `oled.c`,避免混淆。 - 在 `main.c` 调试时可先空函数测试链接: ```c void OLED_Init(void) { } ``` 若能编译通过,则说明原函数确实未定义或未链接。 --- ### ✅ 总结检查清单 | 检查项 | 是否完成 | |--------|----------| | `OLED_Init()` 函数在 `OLED.C` 中定义? | ✅ / ❌ | | `OLED.h` 中声明了 `OLED_Init()`? | ✅ / ❌ | | `OLED.h` 包含 `extern "C"`? | ✅ / ❌ | | `#include "OLED.h"` 拼写正确? | ✅ / ❌ | | `CMakeLists.txt` 注册了 `OLED.C`? | ✅ / ❌ | | 执行过 `idf.py clean && idf.py build`? | ✅ / ❌ | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶与花语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值