在参考ESP32-C3入门教程 基础篇(二、GPIO中断、按键驱动测试) - 知乎 (zhihu.com)
为esp-idf工程增加按键驱动组件时遇到了一系列问题这里记录一下问题和解决过程,希望可以给大家提供帮助
首先按资料导入按键驱动后,首先应该会出现各种找不到XXX.h的报错,而且几乎都是在编译快完成时才报错的特别搞心态,而且大家都知道esp-idf编译非常慢,我电脑性能也不太行,就更慢了....
我们先按顶上文章里的把按键驱动文件放到components文件夹下
首先是主的main.c里找不到新增的驱动文件
这里要修改CMakeLists.txt
注意,工程里每个大文件夹下都有一个CMakeLists.txt,文件,这里要main文件夹下的
然后在里面加入添加的驱动文件的路径
"."表示本文件夹下,"./"表示回退一个文件夹,"../"表示回退两个文件夹
这里要注意按自己的文件路径添加文件
这里给出我的文件路径,做参考
注意:放驱动的文件一定要以components命名,例程编译后默认生成managed_components命名的组件文件夹我把按键驱动文件夹button也放到这个下面,managed_component文件名给改为components,不然会仍然报错找不到文件
如果顺利的话会进入第二个报错阶段阶段,报错在新添加的按键组件中
先是报错"legacy adc driver is deprecated, please migrate to use esp_adc/adc_oneshot.h and esp_adc/adc_continuous.h for oneshot mode and continuous mode drivers respectively"
我查了下,按网上方法点vscode左下角,点齿轮禁用,解决了报错
然后进入下一步报错,-- Configuring incomplete, errors occurred!
我们离开main文件夹下的CMakeLists.txt,去button文件夹的CMakeLists.txt中继续研究
这是个重点,在修改CMakeLists.txt文件的过程中都一直可能遇到这个报错
我开始遇到这个错误真的一头雾水,应为这个错误是编译立刻报嘛,之前的是几乎快编译完成再报
后面问GPT发现,其实这报错就是因为CMakeLists.txt里面有路径找不到,意思大概就是CMakeLists.tx配置错误,每当CMakeLists.txt里路径有问题都会报这个错
然后问题是我们这里啥都没改为什么会报这个错呢?
这是个坑,这个问题我真的查了好久,后面问GPT解决的
首先出现这个问题的原因是需要adc的组件,因为在按键驱动中用到了
我们的思路是找到adc组件的esp_adc_cal.h,用和上面一样的方法使用CMakeLists.txt文件把esp_adc_cal.h的路径添加进来。
现在在button文件夹下的CMakeLists.txt应该是这样的
但他报-- Configuring incomplete, errors occurred!
说明这个路径是不对的,然后我尝试注释掉第3行的PRIV_REQUIRES esp_adc_cal
编译可以顺利进行,但最后报错找不到或未定义esp_adc_cal.h,又回到起点......
我又尝试求助GPT
GPT回答
我尝试了2出现了报错,说明esp_adc_cal.h ,这个文件是有的 我再次问GPT
重新梳理思路,按照我们的思路,我们其实就是要给esp_adc_cal.h提供一个真实的路径嘛
我就直接去安装esp-idf的文件夹中找esp_adc_cal.h,后面索引发现是确实有这个文件的
我这里提供个参考,在我电脑上,他的路径在
D:\Espressif\frameworks\esp-idf-v5.1.2\components\esp_adc\deprecated\include
然后发现,这个文件,有个目录名叫esp_adc,和之前的esp_adc_cal有点相似
我顿时灵光一现把PRIV_REQUIRES esp_adc_cal改为PRIV_REQUIRES esp_adc
顺利开始编译,没有报-- Configuring incomplete, errors occurred!这个错误
但依旧还是没有完成编译,继续报错找不到或未定义esp_adc_cal.h
不过这里我们思路变的清晰了,有了地址按GPT提示的格式,用与第一步类似的方式引出地址就是了,我终于感觉到了一点胜利在望
我们这里可以参照,components(第一步更改过的也就是之前managed_components)下的espressif_led_strip下的CMakeLists.txt为按键组件写CMakeLists.txt,其实espressif_led_strip是例程blink在编译下自动生成的,未编译时是没有的
这里其实就能发现,其实PRIV_REQUIRES 后面的项就是在espidf安装地址下components文件夹下的文件名!其实cespidf安装地址下omponents下就是官方提供的组件库!!!
然后会有个类似是报错找不到或未定义"driver/gpio.h"与"esp_timer.h"
不过现在我们已经不怕这个问题了,我们继续按部就班,添加这两个组件的路径
最后再经过几次-- Configuring incomplete, errors occurred!报错的摸索
终于填入正确地址,顺利通过了编译。。。。
这里贴一下给大家参考
以及回到开头
这里的重点,我们后半段一直在操作这个PRIV_REQUIRES,但在main文件中没有,但也能正常引用组件库的组件,其实是因为main文件夹特性,可以不用引用
最终解决还是比较开心的,毕竟重头到尾,这个问题困扰了我一两天,不过最后想想这个问题其实也不是很复杂,主要是经验不足理解不足才难以解决。
这里给大家提供一个参考,希望能帮助大家节省解决这个问题的时间了