本文介绍 Windows 下基于 AliOS Things 的 ESP32 应用开发流程,包括环境搭建、程序编译、固件烧写。
AliOS Things
AliOS Things 是一款由阿里巴巴开发的轻量级物联网操作系统。具备极致性能,极简开发、云端一体、丰富组件(包括实时操作系统内核,连接协议库、文件系统、libc接口、FOTA、Mesh、语音识别)、安全防护等关键能力,并支持终端设备连接到阿里云IoT云服务平台。可广泛应用在智能家居,智慧城市,工业等领域,降低物联网终端开发门槛,使万物互联更容易,终端设备上云更简单。
在嵌入式实时操作系统大家族中,常见的 µC/OS-III、FreeRTOS 等 RTOS 严格意义上只能算一个 kernel(仅包含 OS 基本服务),随着物联网时代到来,出现了像 AliOS Things、RT-Thread 这些「时髦」的操作系统,大佬们在实时内核的基础上增加了大量组件,囊括通信协议栈、低功耗管理、安全加密算法、FOTA(远程固件升级)等功能,可以说目的十分明确 —— 直奔物联网。
更多关于物联网操作系统的知识,可以参考何小庆老师的 PPT 物联网操作系统研究与思考.pdf
ESP32
物联网的大潮下,MCU 迎来一个新的发展机遇。继 ESP8266 之后,乐鑫在 2015 年底又推出了更强大的 ESP32 系列 WiFi 芯片,从参数描述可以看出:
ESP32 SoC 为双核 32 位 MCU,主频高达 240 MHz,计算性能可达 600 DMIPS,采用 40 nm 工艺,集成 520 KB SRAM,16 MByte flash。工作电压 2.2 V to 3.6 V。ESP32 专为移动设备、可穿戴电子产品和 IoT 应用而设计,拥有业内最高水平的低功耗芯片的所有特征,例如精细分辨时钟门控、省电模式和动态电压调整等。ESP32 SoC工作温度范围从-40°C 到 +125°C。此外,ESP32 还集成了先进的自校准电路,实现了动态自动调整,可以消除外部电路的缺陷以及适应外部条件的变化。
早在 2016 年乐鑫 ESP32 和阿里云物联网系统 YoC 已经有了合作。去年 10 月份的云栖大会上阿里提出了 AliOS Things,不久之后项目开源便支持了 ESP32,同时为开发者提供了许多开发工具。
ESP32 DevKitC 开发板
ESP32-DevKitC 是搭载了乐鑫最新的 ESP-WROOM-32 模组的 MINI 开发板,能够轻松地插接到面包板,板子包含了用户所需的最小系统,只需连上 USB 线,即可进行开发。此外还具有 USB-UART 转换器 ,复位和下载模式按钮,LDO 稳压器 和微型 USB 连接器 。每个 GPIO 都可供开发者使用。
开发板购买地址:ESP32-DevkitC (Core board开发板)发票不含快递费-淘宝网
那如何把 AliOS Things 编译烧写到 ESP32 DevKitC 呢?来不及解释了,赶紧上车!
所需工具
在 Windows 下进行基于 AliOS Things 开发 ESP32 应用需要准备
- 安装有 Windows、Linux 或者 Mac 操作系统的 PC
- 用于编译 ESP32 应用程序的工具链
- AliOS Things SDK —— 包含 ESP32 的 API 和用于操作工具链的脚本
- 编写 C 语言程序的文本编辑器,例如 VS Code
- ESP32 开发板,例如 ESP32-DevKitC
开发步骤
- 安装 Visual Studio Code
- 安装 alios-studio 扩展
- 获取 AliOS Things SDK(Github 项目源码)
- 下载 ESP32 工具链
- 配置 SDK path,新建 helloworld 工程
- 编译、构建项目
- 烧写 bin 固件
Step 1:安装 VS Code、alios-studio 扩展
项目 Wiki 已经有详细软件安装说明文档,按照步骤把 VS Code 和 alios-studio 扩展装好即可:AliOS Things Studio · alibaba/AliOS-Things Wiki
Step 2:获取 AliOS Things SDK 和 ESP32 工具链
下载 aos 源代码
SDK 即项目仓库源码,从 Github 上 Download Zip 或 Clone 到本地,拷贝到 D:\AliOS-Things-master
目录下(目录自定)。
下载 ESP32 工具链
乐鑫 ESP-IDF 文档中详细描述了如何搭建 ESP32 开发环境,我们需要工具链 Windows all-in-one toolchain 用于编译源代码。
直接下载官方提供的 zip 包即可:https://dl.espressif.com/dl/esp32_win32_msys2_environment_and_toolchain-20171123.zip
同样解压到 D:\msys32
目录下,SDK 和 Toolchain 用于后续配置 VS Code 开发环境。
Step 3:配置 SDK path 与 Toolchain path
打开装好 aos-studio 扩展的 VS Code,点击右下角边状态栏上的 Create Project 新建工程按钮,首次使用会弹出配置 SDK Path 的窗口,把刚才下载的 SDK 目录 D:\AliOS-Things-master
和 ToolChain 目录 D:\msys32\opt\xtensa-esp32-elf\bin
复制到两个 path 文本框中, SDK Version 会自动识别。
20180110 更新:V1.2.0 版本 SDK 设置工具链方式
由于新版本发布后增加了多编译器支持,在 SDK 设置界面去掉了 Toolchain 的选择,而是通过工程配置文件指定工具链目录。在左侧项目管理处找到 .vscode
下的 setting.json
文件,打开后在第一项 aliosStudio.build.toolchain
中填入目录 D:\msys32\opt\xtensa-esp32-elf\bin
即可(注意反斜杠需要转义)。
{
"aliosStudio.build.toolchain": "D:\\msys32\\opt\\xtensa-esp32-elf\\bin",
"aliosStudio.build.output": "${workspaceRoot}/out",
"aliosStudio.inner.yosBin": "aos",
...
}
嫌麻烦的话还可以在系统高级设置中将 ToolChain 路径添加到 TOOLCHAIN_PATH 环境变量中。
(已过时)修改 alios-studio Toolchain 判断规则(项目完善后可跳过此步)
此步骤非必须,由于我目前使用的 v1.1.2 版本的 SDK 尚未完善,多少会存在一些小 bug。比如对所添加 Toolchain path 的合法性判断,目前只校验了 arm Toolchain,所以对 ESP32 的 xtensa 工具链会误报非法路径。
阿里工程师在 issue [AliOS-studio][ESP32] tool chain path. · Issue #55 · alibaba/AliOS-Things 里给出了临时解决方法 —— 把 C:\Users\用户名\.vscode\extensions\alios.alios-studio-0.6.6\src\yang-sdk\main.js
文件中以下判断语句注释掉:
if (options.toolChain && !fsPlus.existsSync(path.join(dir, `arm-none-eabi-gcc${process.platform === 'win32' ? '.exe' : ''}`))) {
return {error: 1, msg: 'path is not a tool chain directory!'};
}
修改完毕后重启 VS Code,按 Ctrl+Shift+P 快捷键调出命令模式,输入 alios-studio: set SDK 继续配置,可正常添加 Toolchain path。
Step 4:新建 helloworld 工程
继续点击新建工程按钮,这回我们终于看到了待选工程模板,勾选 helloworld 工程,滚到下面填写工程保存目录(不能带中文),目标板卡选 esp32devkitc,最后点 Submit 按钮确认提交。
新建工程需要把 sdk 赋值到工程文件夹,比较耗时,请耐心等待。完成后 VS Code 会新打开一个文件夹视图窗口,表示一个 alios-studio 工程。在左侧的目录中打开 helloword.c
文件,其中 application_start
函数是应用程序的入口。helloworld 程序的运行现象是在串口以 5 s 的间隔打印调试字符串。
新建工程视频演示:AliOS Things Tutorial: 1 Hello World 应用
Step 5:编译、构建项目
点击窗口下方状态栏上的 Build 按钮开始编译、构建项目,期间会输出相应信息。如果 SDK 和工具链路径配置 ok 的话项目是可以成功编译的。经过 67.57 s 的漫长等待,终于 Build 完了……
编译生成的文件在工程的 out 目录下,out\helloworld@esp32devkitc\binary\helloworld@esp32devkitc.bin
是要烧到板子上的固件。
Step 6:烧写 bin 固件
说明:由于官方 IDE 暂不支持 Upload 按钮烧录 ESP32,目前只能手动烧录。
固件烧录是相对独立的过程,原理适用于所有 bin 文件。烧写 ESP32 固件可以通过图形界面的 ESPFlashDownloadTool 软件或者 Python 命令行工具 esptool,两者都十分好上手,下面分别说明烧录方法。
bin 文件烧录地址
在烧写前需要准备 3 个 bin 文件,分别是引导程序(bootloader.bin)、分区表(custom_partitions.bin)和用户程序(helloworld@esp32devkitc.bin)。
引导程序和分区表的 bin 文件在 SDK 目录 D:\AliOS-Things-master\platform\mcu\esp32\bsp
下,用户程序 bin 由 alios-studio 编译得到。3 个 bin 文件烧录地址如下:
bin 文件 | 烧录地址 |
---|---|
bootloader.bin | 0x1000 |
custom_partitions.bin | 0x8000 |
helloworld@esp32devkitc.bin | 0x10000 |
系统启动时会从 0x1000 地址处开始执行,引导程序读取分区表确定内存分布及启动规则,然后执行用户程序代码。因此全部 bin 都要烧到正确的地址程序才能正常执行,这一点需要特别注意。
PS:bootloader.bin 和 custom_partitions.bin 首次必须烧写,之后仅烧用户 bin 即可。
20180110 更新:使用 IDE 烧录
好消息!好消息!在更新后的 alios-studio 中支持通过下方 Upload 按钮一键烧录(然后选择对应 COM 号,波特率默认),你不点一下试试么?
使用 ESPFlashDownloadTool 工具烧录
ESPFlashDownloadTool 工具可在 Tools - 乐鑫 Flash 下载工具下载,打开软件后选择 ESP32 DownloadTool,设置不同固件及对应地址、晶振频率、SPI 模式、Flash大小,波特率(决定烧写速度),如下图所示:
将 ESP32 DevKitC 开发板用 Micro-USB 线与电脑连接,安装串口驱动,在烧写软件中选择对应 COM 号,点击 Start 按钮开始下载。
提示:大部分电脑在点击 Start 后会自动复位 ESP32 DevKitC 进入下载模式,如果出现一直等待的情况,请尝试按住 Boot 键不放再下载,或者按住 BooT 键的的同时按一下 EN 键再松开。
使用 esptool 工具烧录
esptool 是采用 Python 语言编写的开源工具(源代码:espressif/esptool: ESP8266 and ESP32 serial bootloader utility),提供方便易用的命令行方式进行操作,常用操作命令:
单个 bin 写 flash 命令:
格式:esptool.py --port 串口号 write_flash 地址 文件名.bin
示例:esptool.py --port COM4 write_flash 0x1000 my_app-0x01000.bin
多个 bin 写 flash 命令:
格式:esptool.py --port 串口号 write_flash 地址1 文件名1.bin 地址2 文件名2.bin
示例:esptool.py --port COM4 write_flash 0x00000 my_app.elf-0x00000.bin 0x40000 my_app.elf-0x40000.bin
esptool.py 在 D:\AliOS-Things-master\platform\mcu\esp32\esptool_py\esptool
目录下,可通过「计算机 - 属性 - 高级系统设置 - 环境变量」添加到系统环境变量 Path 中(分号隔开后粘贴路径),以便在命令行中直接使用。
在 CMD 中敲入以下命令,将 bootloader.bin、custom_partitions.bin 和 helloworld@esp32devkitc.bin 三个文件下载到 Flash 对应地址。
esptool.py --port COM30 --baud 921600 write_flash 0x1000 D:\AliOS-Things-master\platform\mcu\esp32\bsp\bootloader.bin 0x8000 D:\AliOS-Things-master\platform\mcu\esp32\bsp\custom_partitions.bin 0x10000 E:\CodeBase\ESP32\AliOS-Things\hello\out\helloworld@esp32devkitc\binary\helloworld@esp32devkitc.bin
脚本实现
每次输命令太麻烦?将以下代码保存为批处理脚本 upload.bat
,并拷贝到工程目录 hello 下,最后在 VS Code 内置的终端中执行脚本实现一键烧录:
for /f "delims=" %%t in ('dir /A:-D /S /B out\*@esp32devkitc.bin') do set binPath=%%t
esptool.py --port COM30 --baud 921600 write_flash 0x1000 D:\AliOS-Things-master\platform\mcu\esp32\bsp\bootloader.bin 0x8000 D:\AliOS-Things-master\platform\mcu\esp32\bsp\custom_partitions.bin 0x10000 %binPath%
固件 bootloader.bin
和 custom_partitions.bin
从 SDK 目录获取,用户 bin 通过子目录下搜索 “@esp32devkitc.bin” 文件后缀得到。
运行结果
点击 VS Code 下方的 Connect Device 按钮(选好 COM 号,波特率 115200),通过 alios-studio 自带串口工具连接开发板(或使用其他串口工具),如果收到 ESP32 每隔 5 s 发过来的调试信息,说明 helloworld 运行成功!
提示:如果板子不断重启打印错误信息,请检查固件及烧写地址的正确性。
参考资料