ESP32——快速入门
文章目录
- 一、概述
- 二、准备工作
- 2.1 硬件
- 2.2 软件
- 三、搭建开发环境并运行示例验证
- 3.1 运行ubuntu-20.04系统
- 3.1.1 vmware打开ubuntu镜像
- 3.1.2 配置ubuntu系统
- 3.2 ubuntu系统使用介绍
- 3.2.1 登陆系统
- 3.2.2 终端下常用命令
- 3.2.3 常用工具
- 3.2.4 安装配置samba共享目录
- 3.3 获取esp-idf sdk源码并配置
- 3.3.1 Linux平台必要包
- 3.3.2 权限问题 /dev/ttyUSB0
- 3.3.3 获取esp-idf
- 3.3.4安装设置工具
- 3.3.5 设置环境变量
- 3.4 基于esp-idf创建一个hello word工程并烧写运行
- 3.4.1 开始创建工程
- 3.4.2 连接设备
- 3.4.3 配置
- 3.4.4 编译工程
- 3.4.5 烧录到设备
- 四、ESP32-IDF框架简介
- 4.1 idf-sdk目录结构分析
- 4.2 示项目目录结构分析
一、概述
ESP32-C3 SoC 芯片支持以下功能:
- 2.4 GHz Wi-Fi
- 低功耗蓝牙
- 高性能 32 位 RISC-V 单核处理器
- 多种外设
- 内置安全硬件
ESP32-C3 采用 40 nm 工艺制成,具有最佳的功耗性能、射频性能、安全性和可靠性,适用于各种应用场景和不同功耗需求。
乐鑫为用户提供完整的软、硬件资源,进行 ESP32-C3 硬件设备的开发。其中,乐鑫的软件开发环境 ESP-IDF 旨在协助用户快速开发物联网 (IoT) 应用,可满足用户对 Wi-Fi、蓝牙、低功耗等方面的要求。
二、准备工作
2.1 硬件
- 一款 ESP32-C3 开发板
- USB 数据线 (A 转 Micro-B)
- 电脑(Windows、Linux 或 macOS)
目前一些开发板使用的是 USB Type C 接口。请确保使用合适的数据线来连接开发板!
以下是 ESP32-C3 官方开发板,点击链接可了解更多硬件信息。
- ESP32-C3-DevKitC-02
- ESP32-C3-DevKitM-1
2.2 软件
如需在 ESP32-C3 上使用 ESP-IDF,请安装以下软件:
- 设置工具链,用于编译 ESP32-C3 代码;
- 编译构建工具 —— CMake 和 Ninja 编译构建工具,用于编译 ESP32-C3 应用程序;
- 获取 ESP-IDF 软件开发框架。该框架已经基本包含 ESP32-C3 使用的 API(软件库和源代码)和运行 工具链 的脚本;
对于软件安装,可以根据自己需求去选择下列方法:
- IDE
- Eclipse Plugin
- VSCode Extension
- 操作系统
- Windows Installer
- Linux and macOS
三、搭建开发环境并运行示例验证
3.1 运行ubuntu-20.04系统
3.1.1 vmware打开ubuntu镜像
3.1.2 配置ubuntu系统
- ubuntu系统镜像来源 https://www.osboxes.org/ubuntu/#ubuntu-20-04-vmware
- 我们在此基础上进行一些初始化 增加了book用户 密码是 123456 初始化了 root用户密码 123456 并提前安装配置了对应的基础包,以及clone了esp-idf 源码等文件 确保可以拿到此虚拟机就能进行上手开发。
3.2 ubuntu系统使用介绍
3.2.1 登陆系统
3.2.2 终端下常用命令
目录结构:
/bin:
bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。/boot:
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev :
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。/etc:
etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。/home:
用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。/lib:
lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。/media:
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。/opt:
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。/proc:
proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all/root:
该目录为系统管理员,也称作超级权限者的用户主目录。/sbin:
s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。/selinux:
这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。/srv:
该目录存放一些服务启动之后需要提取的数据。/sys:
这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。/tmp:
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。/usr:
usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。/usr/bin:
系统用户使用的应用程序。/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。/usr/src:
内核源代码默认的放置目录。/var:
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。/run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。
值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给 root 使用的指令。/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志
就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。
- man
- 查看Linux中的指令帮助
- man命令 是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。
- ls
- 显示目录内容列表
- ls命令 就是list的缩写,用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。
- mkdir
- 用来创建目录
- mkdir命令 用来创建目录。该命令创建由dirname命名的目录。如果在目录名的前面没有加任何路径名,则在当前目录下创建由dirname指定的目录;如果给出了一个已经存在的路径,将会在该目录下创建一个指定的目录。在创建目录时,应保证新建的目录与它所在目录下的文件没有重名。
- pwd
- 显示当前工作目录的绝对路径。
- cd
- 切换用户当前工作目录。
- rm
- 用于删除给定的文件和目录
- rm 命令 可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。
- cp
- 将源文件或目录复制到目标文件或目录中
- cp命令 用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。
- mv
- 用来对文件或目录重新命名
- mv命令 用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。source表示源文件或目录,target表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。
- exit
- 退出当前的shell。
- shutdown
- 用来执行系统关机的命令
- shutdown命令 用来系统关机命令。shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作。
- reboot
- 重新启动正在运行的Linux操作系统
- sudo
- 以其他身份来执行命令
- sudo命令 用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers 中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
- source
- 在当前Shell环境中从指定文件读取和执行命令。
- 执行文件并从文件中加载变量及函数到执行环境。
3.2.3 常用工具
- ping
- 测试主机之间网络的连通性,执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
- ping IP/域名
- apt
- apt-get命令 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个应用的文件包在一起,大体就如同Windows上的安装文件。(执行下面命令时默认需要加sudo)
- apt-get install 安装新包
- apt-get remove 卸载已安装的包(保留配置文件)
- apt-get autoremove
- apt-get update 更新软件包列表(在执行其他指令前 应该先执行此命令)
- apt-get upgrade 更新所有已安装的包
- apt-cache search 搜索软件包名
- ssh
- ssh命令 是openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器。
- ssh -p user@IP
- ssh -p 22 book@192.168.1.133
- git
- 是目前世界上最先进的分布式版本控制系统。
- git clone 仓库地址
- git log 查看仓库提交
这里我想用MobaXterm远程访问ubuntu,发现输入虚拟机ip地址后连接拒绝,说明虚拟机中没有ssh工具,所以需要在ubuntu中下载openssh-server,操作如下:
- 更新软件包列表:sudo apt-get update
- 搜索软件包名:sudo apt-cache search openssh
- 安装新包:sudo apt-get install openssh-server(提示输入y or n 输入y即可)
此时在MobaXterm输入ubuntu的ip地址,并输入用户名和密码即可成功远程访问
3.2.4 安装配置samba共享目录
安装samba
sudo apt install samba
在安装时发现速度慢,可以修改为阿里云服务器:
修改配置文件
sudo gedit /etc/samba/smb.conf
在配置文件中添加共享文件夹
[share]comment = esp32 idf sharepath = /home/bookread only = nowriteable = yesbrowseable = yespublic = yescreate mask = 0644directory mask = 0755
修改共享文件权限
sudo chmod -R go+rwx /home/book
发现此时文件都是最高权限
重启smbd服务
sudo service smbd restart
sudo service nmbd restart
配置vmware NAT DHCP分配IP地址时间
Windows 映射访问
成功访问ubuntu下的文件:
3.3 获取esp-idf sdk源码并配置
3.3.1 Linux平台必要包
编译 ESP-IDF 需要以下软件包。输入如下指令:
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
3.3.2 权限问题 /dev/ttyUSB0
使用某些 Linux 版本向 ESP32-C3 烧录固件时,可能会出现 Failed to open port /dev/ttyUSB0
错误消息。此时可以将用户添加至 Linux Dialout 组。
当前登录用户应当可以通过 USB 对串口进行读写操作。在多数 Linux 版本中,都可以通过以下命令,将用户添加到 dialout
组,从而获许读写权限:
sudo usermod -a -G dialout $USER
请重新登录,确保串口读写权限生效。
3.3.3 获取esp-idf
打开终端,后运行以下命令,我们使用的都是v4.3分支源码 :
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git -b release/v4.3
ESP-IDF 将下载至 ~/esp/esp-idf
。
3.3.4安装设置工具
除了 ESP-IDF 本身,还需要安装 ESP-IDF 使用的各种工具,比如编译器、调试器、Python 包等。
cd ~/esp/esp-idf
./install.sh esp32c3
通过一次性指定多个目标,可为多个目标芯片同时安装工具,如运行 ./install.sh esp32,esp32c3,esp32s3
。 通过运行 ./install.sh
或 ./install.sh all
可一次性为所有支持的目标芯片安装工具。
如果下载安装速度比较慢 可以在要在安装工具时优先选择 Espressif 下载服务器,请在运行 install.sh
时使用以下命令:
cd ~/esp/esp-idf
export IDF_GITHUB_ASSETS="dl.espressif.com/github_assets"
./install.sh
3.3.5 设置环境变量
请在需要运行 ESP-IDF 的终端窗口运行以下命令:
. $HOME/esp/esp-idf/export.sh
注意,命令开始的 “.” 与路径之间应有一个空格!
如果需要经常运行 ESP-IDF,可以为执行 export.sh
创建一个别名,具体步骤如下:
gedit ~/.bashrc
- 复制并粘贴以下命令到 shell 配置文件中(
.profile
,.bashrc
,.zprofile
等)
alias get_idf='. $HOME/esp/esp-idf/export.sh'
- 通过重启终端窗口或运行
source [path to profile]
,如source ~/.bashrc
来刷新配置文件。
现在可以在任何终端窗口中运行 get_idf
来设置或刷新 esp-idf
环境。(相当于用 get_idf
替代 . $HOME/esp/esp-idf/export.sh
)
这里不建议直接将 export.sh
添加到 shell
的配置文件。因为这会导致在每个终端会话中都激活 IDF 虚拟环境(包括无需使用 IDF 的情况),从而破坏使用虚拟环境的目的,并可能影响其他软件的使用。
3.4 基于esp-idf创建一个hello word工程并烧写运行
3.4.1 开始创建工程
现在,可以开始准备开发 ESP32-C3 应用程序了。可以从 ESP-IDF 中 example
目录下的 get-started/hello_world
工程开始将 get-started/hello_world
工程复制至本地的 ~/esp
目录下:
cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world
ESP-IDF 的 examples
目录下有一系列示例工程,都可以按照上面的方法进行创建。可以按照上述方法复制并运行其中的任何示例,也可以直接编译示例,无需进行复制。
3.4.2 连接设备
现在,请将 ESP32-C3 开发板连接到 PC,并查看开发板使用的串口。
通常,串口在不同操作系统下显示的名称有所不同:
- Linux 操作系统: 以
/dev/tty
开始
有关如何查看串口名称的详细信息,请见 与 ESP32-C3 创建串口连接。
3.4.3 配置
请进入 开始创建工程 中提到的 hello_world
目录,并运行工程配置工具 menucondif
。
cd ~/esp/hello_world
idf.py set-target esp32c3
idf.py menuconfig
打开一个新项目后,应首先设置“目标”芯片 idf.py set-target esp32c3
。注意,此操作将清除并初始化项目之前的编译和配置(如有)。 也可以直接将“目标”配置为环境变量(此时可跳过该步骤)。
显示如下菜单:
可以通过此菜单设置项目的具体变量,包括 Wi-Fi 网络名称、密码和处理器速度等。hello_world
示例项目会以默认配置运行,因此可以跳过使用 menuconfig
进行项目配置这一步骤。
终端窗口中显示出的菜单颜色可能会与上图不同。可以通过选项
--style
来改变外观。更多信息,请运行idf.py menuconfig --help
命令。
3.4.4 编译工程
请使用以下命令,编译烧录工程:
idf.py build
运行以上命令可以编译应用程序和所有 ESP-IDF 组件,接着生成bootloader、分区表和应用程序二进制文件。
如果一切正常,编译完成后将生成 .bin 文件。
3.4.5 烧录到设备
使用以下命令,将刚刚生成的二进制文件 (bootloader.bin, partition-table.bin 和 hello-world.bin) 烧录至 ESP32-C3 开发板:
esptool.py -p /dev/ttyUSB0 -b 460800 --before default_reset --after hard_reset --chip esp32c3 write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/hello-world.bin
如果一切顺利,烧录完成后,开发板将会复位,应用程序 “hello_world” 开始运行。
可以使用 idf.py -p PORT monitor
命令,监视 “hello_world” 工程的运行情况。注意,不要忘记将 PORT
替换为自己的串口名称。
可使用快捷键 Ctrl+]
,退出 IDF 监视器。
也可以运行以下命令,一次性执行构建、烧录和监视过程:
idf.py -p PORT flash monitor
四、ESP32-IDF框架简介
4.1 idf-sdk目录结构分析
esp-idf根目录各个文件夹文件说明:
├── add_path.sh
├── CMakeLists.txt
├── components //各种协议库 硬件资源库
├── CONTRIBUTING.rst
├── docs //参考文档
├── examples //demo示例
├── export.bat
├── export.fish
├── export.ps1
├── export.sh //设置编译环境
├── install.bat
├── install.fish
├── install.ps1
├── install.sh //配置安装编译环境
├── Kconfig
├── LICENSE
├── make
├── README_CN.md
├── README.md
├── requirements.txt
├── sdkconfig.rename
├── SUPPORT_POLICY_CN.md
├── SUPPORT_POLICY.md
└── tools //常用工具 包含一些测试源码
components 目录下所有库说明:
├── components
│ ├── app_trace
│ ├── app_update
│ ├── asio
│ ├── bootloader
│ ├── bootloader_support
│ ├── bt
│ ├── cbor
│ ├── cmock
│ ├── coap
│ ├── console
│ ├── cxx
│ ├── driver
│ ├── efuse
│ ├── esp32
│ ├── esp32c3
│ ├── esp32s2
│ ├── esp32s3
│ ├── esp_adc_cal
│ ├── esp_common
│ ├── espcoredump
│ ├── esp_eth
│ ├── esp_event
│ ├── esp_gdbstub
│ ├── esp_hid
│ ├── esp_http_client
│ ├── esp_http_server
│ ├── esp_https_ota
│ ├── esp_https_server
│ ├── esp_hw_support
│ ├── esp_ipc
│ ├── esp_local_ctrl
│ ├── esp_netif
│ ├── esp_pm
│ ├── esp_ringbuf
│ ├── esp_rom
│ ├── esp_serial_slave_link
│ ├── esp_system
│ ├── esp_timer
│ ├── esp-tls
│ ├── esptool_py
│ ├── esp_websocket_client
│ ├── esp_wifi
│ ├── expat
│ ├── fatfs
│ ├── freemodbus
│ ├── freemodbus
│ ├── freertos
│ ├── hal
│ ├── heap
│ ├── idf_test
│ ├── jsmn
│ ├── json
│ ├── libsodium
│ ├── log
│ ├── lwip
│ ├── mbedtls
│ ├── mdns
│ ├── mqtt
│ ├── newlib
│ ├── nghttp
│ ├── nvs_flash
│ ├── openssl
│ ├── partition_table
│ ├── perfmon
│ ├── protobuf-c
│ ├── protocomm
│ ├── pthread
│ ├── riscv
│ ├── sdmmc
│ ├── soc
│ ├── spiffs
│ ├── spi_flash
│ ├── tcpip_adapter
│ ├── tcp_transport
│ ├── tinyusb
│ ├── touch_element
│ ├── ulp
│ ├── unity
│ ├── vfs
│ ├── wear_levelling
│ ├── wifi_provisioning
│ ├── wpa_supplicant
│ └── xtensa
4.2 示项目目录结构分析
自己的程序应该放在哪里 ?
├── CMakeLists.txt
├── example_test.py
├── main
│ ├── CMakeLists.txt
│ ├── component.mk
│ └── hello_world_main.c
├── Makefile
└── README.md
编译程序时主要连接地方在 app_main
。