本文介绍 ESP32 强大的超低功耗协处理器 (ULP co-processor),给出汇编环境的搭建步骤。
1. ULP 协处理器简介
ULP 协处理器是一个功耗极低的协处理器设备,无论主 CPU 是处于正常运行模式还是 Deep-sleep 模式,ULP 协处理器都可以独立运行。超低功耗协处理器的补充使得 ESP32 能够胜任一些对低功耗要求较高的应用场合。
ULP 协处理器的主要特性有:
- 采用 8 MHz 频率和 8 KB 内存
- 内建 ADC 和 I2C 接口
- 支持正常模式和 Deep-sleep 模式
- 可唤醒主 CPU 或向主 CPU 发送中断
- 能够访问主 CPU 的外围设备、内部传感器及 RTC 寄存器
更多特性及介绍详见 ESP32 技术参考手册。
2. ULP 协处理器电流消耗鉴于以上的特性,ULP 协处理器能够在消耗较低电流的情况下,完成 ADC 采样,进行 I2C Sensor 的读写,驱动 RTC GPIO 口动作,可以在某些超低功耗场景中完全替代主 CPU。 下表给出一般测得的电流数值:
场景 | 电流值 | Deep-sleep | 6 μA | Delay Nop | 1.4 mA | GPIO Toggle | 1.4 mA | SAR_ADC Sampling | 2.3 mA |
注意: 上表列出的电流消耗是在 ULP 协处理器引用 VDD3P3_RTC 工作电压,运行在 8 MHz,并且没有进入睡眠情况下测得的。当 ULP 协处理器设置为周期性的进入深度睡眠,在短时间内唤醒工作时,这些数字将会大大减少。因此,ULP 协处理器的理想工作状态是周期性唤醒,短暂工作之后,继续进入休眠状态,以短时间高效的工作和长时间的休眠换取低功耗平衡。
3. 配置 ULP 协处理器编译环境
ULP 协处理器目前只支持汇编开发,我们提供了三种不同平台(Linux,Windows,MacOS)的 ULP 协处理器编译环境的设置方法。
需说明:在安装汇编工具链之前,我们默认你已经安装和配置好 ESP32 ESP-IDF C 语言编译工具链,安装参考链接。
3.1 Linux
Linux 下配置编译环境比较简单,只需要下载汇编编译工具链,解压到安装目录中,再添加环境变量即可完成设置。
1. 下载工具链 binutils-esp32ulp toolchain Linux(x64)
2. 解压到要安装的目录,添加工具链的 bin 目录到环境变量 PATH 中。例如,解压目录是 /opt/esp32ulp-elf-binutils 那么添加 export PATH=/opt/esp32ulp-elf-binutils/bin:$PATH 这一行到 .bashrc 文件中,运行 source .bashrc 使上述环境变量生效,这样,ULP 的汇编环境就设置完毕了。
3.2 Windows
首先安装 Windows / MSYS2 下的 C 编译工具链可参考说明链接 ,之后再安装 ULP 协处理器编译工具链链接
1. 解压 ULP 工具链 esp32ulp-elf-binutils-win32-... 到 MSYS2 的 opt 目录中,一般建议使用 C:\msys32\opt 目录,因为 ESP32 toolchain xtensa-esp32-elf 也在这个目录下。
2. 打开位于目录 C:\msys32\etc\profile.d 下的 esp32_toolchain.sh 文件,把 ULP 工具链的 bin/目录添加到 path 中,设置例如:
- # This file was created by ESP-IDF windows_install_prerequisites.sh
- # and will be overwritten if that script is run again.
- export PATH="$PATH:/opt/xtensa-esp32-elf/bin:/opt/esp32ulp-elf-binutils/bin"
复制代码 3. 保存文件并重新打开 MSYS2 控制台。
4.设置到此完成,你可以编译 ULP 协处理器的例程了,可尝试编译ULP ADC例子。
3.3 MacOSMacOS 平台编译设置几乎是和 Linux 一样的,但需下载 MacOS 平台对应的编译工具链.
1. 下载 MacOS 平台的工具链
2. 解压工具链到安装目录,然后添加工具链的 bin/ 目录地址到 PATH 环境变量中,生效即可。
4. 编译 ULP 代码如果把 ULP 汇编代码编译为应用组件的一部分,必须采取以下步骤: - ULP_APP_NAME ?= ulp_$(COMPONENT_NAME)
- ULP_S_SOURCES = $(COMPONENT_PATH)/ulp/ulp_source_file.S
- ULP_EXP_DEP_OBJECTS := main.o
- include $(IDF_PATH)/components/ulp/component_ulp_common.mk
复制代码 3. 至此,可以编译包含 ULP 协处理器汇编代码的应用程序了。
5. ULP 协处理器的汇编指令汇编指令目前有 24 条,在 ULP coprocessor instruction set 获得更详细的说明。
算数与逻辑类运算的指令- 算数指令:加 ADD,减 SUB
- 逻辑指令:与 AND,或 OR
- 移位指令:左移 LSH,右移 RSH
- 寄存器指令:移动 MOVE
- 计数器寄存器操作:重置 STAGE_RST,
加载与数据储存类指令
- 内存加载数据指令:LD
- 储存数据至内存指令:ST
- 从外围寄存器读取数据指令:REG_RD
- 写数据到外围寄存器指令
跳转类指令
- 至绝对地址:JUMP
- 跳转至相对地址(基于 R0 寄存器判断):JUMPR
- 跳转至相对地址(基于阶段计数器寄存器判断):JUMPS
测量类指令
I2C 通讯指令
- I2C 读指令:I2C_RD
- I2C 写指令:I2C_WR
管理程序执行指令
控制协处理器睡眠周期
唤醒 CPU 及与 SOC 通信
6. ULP 协处理器的例程在 esp-iot-solution 目录下目前有一些 ULP 协处理器使用的例子供参考
Num | Examples | Note | 1 | ulp_hall_sensor | 在超低功耗模式下读取片内霍尔传感器例程 | 2 | ulp_rtc_gpio | 在 ULP mode 下操作 RTC GPIO 管脚翻转例子 | 3 | ulp_tsens | 在超低功耗模式下读片内温度传感器 | 4 | ulp_watering_device | 在超低功耗模式下使用 SAR_ADC 监测土壤湿度浇花的综合例程 |
7. 引用文档
本文作者 espressif
来源 CSDN
相关阅读:ESP32 AT 入门指南
ESP32 的 ULP 协处理器简介和汇编编译环境设置
ESP32 - ULP 协处理器在低功耗模式下操作 RTC GPIO
|