查看: 8407|回复: 0

[经验] ESP32 - ULP 协处理器在超低功耗模式下软件模拟 I2C 读取光照...

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

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2019-3-8 14:23:10 | 显示全部楼层 |阅读模式
    分享到:
    文是关于 ESP32 - ULP 协处理器在低功耗模式下模拟 I2C 主机读取光照传感器 BH1750 的例子


    1. I2C 管脚分配

    软件模拟 I2C 的例子使用 RTC_GPIO9, RTC_GPIO8 两个管脚, 对应的 GPIO 管脚如下表

    I2C_PINRTC_GPIOGPIO
    I2C_SCLRTC_GPIO9GPIO32
    I2C_SDARTC_GPIO8GPIO33


    2.软件环境配置

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

    2.1 汇编环境的配置

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


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

    2.2 配置编译烧录

    至此,汇编编译环境就安装好了,在 ulp_i2c_bitbang/ 目录下依次运行以下命令,进行 default config 配置并编译、烧录程序。

    • make defconfig
    • make all -j8 && make flash monitor
    [color=rgba(0, 0, 0, 0.501960784313726)]


    3. stack.S 堆栈宏说明
    由于当前 ULP 协处理器汇编环境没有实现关于子函数的调用和返回堆栈保存等操作,需要用户来实现和构造这部分。所以在四个通用寄存器中我们牺牲 R3 寄存器用来当做栈指针,实现了 4 个关于堆栈操作的宏 PUSH、POP、PSR、RET,以上的宏在 stack.S 汇编文件中。

    1. push,这个操作是把 Rx(R0,R1,R2)的数据压到 R3 所指向的栈里,栈指针向下增长


    1. .macro push rx
    2.     st \rx,r3,0
    3.     sub r3,r3,1
    4. .endm
    复制代码
    2.pop,把 R3 所指向的栈里的数据保存到 Rx(R0,R1,R2)中,栈指针回退
    1. .macro pop rx
    2.     add r3,r3,1
    3.     ld \rx,r3,0
    4. .endm
    复制代码
    3.psr,这个宏是计算出函数执行完毕后需要返回的地址,将其保存到栈上,即当前地址加上偏移 16 就是子函数跳转执行完毕后需要返回的地址
    1. .macro psr
    2.     .set addr, (.+16)
    3.     move r1, addr
    4.     push r1
    5. .endm
    复制代码
    4.ret,此宏是把栈上保存的返回地址取出来,然后跳转到这个地址
    1. .macro ret
    2.     pop r1
    3.     jump r1
    4. .endm
    复制代码


    4. i2c.S 汇编函数说明
    TIM截图20190308142032.png

    5. i2c_dev.S 汇编函数
    2.png

    6. 读取光照传感器

    I2C 设置 BH1750 的时序如下

    4.png

    I2C 测量 BH1750 的光照结果,时序如下

    3.png

    ULP 协处理器通过软件模拟 I2C 读取 BH1750 的光照强度打印在如下图中,通过遮挡传感器的光栅窗口可获得不同的光照数值。

    5.png


    7. 总结

    我们构造了 4 个用于堆栈管理的宏,我们可以方便的进行函数跳转和函数返回,软件模拟 I2C 比硬件指令 I2C 更为灵活,可以实现更为大型和复杂的 ESP32 低功耗应用。

    作者 espressif

    来源 CSDN




    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 19:51 , Processed in 0.126878 second(s), 16 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.