本博文内容导读📕🎉🔥
1、ESP32系统的集成开发环境
2、ESP32官方开发环境、ESP-IDF的安装和运行
3、Visual Studio Code、Arduino、MicroPython开发环境在ESP32开发板上的开发方法、 MicroPython开发工具。
开发ESP32程序的软、硬件资源,ESP32开发板、USB数据线(A转Micro-B)、PC(Windows、Linux或Mac OS)
ESP-IDF目前已服务支持数以亿计的物联网设备,并已开发构建多种物联网产品,
例如:照明、消费电子大小家电、支付终端、工控等各类物联网设备。
具有如下特点:
•免费开源: ESP-IDF相关资源已在GitHub上免费开放。用户可在Apache2.0许可下以源代码形式获取ESP-IDF大多数组件,或通过兼容许可证获取第三方组件。
•专业稳定: ESP-IDF具有清晰、严格的发布流程和支持策略,确保用户选择使用稳定 的发布版本,并可持续获得适用于其应用的重要修复程序。每个稳定的发布版本均经过严格的测试流程,以确保版本稳定,客户可快速实现量产。
•功能重构: ESP-IDF集成了大量的软件组件,包括RTOS、外设驱动程序、网络栈、多种协议实现技术以及常见应用程序的使用助手。它提供了典型应用程序所需的大部分构建块,用户在开发应用时只需专注于业务逻辑即可。ESP-IDF不仅具有免费开源的开发工具,还支持Eclipse和VS Code等IDE,确保其易于开发人员使用。
•资源丰富: ESP-IDF 提供详尽的软件组件使用和设计文档,有助于开发人员充分理解ESP-IDF功能,并从中挑选最适合构建其应用程序的模块。ESP-IDF包含100 多个示例,详细说明了其组件及硬件外设的功能和用法。它们经过了严格的测试和维护,是用户开启应用开发的有效参考。
ESP-IDF开发环境的系统功能:
包括了底层硬件支撑、外设驱动、WiFi、蓝牙、TCP/IP、各类库文件、安全机制、工程示例以及第三方支持等。
ESP-IDF需要安装一些必备工具,才能围绕ESP32构建固件,包括Python、Git、交叉编译器、CMake和Ninja编译工具等。
https://dl.espressif.cn/dl/esp-idf/?idf=4.4
https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/get-started/index.html
运行Hello world
在开发之前,通过micro-USB接口将ESP32开发板接入计算机,Windows系统开始识别硬件。
一般情况下,当ESP32开发板与PC连接时,对应驱动程序已经被打包在操作系统中,可以自动安装。
右击Windows系统桌面上的"此电脑",依次单击"属性"、"设备管理器"、"端口(COM和LPT)"。Silicon Labs CP210x USB to UART Bridge(COM3),即为ESP32开发板所在的端口。
如果不能正确识别ESP32开发板硬件,就会在PC端口出现带有感叹号的设备,这就需手动安装驱动程序。
首先,在乐鑫官方网站下载对应开发板的驱动程序,其次,在计算机上安装,重启即可。
通过命令行运行
通过Eclipse集成开发环境运行
ESP-IDF构建系统
1.基本概念
•项目:特指一个目录,其中包含了构建可执行应用程序所需的全部文件和配置,以及其他支持型文件,例如,分区表、数据/文件系统分区和引导程序。
•项目配置:保存在项目根目录下名为sdkconfig的文件中,可以通过idf.py menuconfig进行修改,且一个项目只能包含一个项目配置。
•应用程序:是由ESP-IDF构建得到的可执行文件。一个项目通常会构建两个应用程序:项目应用程序(可执行的主文件,即用户自定义的固件)和引导程序(启动并初始化项目应用程序)。
•组件:是模块化且独立的代码,会被编译成静态库(.a文件)并链接到应用程序。部分组件由ESP-IDF官方提供,其他组件则来源于相关开源项目。
•目标:特指运行构建后应用程序的硬件设备。ESP-IDF当前仅支持ESP32这一个硬件目标。 请注意,以下内容并不属于项目的组成部分:
•ESP-IDF并不是项目的一部分,它独立于项目,通过IDF_PATH环境变量(保存esp-idf目录的路径)链接到项目,从而将IDF框架与项目分离。
•交叉编译工具链并不是项目的组成部分,它应该安装在系统PATH环境变量中。
2.项目示例
一个ESP-IDF项目可以看作是多个不同组件的集合,ESP-IDF可以显式地指定和配置每个组件。在构建项目时,构建系统会前往ESP-IDF目录、项目目录和用户自定义目录(可选)中查找所有组件,允许用户通过文本菜单系统配置ESP-IDF项目中用到的每个组件。在所有组件配置结束后构建系统开始编译整个项目。
3.项目CMakeLists文件
每个项目都有一个顶层CMakeLists.txt文件,包含整个项目的构建设置。默认情况下,项目CMakeLists文件会非常小。
4.组件CMakeLists文件
每个项目都包含一个或多个组件,这些组件可以是ESP-IDF的一部分,也可以是项目自身组件目录的一部分,从自定义组件目录添加。组件是COMPONENT_DIRS列表中包含CMakeLists.txt文件的任何目录。
5.组件配置
每个组件都可以包含一个Kconfig文件,和CMakeLists.txt放在同一目录下。Kconfig文件中包含要添加到该组件配置菜单中的一些配置设置信息。运行menuconfig时,可以在 Component Settings 菜单栏下找到这些设置。
创建一个组件的Kconfig文件,最简单的方法就是使用ESP-IDF中现有的Kconfig文件作为模板,在此基础上进行修改。
6.使用idf.py命令构建系统
• idf.py命令行工具提供一个前端,可以轻松管理项目的构建过程,管理工具如下:
• CMake,配置待构建的系统。
• 命令行构建工具(Ninja或GNU Make)。
• esptool.py,烧录ESP32。
• idf.py应运行在ESP-IDF的项目目录下,即包含CMakeLists.txt文件的目录。仅包含Makefile的老式项目并不支持idf.py。运行idf.py --help可以查看完整的命令列表。
ESP-IDF插件安装
Visual Studio Code(VS Code)是Microsoft运行于Windows、Mac OS X和Linux之上的跨平台源代码编辑器。具有对JavaScript、TypeScript和Node.js的内置支持,并具有丰富的其他语言(C++、C#、Java、Python、PHP、Go)和运行时扩展的生态系统。
默认上一节ESP-IDF开发环境已经安装成功。下面针对ESP-IDF在VS Code中的安装步骤,要求已经安装Python、Git和ESP--IDF目录。
(1)打开VS Code界面。
(2)单击左侧上部最下面的扩展图标,在文本框中输入"Chinese Simplified",安装简体中文插件,重启VS Code即可。
(3)单击扩展图标,在搜索文本框中输入"Espressif IDF"。
(4)单击安装 Visual Studio Code(VS Code)是Microsoft运行于Windows、Mac OS X和Linux之上的跨平台源代码编辑器。具有对JavaScript、TypeScript和Node.js的内置支持,并具有丰富的其他语言(C++、C#、Java、Python、PHP、Go)和运行时扩展的生态系统。 要求已经安装Python、Git和ESP--IDF目录。
(5)打开菜单栏,单击查看,命令面板...,输入configure ESP...。
(6)单击EXPRESS,由于上一节已经安装了所有的工具,每个工具选择已经安装的目录即可。 (7)安装完成后,左下角的几个重要图标,分别是连接串口、构建工程、烧录程序和监视运行结果。
运行第一个程序
(1)打开文件夹。单击界面的菜单栏,打开已经安装的hello_world文件夹,文件夹中的文件出现在左侧的导航栏中,结构十分清晰。单击hello_world_main.c文件,右侧出现相关内容,工程中所有的文件在这里可以进行编辑。
(2)单击左下角的连接串口图标,在窗口上方会出现串口选择,单击ESP32开发板所有的串口,本开发板使用的是COM3,单击选择。
(3)构建工程,单击左下角的构建图标,在右侧下面的窗口出现编译信息。
(4)单击左下角的烧录图标,窗口上方出现烧录方式,选择UART,在右侧下面的窗口出现烧录信息。
(5)单击监控器,观看程序运行结果,在右侧下方的窗口,出现运行结果。 至此,使用VS Code进行ESP32项目开发,已经成功完成,所有的项目都可以通过VS Code进行开发。可以看到,由于使用图形界面,开发效率有很大的提升。
Arduino开发环境
Arduino IDE是高效实用的Arduino程序开源电子原型平台代码编程辅助工具,ESP32支持使用Arduino进行项目开发,本节包括ESP32插件在Arduino平台的安装以及运行一个程序的具体步骤。
运行第一个程序
成功为Arduino IDE安装了ESP32插件,同时ESP32开发板也已经通过端口选择成功。下面运行一个具体程序。
(1)打开菜单栏的"文件、示例"。
(2)本程序的功能是打印芯片的信息到串口。
(3)单击上传按钮,开始编译和烧录。
(4)单击右上角监视器按钮,打开监视器,查看程序运行结果。
MicroPython开发环境
MicroPython是Python 3语言的精简高效实现,包括Python标准库的一小部分,经过优化可在微控制器和受限环境中运行。MicroPython包含了诸如交互式提示、任意精度整数、关闭、列表解析、生成器、异常处理等高级功能。
MicroPython旨在尽可能与普通Python兼容,将代码从桌面传输到微控制器或嵌入式系统。MicroPython运行完整的Python编译器和运行时,可以获得交互式提示(REPL),以便立即执行命令,以及从内置文件系统运行和导入脚本的功能。REPL具有历史记录,选项卡完成,自动缩进和粘贴模式,以获得良好的用户体验。
开发的准备工作
MicroPython可以在多种嵌入式硬件平台上运行,目前已经支持ESP8266/ESP32、STM32,CC3200、dsPIC33、MK20DX256、nRF51/nRF52、MSP432、XMC4700等多个平台。
其中,ESP8266/ESP32硬件是目前最完善的功能平台之一。要在ESP32开发板上使用Python进行开发,下载ESP32开发板的固件。
固件分为两种,分别是ESP-IDF v3.x和ESP-IDF v4.x,后者的支持功能较多,建议选择。根据开发板是否支持SPIRAM,选择GENERIC或GENERIC-SPIRAM。
下载地址:
uPyCraft开发工具
uPyCraft是一款专门为MicroPython设计的IDE。为了用户使用便捷,uPyCraft在所有系统上都采用绿色免安装的形式发布。uPyCraft界面简洁,容易入门,可以直接在ESP32开发板上烧录MicroPython固件,不需要使用esptool进行烧录,大大提高操作的简便性。本书选择版本V1.1进行下载和使用。
该软件为绿色开发工具,不需要安装,直接运行即可,界面如图3-29所示,左侧是导航栏,右侧是经常用到的主要功能按钮。单击菜单栏的"Tools、Serial",选择开发板所在的串口,本书用COM3,读者选择自己计算机安装时的开发板串口。
单击菜单栏的"Tools、BurnFirmware",出现烧录固件的界面,board选择esp32,burn_addr选择0x1000,erase_flash选择yes。Firmware Choose点选Users,选择已经下载好的固件文件,单击OK,等待完成固件烧录。
该开发环境自带一些案例,下面打开一个示例analogRead.py。
打开示例后,重新通过菜单栏"Tools,Serial",选择串口,然后单击右侧工具栏中的运行按钮。由于引脚是空的,下方的信息栏不断变化是随机的模拟值。
如果在开发环境的workSpace下运行程序,离开开发环境后,程序不能在ESP32开发板运行,这适合开发程序时使用,不必每次重烧固件。
如果离开开发环境仍然可以在开发板执行程序,那么文件的名字应为main.py,并将文件存储在设备上,这样每次ESP32开发板加电,默认执行main.py中的代码。但是main.py文件存储在开发板上,每次关闭开发环境,重新将ESP32开发板接入到计算机,都要重新烧录固件。
Thonny开发工具
Thonny是一款Python编辑器,基于Python内置图形库Tkinter开发出来的,支持Windows、Mac、Linux多平台,支持语法着色、代码自动补全、调试等功能,软件非常容易入门,在官网上选择下载自己系统的版本。
(1)打开开发环境,单击菜单栏的"工具、设置、解释器",解释器和端口的选择。
(2)单击"Install or update firmware",选择端口和固件位置,单击"安装",等待完成。
(3)连接LED正极到开发板14引脚,负极连接到ESP32开发板的GND。
(4)打开菜单栏"文件、新文件"、输入代码并保存,选择"此电脑或者MicroPython设备"都可以,单击下载运行按钮,即可运行。
(5)如果上一步选择了"此电脑",则程序只能在开发环境下运行。如果上一步选择了"MicroPython设备",则离开Thonny开发环境,重新加电,程序仍然可以正常运行,也就是MicroPython设备是从main.py开始执行的。
如果在开发环境的"此电脑"下运行程序,离开开发环境后,程序不能在ESP32开发板运行,这适合开发程序时使用,不必每次重烧固件。
如果离开开发环境仍然要在开发板上执行程序,那么文件的名字应为main.py,并将文件存储在"MicroPython设备"上,这样每次ESP32开发板加电,默认执行main.py中的代码。但是,main.py文件存储在开发板上,每次关闭开发环境,重新将ESP32开发板接入到计算机,都要重新烧录固件。
MicroPython主要模块
本节针对ESP32常用的MicroPython模块进行简单介绍,以便读者快速学习。主要的模块有通用硬件控制machine以及子模块、网络network、延时和时间time,下面分别总结其用法。
1.machine模块
|---------------------------|------------------------------------|
| 函数名称 | 功能描述 |
| machine.reset() | 重置设备,与按下外部RESET按钮类似 |
| machine.reset_cause() | 获取重置的原因,可能的返回值为常量 |
| machine.disable_irq() | 禁用中断请求,返回IRQ状态:False/True分别对应禁用/启用 |
| machine.enable_irq(state) | 启用中断请求,state为True(默认)则启用,False则禁用 |
| machine.idle() | 把时钟拨到中央处理器上,在一定时间内减少能量消耗 |
| machine.sleep() | 终止cpu并禁用除WLAN外的所有外围设备 |
| machine.deepsleep() | 终止cpu和所有外围设备(包括网络接口) |
| machine.unique_id() | 返回一个具有开发板/SoC唯一标识符的字节字符串 |
| 常量 | |
此外,machine模块包括常量和重要的类。
IRQ唤醒值常量包括machine.IDLE、machine.SLEEP、machine.DEEPSLEEP。
重置原因常量包括machine.DEEPSLEEP_RESET、machine.PWRON_RESET、machine.HARD_RESET、machine.WDT_RESET、machine.SOFT_RESET;唤醒原因常量,包括machine.WLAN_WAKE、machine.PIN_WAKE、machine.RTC_WAKE。
重要的类:Pin类,控制I/O引脚。Signal类,控制和感应外部I/O设备。UART类,双工串行通信总线。SPI类,串行外设接口总线协议(主机)。I2C类,双线串行协议。RTC类,实时时钟。定时器类,控制硬件定时器。WDT类,看门狗定时器。
1.Pin类
Pin类主要用于控制I/O引脚,引脚对象用于控制I/O引脚。Pin对象通常与一个可驱动输出电压和读取输入电压的引脚相关联。引脚类有设置引脚模式(IN、OUT等)以及设置数字逻辑的方法。对引脚的模拟控制,例如,ADC。
引脚对象通过使用明确指定某个I/O引脚的标识符来构建。每一个标识符都对应到一个引脚,标识符可能是整数、字符串或者一个带有端口和引脚编号的元组。
2.Signal类
Signal类用于控制和感应外部I/O设备,信号类是引脚类的简单延伸。信号类增加了对引脚功能的逻辑反转支持。虽然只是简单的补充,但主要为了支持不同开发板移植,是MicroPython的主要目标之一。根据MicroPython给出的定义,以下为信号和引脚的使用指南:
使用信号:要控制一个类似LED、多段指示器、继电器、蜂鸣器等简单开/关(包括软件PWM)设备,或读取类似常开或常闭按钮、拉高或拉低、磁簧开关、水分/火焰检测器等简单的二进制传感器。总之,需要GPIO访问的真实物理设备/传感器,可能需要使用信号。
- UART类
UART类实现的标准UART/USART双向串行通信协议。其物理层包括两条线:RX和TX,通信单元是一个可为8位或9位宽的字符。
- SPI类 串行外设的接口总线协议SPI,由主机驱动的同步串行协议。总线的物理层包括3条线:SCK、MOSI、MISO。多个设备可共享同一总线。每台设备应有一个单独的SS信号(从属选择),在总线上选择一台特定设备以进行通信。SS信号的处理应在用户编码(通过machine.Pin类)中进行。
5.I2C类
I2C是一个设备间通信的双线串行协议。其物理层包含两条线:SCL和SDA,分别为时钟和数据线。I2C对象在特定总线上创建,可在创建时或创建后初始化。
硬件和软件I2C实现都通过machine.I2C和machine.SoftI2C类。硬件I2C使用系统的底层硬件支持来执行读/写操作,通常高效且快速,但可能会限制使用哪些引脚。软件I2C可以在任何引脚上使用,但效率不高。二者具有可用的相同方法,区别在于它们的构造方式。
- RTC类
实时时钟RTC是一个独立的时钟,可追踪日期和时间。
- Timer类
Timer类是硬件定时器处理周期和事件的时间。在MCUs和SoCs中,定时器可能是最为灵活和异构的硬件,其根据模型不同而大有不同。MicroPython的Timer类使用一个给定周期定义执行回调的基线操作,并允许特定板来定义更多非标准行为。
8.WDT类
看门狗定时器WDT类,用于在应用程序崩溃且最终进入不可恢复状态时重启系统。一旦开始,就不可停止或重新配置。启用后,应用需定期"喂养"看门狗,以防止其终止并重置系统。
ESP/ESP32模块 特定函数方法
|---------------------------------------|----------------------------------------------------------------------------------------------|
| 方法 | 功能描述 |
| esp.flash_size() | 读取Flash存储器的大小 |
| esp.flash_user_start() | 读取用户闪存空间开始的内存偏移量 |
| esp32.wake_on_touch(wake) | 配置触摸引脚是否会将设备从睡眠状态唤醒,wake是一个布尔值 |
| esp32.wake_on_ext0(pin, level) | 配置EXT0如何将设备从睡眠中唤醒。pin可以为None或有效的引脚对象。level应为esp32.WAKEUP_ALL_LOW或esp32.WAKEUP_ANY_HIGH |
| esp32.wake_on_ext1(pins, level) | 配置EXT1如何将设备从睡眠中唤醒。pin可以为None或有效的引脚对象的元组/列表,level应为esp32.WAKEUP_ALL_LOW或esp32.WAKEUP_ANY_HIGH |
| esp32.raw_temperature() | 读取内部温度传感器的原始值,返回一个整数 |
| esp32.hall_sensor() | 读取内部霍尔传感器的原始值,返回一个整数 |
| esp32.idf_heap_info(capabilities) | 返回有关ESP-IDF堆内存区域的信息 |