查看: 2978|回复: 0

[经验] ESP32 的 ULP 协处理器简介和汇编编译环境设置

[复制链接]

主题

好友

881

积分

举人

  • TA的每日心情
    无聊
    2019-1-9 09:43
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2019-2-28 17:02:54 |显示全部楼层
    本文介绍 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-sleep6 μA
    Delay Nop1.4 mA
    GPIO Toggle1.4 mA
    SAR_ADC Sampling2.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 中,设置例如:

    1. # This file was created by ESP-IDF windows_install_prerequisites.sh
    2. # and will be overwritten if that script is run again.
    3. export PATH="$PATH:/opt/xtensa-esp32-elf/bin:/opt/esp32ulp-elf-binutils/bin"
    复制代码
    3. 保存文件并重新打开 MSYS2 控制台。

    4.设置到此完成,你可以编译 ULP 协处理器的例程了,可尝试编译ULP ADC例子。

    3.3 MacOS

    MacOS 平台编译设置几乎是和 Linux 一样的,但需下载 MacOS 平台对应的编译工具链.
    1. 下载 MacOS 平台的工具链
    2. 解压工具链到安装目录,然后添加工具链的 bin/ 目录地址到 PATH 环境变量中,生效即可。



    4. 编译 ULP 代码

    如果把 ULP 汇编代码编译为应用组件的一部分,必须采取以下步骤:

    • ULP 的代码是汇编写的,并且文件后缀格式是.S, 这些汇编文件必须放在一个单独的目录中,例如 ulp/
    • 修改 makefile 添加如下内容,一些详细的定义在 Compiling ULP code 可以找到解释。


    1. ULP_APP_NAME ?= ulp_$(COMPONENT_NAME)
    2. ULP_S_SOURCES = $(COMPONENT_PATH)/ulp/ulp_source_file.S
    3. ULP_EXP_DEP_OBJECTS := main.o
    4. 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

    测量类指令
    • 模拟量测量:ADC
    • 内部温度传感器测量:TSENS

    I2C 通讯指令
    • I2C 读指令:I2C_RD
    • I2C 写指令:I2C_WR

    管理程序执行指令
    • 等待延时指令:WAIT
    • 结束停止指令:HALT

    控制协处理器睡眠周期
    • 休眠指令:SLEEP

    唤醒 CPU 及与 SOC 通信
    • 唤醒 CPU 指令:WAKE

    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

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条



    手机版|电路城

    GMT+8, 2020-7-7 18:20 , Processed in 0.067036 second(s), 12 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz!

    返回顶部