程序还在研究中,先放出来。此程序让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), …
请微信扫码打赏,留言中输入文章编号. 附费后将自动刷新出完整内容.