参考文档:
- 《ESP32-S2 技术参考手册》 中 “1. 超低功耗协处理器 (ULP)” 章节
- 《ESP32-S3 技术参考手册》 中 “2 超低功耗协处理器 (ULPFSM, ULPRISCV)” 章节
- 《ESP32-C6 技术参考手册》 中 “3 低功耗处理器” 章节
- ULP 协处理器编程
- ULP RISC-V 协处理器编程
- Programming ULP FSM coprocessor using C macros (legacy)
- ESP32-S3 ULP coprocessor instruction set
- ULP 例程:esp-idf/examples/system/ulp
- ULP FSM 例程:esp-iot-solution/examples/ulp_examples
- 什么是 ULP 超低功耗协处理器?
- 支持 ULP (超低功耗)协处理器的产品有哪些?
- ULP-RISC-V 协处理器与 ULP-FSM 协处理器的区别
- ULP-FSM 与 ULP-RISC-V 支持的具体特性
- ESP32-S2 、ESP32-S3 与 ESP32-C6 的
ULP-FSM
与ULP-RISCV
协处理器对比- ULP-RISC-V 协处理器工作流程
- ULP-RISC-V 协处理器的具体应用
- ULP 应用与 DeepSleep 的功耗对比
什么是 ULP (Ultra Low Power)超低功耗协处理器?
ULP 超低功耗协处理器 (ULP, Ultra-Low-Power coprocessor)
是一种功耗极低的处理器设备,可在芯片进入 Deepsleep 时保持上电,允许开发者将 ULP 协处理器的程序存放在 RTC 慢速存储器
中,使其能够在 Deep-sleep 模式下访问 RTC 外设、内部传感器及 RTC 寄存器。在对功耗敏感的场景下,主 CPU 处于睡眠状态以降低功耗,ULP 协处理器可以由协处理器定时器唤醒
,通过控制 RTC GPIO、RTC I2C、SAR ADC、温度传感器 (TSENS) 等外设监测外部环境或与外部电路进行交互,并在达到唤醒条件时主动唤醒主 CPU。
无论主 CPU 是否处于休眠状态,ULP 协处理器可独立于主 CPU 运行,是主 CPU 的有力补充,甚至可以在一些功耗敏感的设计中取代 主CPU。
支持 ULP (超低功耗)协处理器的产品有哪些?
产品 | ESP8266 | ESP32 | ESP32-S2 | ESP32-S3 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 |
---|---|---|---|---|---|---|---|---|---|
ULP | NO | Yes | Yes | Yes | NO | NO | Yes | Yes | NO |
ULP-RISC-V 协处理器与 ULP-FSM 协处理器的区别
目前,我们的产品提供了两种类型的 ULP 协处理器,分别是:
ULP-RISC-V (发音为"risk five")协处理器
:基于 RISC-V 指令集 (ULP-RISC-V)ULP-FSM (Finite State Machine)协处理器
:基于有限状态机 FSM 架构 (ULP-FSM)
产品 | ESP32 | ESP32-S2 | ESP32-S3 | ESP32-C5 | ESP32-C6 |
---|---|---|---|---|---|
ULP_FSM | Yes | Yes | Yes | NO | NO |
ULP_RISC-V | NO | Yes | Yes | Yes | Yes |
注意:两个 ULP 协处理器不能同时使用。用户只能选择其中一个 ULP 超低功耗协处理器工作。
ULP-FSM 与 ULP-RISC-V 的特性
ULP-FSM
协处理器不支持高级语言,用户需使用 ULP-FSM 专门指令集进行编程(汇编语言
编写(必须使用 .S
扩展名))
-
ULP-FSM
协处理器具有以下特性:- 支持常用指令,包括运算、跳转、控制等
- 支持传感器专用指令
- 支持被主 CPU、专用定时器、RTC GPIO 启动
ULP-RISC-V
协处理器支持用户使用 C 语言
(或汇编语言)编写程序,然后使用编译器(基于 GCC 的 RISC-V 工具链)将程序编译成 RV32IMC 标准指令码。
ULP-RISCV
协处理器具有以下特性:- 支持 RV32IMC 指令集
- 32 个 32 位通用寄存器
- 32 位乘除法器
- 支持中断
- 支持被主 CPU、专用定时器、RTC GPIO 启动
ESP32-S2 、ESP32-S3 与 ESP32-C6 的 ULP-FSM
与 ULP-RISCV
协处理器对比
ULP-RISC-V 协处理器工作流程
- 编写 ULP 协处理器运行的用户程序
- 使用 ulp_riscv_load_binary() 将程序下载到 ULP 存储器中,即
RTC_SLOW_MEM
- 使用 ulp_set_wakeup_period() 设置 ULP 定时器唤醒时间周期,即通过
ULP 定时器
定时唤醒ULP-RISCV 协处理器
- 使用
ulp_riscv_run
运行ULP-RISCV 协处理器
的用户程序。 - 使用
esp_sleep_enable_ulp_wakeup()
使能ULP 唤醒源
,用于唤醒DeepSleep
模式
- 使用
esp_deep_sleep_start()
进入deepsleep
模式
ULP-RISC-V 协处理器的具体应用
ESP32-S2 与 ESP32-S3 的 ULP-RISC-V 协处理器应用例程
- esp-idf/examples/system/ulp/ulp_riscv/gpio
通过检测 RTC GPIO 的电平状态来唤醒 Deepsleep
- esp-idf/examples/system/ulp/ulp_riscv/gpio_interrupt
这里的程序看上去使用
RTC GPIO
中断来唤醒ULP-RISC-V 协处理器
的,但其实 ULP-RISC-V 协处理器只有一个唤醒源
就是ULP Timer
,但是这个ULP Timer
可以通过软件设置触发或者RTC GPIO 中断触发
,也就是整个唤醒过程是RTC GPIO 中断
-->ULP Timer
-->ULP ULP-RISC-V 协处理器
,可以理解为是利用RTC GPIO
间接唤醒了ULP ULP-RISC-V 协处理器
。
- esp-idf/examples/system/ulp/ulp_riscv/adc
通过检测 RTC ADC 通道的电压大小,当电压达到软件设置的
ADC 阈值
时将唤醒Deepsleep
- esp-idf/examples/system/ulp/ulp_riscv/uart_print
演示了对 ULP-RISC-V 协处理器进行编程以对 UART TX 线进行位控制。即使主 CPU 处于深度睡眠状态,也可用于直接记录来自 ULP 的输出。
- esp-idf/examples/system/ulp/ulp_riscv/i2c
使用 ULP 协处理器在低功耗模式下模拟 I2C 主机读取 BMP180 温度传感器和压力传感器的数据。定期测量 BMP180 传感器的温度和压力值,并在值高于某个阈值时唤醒主 CPU。
适用场景:
- 健康监测:比如心率、血氧传感器,当数据高于某个阈值时唤醒 CPU,进行上报,以检测身体状态。
- 消防安全:比如烟雾监测传感器,当烟雾达到一定浓度时,唤醒 CPU 进行报警。
- 工业环境:比如恒温车间,通过温度传感器监测环境温度,当温度高于某个阈值时,唤醒 CPU 进行报警。
- 畜牧养殖:比如孵化小鸡,通过光照传感器监测光照强度,当光照强度高于某个阈值时,唤醒 CPU 停止外部光照
- esp-idf/examples/system/ulp/ulp_riscv/touch
对 ULP RISC-V 协处理器进行编程以读取触摸板传感器。
- 水位监测:比如鱼缸应用,通过设置不同高度的触摸滑条,来监测水位,当水位到达设定的触摸滑条高度时,唤醒 CPU 停止外部供水。
- esp-idf/examples/system/ulp/ulp_riscv/ds18b20_onewire
通过
RTC GPIO
模拟OneWire
协议来读取DS18B20 温度传感器
的数据,当数据超过设定的限制时,唤醒 CPU 进行数据上报。
ESP32-C6 的 ULP-RISC-V 协处理器应用例程
-
esp-idf/examples/system/ulp/lp_core/gpio
-
esp-idf/examples/system/ulp/lp_core/lp_i2c
LP_I2C 和 I2C 的功能差异如下:
LP I2C
可以在 HP CPU 下运行,使用 LP I2C 只需要注意:
- 硬件上需要使用
LP I2C
管脚lp_i2c_num
设置为LP_I2C_NUM_0
LP I2C
默认使用RC_FAST_CLK
,如果需要改为XTAL_CLK
,则在i2c_config_t
里配置.soc_periph_i2c_clk_src_t = I2C_CLK_SRC_XTAL;
即可。LP I2C
相关的 API 带有LP
前缀的,比如i2c_master_init()
和i2c_slave_init()
是I2C
可使用;lp_core_i2c_master_init()
是LP I2C
可使用。
- esp-idf/examples/system/ulp/lp_core/lp_uart/lp_uart_echo
- esp-idf/examples/system/ulp/lp_core/lp_uart/lp_uart_print
ESP32-C6 的
UART 控制器
与LP UART 控制器
的特性区分见下表:
LP UART
可以在HP CPU
下运行,使用LP UART
只需要注意:
- 硬件上需要使用
LP UART
管脚lp_uart_num
设置为LP_UART_NUM_0
LP UART
默认使用RC_FAST_CLK
,如果需要改为XTAL_CLK
,则在uart_config_t
里配置.lp_source_clk = LP_UART_SCLK_XTAL_D2;
即可。LP UART
相关的 API 带有LP
前缀的,比如uart_read_bytes()
和uart_write_bytes()
是UART
可使用;lp_core_uart_write_bytes()
和lp_core_uart_read_bytes()
是LP UART
可使用。
ULP-RISC-V 应用与 Deepsleep 功耗对比
在 Deep Sleep
模式下使用 ULP 协处理器,底电流
的大小和 Deep Sleep
相同,同时从图中可以看出,还会有定期的 ULP 处理器
唤醒的功耗。因此平均功耗比起普通的 Deep Sleep
要高一点,但是当唤醒的间隔足够长时,就无限接近于 Deep Sleep
的底电流。