ESP-IDF V5编译LVGL ESP32移植项目时esp_timer错误修复
问题
为搭载ESP32-S3-WROVER芯片的WT32-SC01 PLUS(3.5英寸320X480)模块编译LVGL移植到ESP32的Demo项目,使用ESP-IDF V5版本,执行以下命令:
idf.py set-target esp32s3 idf.py build
出现多个编译错误:
C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c: In function 'guiTask': C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:144:11: error: unknown type name 'esp_timer_create_args_t' 144 | const esp_timer_create_args_t periodic_timer_args = { | ^~~~~~~~~~~~~~~~~~~~~~~ C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:145:9: error: field name not in record or union initializer 145 | .callback = &lv_tick_task, | ^ C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:145:9: note: (near initialization for 'periodic_timer_args') C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:145:21: warning: initialization of 'int' from 'void (*)(void *)' makes integer from pointer without a cast [-Wint-conversion] 145 | .callback = &lv_tick_task, | ^ C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:145:21: note: (near initialization for 'periodic_timer_args') C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:146:9: error: field name not in record or union initializer 146 | .name = "periodic_gui" | ^ C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:146:9: note: (near initialization for 'periodic_timer_args') C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:146:17: warning: excess elements in scalar initializer 146 | .name = "periodic_gui" | ^~~~~~~~~~~~~~ C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:146:17: note: (near initialization for 'periodic_timer_args') C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:148:5: error: unknown type name 'esp_timer_handle_t' 148 | esp_timer_handle_t periodic_timer; | ^~~~~~~~~~~~~~~~~~ In file included from C:/espressif/esp-idf/components/esp_hw_support/include/esp_intr_alloc.h:11, from C:/espressif/esp-idf/components/esp_hw_support/include/esp_cpu.h:20, from C:/espressif/esp-idf/components/esp_hw_support/include/spinlock.h:11, from C:/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/include/freertos/portmacro.h:74, from C:/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/include/freertos/portable.h:58, from C:/espressif/esp-idf/components/freertos/FreeRTOS-Kernel/include/freertos/FreeRTOS.h:70, from C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:16: C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:149:21: error: implicit declaration of function 'esp_timer_create' [-Werror=implicit-function-declaration] 149 | ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer)); | ^~~~~~~~~~~~~~~~ C:/espressif/esp-idf/components/esp_common/include/esp_err.h:117:30: note: in definition of macro 'ESP_ERROR_CHECK' 117 | esp_err_t err_rc_ = (x); \ | ^ C:/cpp_test/!esp32/lv_port_esp32_esp_idf_5/main/main.c:150:21: error: implicit declaration of function 'esp_timer_start_periodic' [-Werror=implicit-function-declaration] 150 | ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000)); | ^~~~~~~~~~~~~~~~~~~~~~~~ C:/espressif/esp-idf/components/esp_common/include/esp_err.h:117:30: note: in definition of macro 'ESP_ERROR_CHECK' 117 | esp_err_t err_rc_ = (x); \ | ^
修复方案
这些错误核心是ESP-IDF V5中esp_timer相关的API未被正确引入,按以下步骤解决:
- 添加esp_timer头文件
在main.c的开头引入头文件,补全类型和函数声明:
#include "esp_timer.h"
- 确认组件依赖配置
检查项目的依赖配置,确保esp_timer组件被正确引入:- 若使用CMake,在
main/CMakeLists.txt中添加:REQUIRES esp_timer - 若使用组件管理器,在
idf_component.yml中添加:dependencies: idf: version: ">=5.0" esp_timer: ~
- 若使用CMake,在
执行idf.py reconfigure更新配置。
- 验证回调函数签名
确保lv_tick_task的函数签名符合ESP-IDF要求,应为:
void lv_tick_task(void* arg)
签名不匹配会导致类型转换警告,需调整函数定义。
内容的提问来源于stack exchange,提问作者vico
相关产品推荐
相关产品推荐

