MCU芯片作为通用性基础器件,应用领域十分广泛。中国作为全球最大的消费电子制造中心,在汽车电子和物联网等领域快速发展,对MCU芯片的需求越来越大,也让国产MCU迎来发展良机。ESP32就是一款高性能、低成本的国产优秀MCU。
1. 概述
ESP32是乐鑫科技设计生产的MCU,专为移动设备、可穿戴电子产品和物联网应用而设计,可满足用户对WiFi、蓝牙、低功耗等方面的需求。
SofTool.CN Notes:
乐鑫科技官网 https://www.espressif.com.cn/
ESP32 采用两个哈佛结构Xtensa LX6 CPU 构成双核系统,集成了2.4 GHz WiFi和蓝牙双模功能,支持丰富的外设接口。其主要特性如下:
- WiFi支持 802.11 b/g/n,802.11 n (2.4 GHz) 速度高达 150 Mbps。
- 蓝牙支持v4.2 完整标准,包含经典蓝牙(BR/EDR) 和低功耗蓝牙(BLE)。
- 低功耗Xtensa LX6 32-bit 单/双核处理器,主频高达240 MHz,运算能力高达 600 MIPS。
- 片上存储包括448 KB 的内部固化ROM,用于程序启动和内核功能调用;520 KB 片上SRAM,用于数据和指令存储;16 KB的RTC SRAM,可用于Deep-sleep 模式下的数据存储及访问。
- 片外存储通过SPI接口以及高速缓存(Cache)支持SPI存储器,最大支持16 MB 片外SPI Flash以及8 MB 片外SPI SRAM。
- 34个GPIO口,GPIO引脚支持IO_MUX功能,可软件设置为GPIO功能还是特定外设复用功能。当作为GPIO功能引脚时,又支持GPIO交换矩阵功能,除少数限制GPIO,允许把任意的外设信号映射到该GPIO引脚,外设接口应用非常灵活。
- 12-bit SAR ADC,多达18 个通道。
- 2 个8-bit D/A 转换器。
- 10 个触摸传感器。
- 4 个SPI。
- 2 个I2S,具有Camera-LCD控制器,可设置成LCD模式支持MCU接口屏,也可设置成Camera从机模式支持外部Camera模块。
- 2 个I2C。
- 3 个UART。
- 1 个Host SD/eMMC/SDIO。
- 1 个Slave SDIO/SPI。
- 带有专用DMA 的以太网MAC 接口,支持IEEE 1588。
- CAN2.0。
- IR (TX/RX)。
- 电机PWM。
- LED PWM,多达16 个通道。
- 霍尔传感器。
乐鑫科技针对用户方案的功能定义与成本预期,设计了多样化的MCU芯片,包括 ESP8266、ESP32、ESP32-S、ESP32-C 和 ESP32-H 系列芯片,以保持性能和成本之间的良好平衡。各系列MCU差异可以在乐鑫官网深入了解。
2. 开发环境
乐鑫软件框架和代码库在 GitHub 上免费开放,开发者可以从如下网址下载相应的软件开发包。其中 ESP-IDF 是乐鑫官方推出的物联网开发框架,适用于 ESP32、ESP32-S 、 ESP32-C和ESP32-H 系列 SoC。ESP-IDF集成了大量的软件组件,包括 RTOS、外设驱动程序、网络协议栈、多种协议实现技术等等,并提供对应的构建支持。
2.1 开发工具链
ESP-IDF 需要安装一些必备工具,才能围绕 ESP32 构建固件,包括Python、Git、交叉编译器、CMake 和Ninja 工具等。
最简单的方式是从如下网址下载 ESP-IDF 工具安装器,安装器包含了相应的开发工具链以及最新稳定版本的ESP-IDF : https://dl.espressif.com/dl/esp-idf
此处基于当前最新稳定版本的ESP-IDF V4.4,下载离线安装包并运行ESP-IDF 工具安装器,根据提示进行安装,安装完后在安装目录\Espressif\frameworks可以看到esp-idf-v4.4软件开发包,在安装目录\Espressif\tools可以看到Python工具、CMake 和Ninja 构建工具、Xtensa和RISC-V架构的GNU交叉编译工具、基于 OpenOCD 的 JTAG 调试工具。
如果已有相应版本的ESP-IDF软件开发包,Windows下可以通过命令提示符窗口运行目录下install.bat脚本,手动在线安装这些工具。
2.2 IDE
ESP-IDF可以通过命令行直接进行项目构建、编译、下载烧录,也允许VSCode和Eclipse跨平台IDE通过插件的方式支持ESP-IDF的开发。
可以从如下网址下载安装VSCode插件:
https://github.com/espressif/vscode-esp-idf-extension
可以从如下网址下载安装Eclipse插件:
https://github.com/espressif/idf-eclipse-plugin
ESP32也支持Arduino平台的开发,Arduino IDE可以从如下网址下载ESP-Arduino软件包:
https://github.com/espressif/arduino-esp32
2.3 ESP-IDF
ESP-IDF基于 C/C++ 语言开发,在components目录下集成了大量功能丰富的软件组件。
这些软件组件和功能主要有如下部分:
- FreeRTOS实时操作系统,可支持多核,具有基于功能的堆分配器。
- 标准编程接口,包含 POSIX 线程和其他 POSIX API、BSD 套接字、线程安全的 C/C++ 标准库,支持虚拟文件系统。
- 外设驱动程序,包含SPI、I2C、UART、GPIO、I2S、ADC、DAC、电容触摸板、定时器、LED和电机PWM、RMT、脉冲计数器、CAN/TWAI、SD/eMMC/SDIO主机和SDIO从机、以太网驱动器。
- WiFi驱动程序,支持WiFi Mesh协议,ESP-NOW点对点协议,ESP-LR远程协议等等。
- 经典蓝牙和低功耗蓝牙,包含蓝牙控制器和蓝牙协议栈,其中蓝牙协议栈Bluedroid支持经典蓝牙和低功耗蓝牙双模,而NimBLE仅支持低功耗蓝牙。
- LwIP TCP/IP协议栈,可支持有线网和WiFi的互联网连接和应用。
- 电源管理,支持MCU低功耗模式以及 WiFi、蓝牙低功耗模式的电源管理框架。
- 存储管理,支持分区管理器、容错和日志结构的键值存储 (NVS),支持加密、FAT和 SPIFFS文件系统。
- 安全功能,具备受硬件支持的安全性能,如 Flash 加密和安全启动,为 RSA、SHA 和 AES 提供加密加速器支持。
网络配置管理,支持Bluetooth LE、WiFi 和其它带外机制的设备加载统一配置框架。
开发者可以根据开发需求,自行添加第三方或者自己的组件,添加的方式可参考components目录下ESP-IDF组件的实现方式或者参考乐鑫官方文档ESP-IDF编程指南。
ESP-IDF在examples目录下提供了丰富的示例资源,详细说明了组件及硬件外设的功能和用法,可以作为应用开发的有效参考。
3. 编译运行
ESP-IDF使用idf.py命令行工具作为前端,管理项目的构建过程,该Python脚本管理了以下工具:
- CMake,配置待构建的项目。
- Ninja或GNU Make,命令行构建工具。
- esptool.py,转换可执行文件以及烧录目标硬件设备。
3.1. 创建工程
以ESP-IDF中\examples\get-started\hello_world工程为例,把hello_world工程目录拷贝到项目开发路径D:\esp32。
3.2. ESP-IDF环境
ESP-IDF 工具安装器可以在Windows系统“开始”菜单创建一个打开ESP-IDF命令提示符窗口的快捷方式,打开该Windows命令提示符,将运行ESP-IDF目录下export.bat脚本以设置开发环境变量(如工具链路径、IDF_PATH等)。
3.3. 工程配置
ESP-IDF组件通过Kconfig进行配置管理,可以通过menuconfig实现Kcongfig的图形配置界面管理。前端输入idf.py menuconfig将执行ninja menuconfig进入配置界面。
命令行进入到hello_world工程,通过idf.py menuconfig进入配置界面。
3.4. 工程编译
工程配置完成后,将会在工程目录产生sdkconfig的工程配置文件。使用idf.py build编译工程,可以编译应用程序和所有ESP-IDF组件,最终生成bootloader、分区表和应用程序二进制文件。
3.5. 下载烧录
工程编译完成后,将生成二进制文件(bootloader.bin、partition-table.bin和hello-world.bin),通过idf.py flash命令使用当前串口下载烧录到ESP32。此时ESP32应配置Strapping管脚为下载启动模式,并复位让CPU进入串口下载模式。
3.6. 启动运行
烧录完成后,重新配置ESP32的Strapping管脚为SPI启动模式,设置串口波特率为115200,重新上电或复位运行代码。
前面几行串口打印为内部ROM启动信息,ESP32上电后,最先运行内部的厂商启动代码,该启动代码会从SPI Flash的0x1000偏移处加载bootloader的程序段、数据段到对应的运行域(IRAM、DRAM),然后跳转并运行bootloader。bootloader从SPI Flash中加载分区表和应用程序到内存中,最后跳转到应用程序入口,执行应用程序。