【ESP32】虚拟机Ubuntu20.04下ESP32环境搭建
【ESP32】虚拟机Ubuntu20.04+Vscode(Win)ESP32环境搭建
- 0.准备工作
- 1.各种软件的安装
- 2. 安装ESP相关
- 3.接入esp32设备
- 4. 编译例程
- 5.windows本地Vscode的使用
- 6.windows本地Vscode的调试
- 7.额外设置
- 8.给idf工程添加components
使用Ubuntu环境编译,在win环境下编码调试,SSH远程连接。
0.准备工作
(1)VMware虚拟机安装
(2)Ubuntu20.04版本安装(python的版本都是3.8的,省去很多麻烦)
(3)Windows下Vscode安装
(4)Windows下MobaXterm安装
(5)您也可以自己参考官方安装:点击开始瞎折腾
1.各种软件的安装
最好安装Ubuntu20.04版本,Server版or桌面版都可以,因为python是3.8版本。
镜像:清华大学开源镜像站
Vscode安装上即可,插件安装中文(随意)、SSH。
安装好SSH后,先远程连接到虚拟机,然后安装C/C++插件到虚拟机(不是本地哦)。
MobaXterm自行安装,并且能实现通过SSH访问你安装的虚拟机即可。
2. 安装ESP相关
① 安装编译Esp32需要的软件
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
② 下载esp-gitee-tools(可以加速拉取esp-idf)
git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git
# 进入文件夹,执行下面的脚本
.jihu-mirror.sh set #镜像替换
③ 拉取esp-dif
#指定了5.4版本,你可以修改 recursive表示拉取其子模块
#这样省的你再去切换版本,以及更新子模块了
git clone -b release/v5.4 --recursive https://github.com/espressif/esp-idf.git
④安装esp的编译工具
这一步骤我们需要我们停留在esp-idf的文件夹下,以相对路径的方式执行esp-gitee-tools文件夹下的install.sh。(不会的问问deepseek)
如果你网络可以的话,直接在esp-idf下运行./install.sh all,也是可以的。
⑤环境配置
vim ~/.bashrc
#【注意修改为自己的路径】,放到.bashrc的最后,然后保存退出
alias get_idf='. $HOME/esp/v5.4/esp-idf/export.sh'
#刷新配置
source ~/.bashrc
每次打开新的终端窗口,只需要运行get_idf,esp的虚拟环境就自动加载了。也就是说每次运行idf.py等命令前,你新打开的终端都需要先运行get_idf。
为什么不配置到profile中,因为这样的话,每次打开终端都会自动运行esp-idf的虚拟环境。但是有时你打开终端并不需要使用esp-idf。
3.接入esp32设备
将你的设备插入到电脑,并连接到虚拟机。
运行下列命令,查看是否识别的到。
ls /dev/tty*
会显示出ttyACM*或者ttyUSB*,表示识别到了。
但是还有一个问题,后续下载、仿真会提示你没有权限,重新插拔后,也会提示。
所以需要执行以下命令:
#注意将$USER替换为你的用户名
sudo usermod -a -G dialout $USER
然后重启ubuntu,让其生效。这样就不会出现权限问题了。
4. 编译例程
在将esp32设备连接到电脑前, 你需要先确定你的连接方式是什么?
①通过esp32的内置usb-jtag直连到pc
②通过usb转ttl芯片连接esp32
③通过外置的jtag连接esp32其中,①③都可以下程序和仿真调试。但是②只能下程序。
现在我们先介绍②的方式。
到esp-idf/examples/get-started路径下,将helloworld工程复制出来一份。
然后进入你复制出来的helloworld工程,然后执行一下命令切换为你的芯片类型
#【注意】替换为你自己的芯片型号
idf.py set-target esp32c3
运行下面命令,编译工程
idf.py build
观察是否编译成功。
将esp设备按照②的方式连接到虚拟机,然后执行以下命令,进行烧录。
#【注意】替换为你自己的端口
idf.py -p /dev/ttyACM0 flash
如果烧写失败,请先执行下面操作,再进行烧写。
如果设备不支持自动下载模式,则需要手动进入下载模式。请按住 BOOT 按钮,同时按一下 RESET 按钮。之后,松开 BOOT 按钮。
显示出成功烧写后,咱们可以运行以下命令,监控其输出。
idf.py monitor
你就会看见程序在运行打印。
5.windows本地Vscode的使用
第一步骤中,您已经安装vscode,并能通过ssh连接到虚拟机。
使用vscode打开你上一步骤中复制出来的helloworld工程。
然后打开main文件,你会发现有些头文件有红色波浪线。
好,接下来,解决这些问题,我们要安装ESP-IDF插件。
同样去插件栏目搜索,并将ESP-IDF插件安装到虚拟机中(不是本地哦)。
安装完毕后,在vscode下,按F1,并在如下图的位置搜索红框中的内容。
然后点击一下,会将路径添加至vscode,你的代码就能搜到esp的底层文件了,也不会报错了。
安装完ESP-IDF插件后,你会发现,vscode下方出现了一些内容,但是你点击,vscode会给出错误信息。因为我们还没有配置ESP-IDF的扩展。
在vscode下,按F1,并在如下图的位置搜索红框中的内容。
稍等一会后,出现一下内容,并选择箭头指向的内容。
因为我们之前已经git clone了esp-idf,所以这里选择"使用已经存在的设置"。
继续按下图点击
然后会出现下图所示,然说无需修改,它会自动识别,你直接点击install即可。
安装成功后,你会发现,vscode下方的按钮点击都有用了。
对于连接方式②,你可以将连接方式改为UART,然后,就可以通过vscode进行编译、下载、监控了,无需再输入命令。
6.windows本地Vscode的调试
首先你的连接方式应该更换为方式①或者方式③。
但是,还不行直接进行jtag方式的下载和仿真。
还需要配置工程环境以及openocd的权限。
先配置工程环境,两种方式可以打开进行工程环境配置:一是点击vscode下方的小齿轮。二是先进入工程目录下,然后再终端中输入idf.py menuconfig。这里演示方法一:按照下列图片依次操作即可,有些是非必须的,例如改falsh以及频率。
操作完毕后,然后点击save保存。
然后将下方的更换为JTAG。
然后就是芯片选择,因为连接方式①是内置的,连接方式③是外置的jtag。
下图第一个是内置的,下面两个是外置的。
因为我们修改了工程的配置,所以需要重新build工程一下。
然后再设置一下openocd的权限,将其添加至udev 规则文件。
按照下列顺序操作即可。
cd /home/cjs/.espressif/tools/openocd-esp32/v0.12.0-esp32-20241016/openocd-esp32/share/openocd/contrib
sudo cp 60-openocd.rules /etc/udev/rules.d
然后重启ubuntu,并重新插拔下esp32设备。
等重启后,再次重新连接至虚拟机,这时候,你就可以通过jtag下载程序,以及进行仿真了。
至此大功告成。
7.额外设置
如下图所示,为非必须的设置。
每次vscode连接到远程以及打开文件夹工程都需要输入密码,你可以查询使用ssh证书的方式,这样就免去每次输入密码了。
8.给idf工程添加components
需要添加自定义的c和h文件。
在根目录下创建components文件夹,在components文件夹下创建你自定义的文件夹名字(例如我创建的为sh1106)。按照下面的目录创建所需要的文件。
components/
└── sh1106
├── CMakeLists.txt
├── include
├── sh1106.c
└── sh1106.h
至此,所需文件创建完毕。
还需要修改几个文件。
①c_cpp_properties.json
"includePath": [
"${workspaceFolder}/components/**", #添加到你的文件
],
"browse": {
"path": [
"${workspaceFolder}/components", #添加到你的文件
],
②sh1106文件夹下的CMakeList文件
idf_component_register(SRCS "sh1106.c"
INCLUDE_DIRS "."
REQUIRES driver esp_lcd) # 添加sh1106需要的依赖
③main文件夹下的CMakeList文件
idf_component_register(SRCS "spi-oled.c"
INCLUDE_DIRS "."
REQUIRES sh1106) # 添加sh1106依赖
④根目录下的CMakeList文件
set(EXTRA_COMPONENT_DIRS components) #增加这句
其实就是那个c文件需要依赖sh1106,就需要在它的CMakeList文件中添加依赖,这样就能直接引用sh1106的头文件,无需添加相对路径了。