ESP 系列的产品 ULP 协处理器的应用

参考文档:

  • 《ESP32-S2 技术参考手册》 中 “1. 超低功耗协处理器 (ULP)” 章节
  • 《ESP32-S3 技术参考手册》 中 “2 超低功耗协处理器 (ULP­FSM, ULP­RISC­V)” 章节
  • 《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-FSMULP­-RISC­V 协处理器对比
  • 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 扩展名))
ESP 系列的产品 ULP 协处理器的应用_第1张图片

  • ULP-­FSM 协处理器具有以下特性:

    • 支持常用指令,包括运算、跳转、控制等
    • 支持传感器专用指令
    • 支持被主 CPU、专用定时器、RTC GPIO 启动

ULP-RISC-V 协处理器支持用户使用 C 语言(或汇编语言)编写程序,然后使用编译器(基于 GCC 的 RISC-V 工具链)将程序编译成 RV32IMC 标准指令码。
ESP 系列的产品 ULP 协处理器的应用_第2张图片

  • ULP­-RISC­V 协处理器具有以下特性:
    • 支持 RV32IMC 指令集
    • 32 个 32 位通用寄存器
    • 32 位乘除法器
    • 支持中断
    • 支持被主 CPU、专用定时器、RTC GPIO 启动

ESP32-S2 、ESP32-S3 与 ESP32-C6 的 ULP-FSMULP­-RISC­V 协处理器对比

ESP 系列的产品 ULP 协处理器的应用_第3张图片


ULP-RISC-V 协处理器工作流程

ESP 系列的产品 ULP 协处理器的应用_第4张图片

  • 编写 ULP 协处理器运行的用户程序
  • 使用 ulp_riscv_load_binary() 将程序下载到 ULP 存储器中,即 RTC_SLOW_MEM
  • 使用 ulp_set_wakeup_period() 设置 ULP 定时器唤醒时间周期,即通过 ULP 定时器定时唤醒 ULP­-RISC­V 协处理器
  • 使用 ulp_riscv_run 运行 ULP­-RISC­V 协处理器的用户程序。
  • 使用 esp_sleep_enable_ulp_wakeup() 使能 ULP 唤醒源,用于唤醒 DeepSleep 模式

ESP 系列的产品 ULP 协处理器的应用_第5张图片

  • 使用 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 的功能差异如下:

    ESP 系列的产品 ULP 协处理器的应用_第6张图片

  • 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 控制器的特性区分见下表:

ESP 系列的产品 ULP 协处理器的应用_第7张图片

  • 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 的底电流。

ESP 系列的产品 ULP 协处理器的应用_第8张图片

你可能感兴趣的:(ESP,应用需求实现,c语言,编辑器)