查看: 10754|回复: 4

[经验] ESP32 - ULP 协处理器在低功耗模式下操作 RTC GPIO

[复制链接]
  • TA的每日心情
    无聊
    2019-1-9 09:43
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2019-3-1 15:27:21 | 显示全部楼层 |阅读模式
    分享到:
    本文目的是介绍 ESP32 如何在 ULP 协处理器中操作 RTC GPIO

    1. RTC GPIO

    RTC GPIO 一共有 18 个 IO 口,这些 GPIO 管脚具有低功耗 RTC 性能和模拟功能,并且由 ESP32 的 RTC 子系统控制。这些功能不使用 IO_MUX 和 GPIO 交换矩阵,而是使用 RTC_MUX 将 IO 指向 RTC 子系统。

    当这些管脚被配置为 RTC GPIO 管脚时,作为输出的管脚能够在芯片处于 Deep-Sleep 睡眠状态下保持输出电平值,或者作为输入管脚使用时可以将芯片从 Deep-Sleep 中唤醒。

    下表列出了 RTC 管脚和其对应的 GPIO 管脚
    1.png

    在本例子中,我们使用 GPIO25,GPIO26 指示 CPU 的工作状态;GPIO4,GPIO27 指示 ULP 协处理器的状态。
    2.png

    2. RTC GPIO 翻转图示

    本例子主 CPU 设置 ULP 协处理器每隔 10ms 唤醒自身一次 并且 ULP 协处理器每隔 8 个唤醒周期后,再唤醒主 CPU 一次,依此循环。每次处理器状态切换时,均有相应的 GPIO 翻转指示当前的状态。

    3.png


    3.软件部分


    ESP32 的 C 语言编译环境安装和配置参照 链接地址,另外 ULP 协处理器目前只支持汇编编程,所以还需要安装汇编工具链,下面介绍汇编工具链的安装和配置。


    3.1 汇编环境的配置


    ULP 协处理器配置汇编编译工具链,只需两步即可安装配置完毕,下面给出 ubuntu 操作系统下配置的步骤,或者点击 链接地址 获得更多 ULP 编程信息

    第一步, 下载工具链 binutils-esp32ulp toolchain 链接地址, 解压到需要安装的目录

    第二步,添加工具链的 bin 目录到系统环境变量 PATH 中。例如我的解压目录是 /opt/esp32ulp-elf-binutils 那么添加 export PATH=/opt/esp32ulp-elf-binutils/bin:$PATH 这一行到 /home 目录的隐藏文件 .bashrc 文件最后一行,保存关闭文件并使用命令 source .bashrc 使上述环境变量生效


    至此,汇编编译环境就安装好了,将 ulp_rtc_gpio/ 目录下的 sdkconfig.defaults 复制一份改名为 sdkconfig,然后在工程中使用 make all -j8 && make flash monitor 编译并烧录命令时,会自动调用汇编工具链编译汇编代码。

    3.2 汇编代码介绍


    需要注意:每个 GPIO(包括 RTC GPIO)都有单独的 hold 功能,由 RTC 寄存器控制。 GPIO 的 hold 功能被置上后, GPIO 在置上 hold 那一刻的状态被强制保持,无论内部信号如何变化,修改 IO_MUX 配置或者 GPIO 配置,都不会改变 GPIO 的状态。所以如果希望在看门狗超时触发内核复位或系统复位时亦或者 Deep-sleep 时 GPIO 的状态不被改变,就需要提前把相应GPIO 的 hold 功能置位。


    在下面的汇编代码中,我们需要操作 RTC_GPIO10, 则先应 disable RTC_GPIO10 管脚的 hold 功能后,再操作 RTC_GPIO10 输出高

    1.     .global entry
    2. entry:
    3.     /* Disable hold of RTC_GPIO10 output */
    4.     WRITE_RTC_REG(RTC_IO_TOUCH_PAD0_REG,RTC_IO_TOUCH_PAD0_HOLD_S,1,0)
    5.     /* Set the RTC_GPIO10 output HIGH to signal that ULP is now up */
    6.     WRITE_RTC_REG(RTC_GPIO_OUT_W1TS_REG,RTC_GPIO_OUT_DATA_W1TS_S+10,1,1)
    7.     /* Wait some cycles to have visible trace on the scope */
    8.     wait 1000
    复制代码

    同理,在进入 Deep-Sleep 之前,拉低 RTC_GPIO10 之后,则需要把 RTC_GPIO10 管脚的 hold 功能置位,使其在系统复位时能够保持原来的电平状态

    1.     .global toggle_complete
    2. toggle_complete:
    3.     /* Set the RTC_GPIO10 output LOW (clear output) to signal that ULP is now going down */
    4.     WRITE_RTC_REG(RTC_GPIO_OUT_W1TC_REG,RTC_GPIO_OUT_DATA_W1TC_S+10,1,1)
    5.     /* Enable hold on RTC_GPIO10 output */
    6.     WRITE_RTC_REG(RTC_IO_TOUCH_PAD0_REG,RTC_IO_TOUCH_PAD0_HOLD_S,1,1)
    7.     /* Compare the toggle counter with toggle cycles to wakeup SoC  and wakup SoC if the values match */
    8.     and r0, r3, toggle_cycles_to_wakeup
    9.     jump wake_up, eq
    复制代码

    4. 额外说明 4.png

    如果你运行了这个例子,而且试图分析各个处理器切换状态,可能会遇到上图中额外多出的 98ms 的疑惑。这里需要说明的是,汇编程序 Polling CPU 并唤醒 CPU 时间是很短的,绝大部分的时间是用来 boot 主 CPU 的(例如主 CPU 上电动作、一级 Bootloader 加载打印等时间消耗)。因为在 DeepSleep 状态下 CPU 的各个模块都是被关掉的,如内部 8MHz 振荡器、40MHz 高速晶振、PLL 及射频模块均禁用;数字内核断电,CPU 内容丢失,这里有一个重新上电加载的过程。


    1.     /* Get ULP back to sleep */
    2.     .global exit
    3. exit:
    4.     halt
    5.     .global wake_up
    6. wake_up:
    7.     /* Check if the SoC can be woken up */
    8.     READ_RTC_REG(RTC_CNTL_DIAG0_REG, 19, 1)
    9.     and r0, r0, 1
    10.     jump exit, eq
    11.     /* Wake up the SoC and stop ULP program */
    12.     wake
    13.     /* Stop the wakeup timer so it does not restart ULP */
    14.     WRITE_RTC_FIELD(RTC_CNTL_STATE0_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN, 0)
    15.     halt
    复制代码



    ---------------------
    作者:espressif
    来源:CSDN


    相关阅读:ESP32 AT 入门指南
    ESP32 的 ULP 协处理器简介和汇编编译环境设置
    ESP32 - ULP 协处理器在低功耗模式下操作 RTC GPIO

    回复

    使用道具 举报

  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2019-4-4 10:37:25 | 显示全部楼层
    看看了 522.jpg
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2019-4-12 16:03:48 | 显示全部楼层
    我也是看看,没有人气呀
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-14 09:32
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2020-12-4 13:08:12 | 显示全部楼层
    牛,就是说deepsleep下是可以控制GPIO状态的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2021-5-19 12:51:20 | 显示全部楼层
    大佬,源码能发出来看看吗
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 20:20 , Processed in 0.165051 second(s), 29 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.