
升级到 ESP-IDF 6.0 后如何从旧 driver 组件迁移到独立的 esp_driver_xxx 组件【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf如果你的 ESP-IDF 项目升级到 6.0 后main/CMakeLists.txt里还声明着旧版driver组件依赖那么 ADC、GPTimer、I2S、RMT、PCNT 等外设的旧头文件如driver/adc.h、driver/timer.h已经不再存在编译会因为找不到头文件或符号而失败。本文的任务就是按官方 6.0 外设迁移指南 的说法把项目对旧driver组件的依赖替换为独立的esp_driver_xxx组件并完成配套的头文件路径与 API 改动让项目重新正常构建。6.0 中 driver 组件发生了什么6.0 里旧driver组件被标记为废弃deprecated并且不再包含对下列组件的公共依赖也就是说只写REQUIRES driver不会再自动带出这些新组件esp_driver_ana_cmpr esp_driver_dac esp_driver_gptimer esp_driver_i2s esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_tsens esp_driver_twai esp_driver_uart esp_driver_usb_serial_jtag官方建议是两条路径二选一推荐移除项目中的driver组件依赖改为直接依赖你实际用到的esp_driver_xxx组件暂留如果项目仍依赖 legacyi2c等仍保留在旧组件里的驱动就保留driver依赖并手动补上它不再传递的那些esp_driver_xxx依赖。另外两个全局性变化会影响所有驱动代码所有公共驱动头文件不再隐式包含 FreeRTOS 头文件。代码里如果之前靠driver/*.h间接引入FreeRTOS.h、task.h等现在必须显式包含对应头文件。各驱动的io_loop_back配置项已删除。不同驱动对象绑定同一个 GPIO 编号即可实现原来的“回环”效果例如把 RMT 的 TX/RX 通道绑到同一 GPIO 模拟 1-Wire 时序不再需要单独配置。第一步清点项目用到的旧 driver 头文件打开应用代码搜索#include driver/形式的包含语句列出实际用到的驱动头文件。旧头文件和新组件的对应关系以迁移指南为准如下旧头文件6.0 已移除或废弃新组件新头文件driver/adc.hesp_adcesp_adc/adc_oneshot.h、esp_adc/adc_continuous.h、esp_adc/adc_cali.h、esp_adc/adc_cali_scheme.hdriver/timer.hesp_driver_gptimerdriver/gptimer.hdriver/i2s.hesp_driver_i2sdriver/i2s_std.h、driver/i2s_pdm.h、driver/i2s_tdm.hdriver/pcnt.hesp_driver_pcntdriver/pulse_cnt.hdriver/rmt.hesp_driver_rmtdriver/rmt_tx.h、driver/rmt_rx.h、driver/rmt_encoder.hdriver/dac.hesp_driver_dacdriver/dac_oneshot.h、driver/dac_continuous.h、driver/dac_cosine.hdriver/temp_sensor.hesp_driver_tsensdriver/temperature_sensor.hdriver/sigmadelta.hesp_driver_sdmdriver/sdm.hdriver/mcpwm.hesp_driver_mcpwmdriver/mcpwm_prelude上表只列了迁移指南中“旧驱动被完全移除”的部分SPI、UART、TWAI、SDIO 等没有整表列出但它们同样属于driver不再传递的组件列表用到时同样要在依赖里显式加上对应组件。第二步修改 main/CMakeLists.txt 的组件依赖在project_root/main/CMakeLists.txt的idf_component_register调用中把driver换成或补上你实际用到的组件。REQUIRES用于公共依赖PRIV_REQUIRES用于私有依赖用法见 组件依赖说明# 迁移前依赖旧 driver 组件 idf_component_register(SRCS main.c REQUIRES driver) # 迁移后按实际用到的外设显式依赖 idf_component_register(SRCS main.c REQUIRES esp_driver_uart esp_driver_gptimer esp_driver_rmt)把表里对应你项目的组件都替换进去即可。注意esp_adc是 ADC 的新组件名不带_driver_前缀不要写成esp_driver_adc。如果你代码里还用了esp_async_memcpy.h或esp_dma_utils.hDMA 核心驱动已从esp_hw_support拆出为独立的esp_driver_dma组件需要额外加上这个依赖。第三步替换头文件并处理配套 API 变化按上表替换包含路径后还要处理迁移指南列出的配套删除项这些代码改动不做完换好依赖也编不过SDMsdm_channel_set_duty已移除改用sdm_channel_set_pulse_density。I2Si2s_set_adc_mode、i2s_adc_enable、i2s_adc_disable从 6.0 起彻底移除i2s_port_t类型也移除了改用int原枚举项I2S_NUM_0等被替换为宏定义以保持兼容。UARTUART_FIFO_LEN宏移除改用UART_HW_FIFO_LENsoc/uart_channel.h移除UART GPIO 查找宏统一在soc/uart_pins.h例如UART_NUM_0_TXD_DIRECT_GPIO_NUM等价于U0TXD_GPIO_NUM。MCPWM旧变参varg风格的 generator API 移除必须改为带类型设置的写法迁移指南给出的示例/* 旧varg 风格已移除 */ mcpwm_generator_set_actions_on_compare_event(my_generator, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, my_comparator, MCPWM_GEN_ACTION_LOW), MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_DOWN, my_comparator, MCPWM_GEN_ACTION_HIGH), MCPWM_GEN_COMPARE_EVENT_ACTION_END()); /* 新写法 */ mcpwm_generator_set_action_on_compare_event(my_generator, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, my_comparator, MCPWM_GEN_ACTION_LOW)); mcpwm_generator_set_action_on_compare_event(my_generator, MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_DOWN, my_comparator, MCPWM_GEN_ACTION_HIGH));此外mcpwm_generator_config_t等配置结构里的io_od_mode、pull_up、pull_down成员已移除需要时手动调用gpio_od_enable、gpio_set_pull_modeMCPWM 分组时钟默认分频改为 1。RMT 同样移除了rmt_tx_channel_config_t中的io_od_mode开漏模式需手动调用gpio_od_enable。外设时钟门控driver/periph_ctrl.h已移除时钟门控改由驱动层内部管理对应的私有 API 在esp_private/periph_ctrl.h。可选分支仍要保留 legacy 驱动时的处理如果项目还依赖仍然留在旧driver组件里的驱动如 legacyi2c按官方建议保留driver在依赖列表中并手动补上它不再传递的esp_driver_xxx依赖。此时注意两点legacy I2C 已被标记 EOL6.0 起标记 End-of-Life计划在v7.0 移除官方建议尽早迁移到新的driver/i2c_master.h和driver/i2c_slave.h详见 5.2 I2C 驱动迁移指南。想临时压掉编译告警可在 menuconfig 中启用Component config→Legacy Driver Configurations→Legacy I2C Driver Configurations→Suppress legacy driver deprecated warning对应选项见 components/driver/Kconfig。legacy TWAI新 TWAI 驱动接口自 5.5 提供官方不再推荐使用旧驱动确需继续用旧版时可启用CONFIG_TWAI_SUPPRESS_DEPRECATE_WARN关闭告警。另外usb、touch_element、NT35510 屏驱等组件已移出仓库、托管到 ESP Component Registry文档给出的获取方式是idf.py add-dependency espressif/usb、idf.py add-dependency espressif/touch_element、idf.py add-dependency espressif/esp_lcd_nt35510。只有项目用到这些对象时才需要执行。验证迁移结果改完后执行构建来验证idf.py build判断依据构建通过说明依赖与头文件替换完整。若报头文件找不到例如driver/adc.h: No such file or directory或未定义符号回到第一步核对是否漏改某个旧头文件、是否漏加对应组件依赖、esp_adc名称是否写错。如果暂时保留了 legacy 驱动构建输出中对应的 deprecation 告警即是你尚未迁移的驱动清单可按上表逐一处理告警抑制选项只用于过渡不等于完成迁移。边界与限制本文范围是 6.0 中“driver组件不再传递的 18 个esp_driver_xxx组件”以及旧驱动被完全移除的头文件替换各驱动自身的功能变更如 I2C 从机改为回调式属于驱动编程范畴不在本文展开可按链接的编程指南跟进。旧driver组件目前仍保留 legacyi2c、legacy touch sensor、legacy TWAI见 components/driver/CMakeLists.txt 中实际注册的源文件它们与上表“已移除”的驱动不同处理方式见“可选分支”一节。driver/periph_ctrl.h、driver/rtc_cntl.h等被移除的头文件没有等价公共替代属于私有 API 调整应用代码不应再直接引用。【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考