(费) ESP32在Arduino IDE中运行Ulp程序

请微信扫码打赏,留言中输入文章编号. 附费后将自动刷新出完整内容.

程序还在研究中,先放出来。此程序让ULP控制板载LED闪烁。文章陆续更新…

官方原生的esp-idf环境是支持通过汇编使用ULP的,但在arduino也不应该浪费这个好东西:它让主板等东西都去休息,只让低功耗处理器ULP做点简单的事。(其实这都是电耗闹的) 这样,也让我减轻点关于使用arduino还是esp-idf的纠结。

#include "esp32/ulp.h"
#include "driver/rtc_io.h"
#include "UlpDebug.h"

// 慢速内存变量分配
enum {
  SLOW_BLINK_STATE,     // Blink状态
  SLOW_PROG_ADDR        // 程序开始地址
};

void ULP_BLINK(uint32_t us) {
  ulp_set_wakeup_period(0, us);  // 设置ULP激活间隔

  memset(RTC_SLOW_MEM, 0, 8192);  // 慢速内存初始化
  RTC_SLOW_MEM[SLOW_BLINK_STATE] = 0;  // Blink状态初始化

  // 接口闪烁 (specify by +14)
  const int pin_blink_bit = RTCIO_GPIO2_CHANNEL + 14;
  const gpio_num_t pin_blink = GPIO_NUM_2;

  // PIN初始化
  rtc_gpio_init(pin_blink);
  rtc_gpio_set_direction(pin_blink, RTC_GPIO_MODE_OUTPUT_ONLY);
  rtc_gpio_set_level(pin_blink, 0);

  // ULP程序
  const ulp_insn_t  ulp_prog[] = {
    I_MOVI(R3, SLOW_BLINK_STATE),           // R3 = SLOW_BLINK_STATE
    I_LD(R0, R3, 0),                        // R0 = RTC_SLOW_MEM[R3(SLOW_BLINK_STATE)]
    M_BL(1, 1),                             // IF R0 < 1 THAN GOTO M_LABEL(1)

    // R0 => 1 : run
    I_WR_REG(RTC_GPIO_OUT_REG, pin_blink_bit, pin_blink_bit, 1), // pin_blink_bit = 1
    I_MOVI(R0, 0),                          // R0 = 0
    I_ST(R0, R3, 0),                        // RTC_SLOW_MEM[R3(SLOW_BLINK_STATE)] = R0
    M_BX(2),                                // GOTO M_LABEL(2)

    // R0 < 1 : run
    M_LABEL(1),                             // M_LABEL(1)
    I_WR_REG(RTC_GPIO_OUT_REG, pin_blink_bit, pin_blink_bit, 0),// pin_blink_bit = 0
    I_MOVI(R0, 1),                          // R0 = 1
    I_ST(R0, R3, 0),                        // RTC_SLOW_MEM[R3(SLOW_BLINK_STATE)] = R0

    M_LABEL(2),                             // M_LABEL(2)
    I_DELAY(60000),
    I_DELAY(60000),
    I_DELAY(60000), …
请微信扫码打赏,留言中输入文章编号. 附费后将自动刷新出完整内容.

相关文章