Chapter 4. API Guides
Some existing macros are defined in soc/soc_ulp.h header file. These macros allow access to the fields of
peripheral registers by their names. Peripheral registers names which can be used with these macros are the ones
defined in soc/rtc_cntl_reg.h, soc/rtc_io_reg.h, soc/sens_reg.h, and soc/rtc_i2c_reg.
h.
READ_RTC_REG(rtc_reg, low_bit, bit_width) Read up to 16 bits from rtc_reg[low_bit + bit_width - 1 :
low_bit] into R0. For example:
#include "soc/soc_ulp.h"
#include "soc/rtc_cntl_reg.h"
/*
Read
16
lower bits of RTC_CNTL_TIME0_REG into R0
READ_RTC_REG(RTC_CNTL_TIME0_REG, 0, 16)
READ_RTC_FIELD(rtc_reg, field) Read from a field in rtc_reg into R0, up to 16 bits. For example:
#include "soc/soc_ulp.h"
#include "soc/sens_reg.h"
/*
Read 8-bit SENS_TSENS_OUT field of SENS_SAR_SLAVE_ADDR3_REG into R0
READ_RTC_FIELD(SENS_SAR_SLAVE_ADDR3_REG, SENS_TSENS_OUT)
WRITE_RTC_REG(rtc_reg, low_bit, bit_width, value) Write immediate value into rtc_reg[low_bit + bit_width
- 1 : low_bit], bit_width <= 8. For example:
#include "soc/soc_ulp.h"
#include "soc/rtc_io_reg.h"
/*
Set BIT(2) of RTC_GPIO_OUT_DATA_W1TS field
WRITE_RTC_REG(RTC_GPIO_OUT_W1TS_REG, RTC_GPIO_OUT_DATA_W1TS_S
WRITE_RTC_FIELD(rtc_reg, field, value) Write immediate value into a field in rtc_reg, up to 8 bits. For ex-
ample:
#include "soc/soc_ulp.h"
#include "soc/rtc_cntl_reg.h"
/*
Set RTC_CNTL_ULP_CP_SLP_TIMER_EN field of RTC_CNTL_STATE0_REG to
WRITE_RTC_FIELD(RTC_CNTL_STATE0_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN, 0)
4.28.2 Programming ULP coprocessor using C macros (legacy)
In addition to the existing binutils port for the ESP32 ULP coprocessor, it is possible to generate programs for the
ULP by embedding assembly-like macros into an ESP32 application. Here is an example how this can be done:
const ulp_insn_t program[]
I_MOVI(R3, 16),
I_LD(R0, R3, 0),
I_LD(R1, R3, 1),
I_ADDR(R2, R0, R1),
I_ST(R2, R3, 2),
I_HALT()
};
size_t load_addr
=
0;
size_t size
=
sizeof(program)/sizeof(ulp_insn_t);
ulp_process_macros_and_load(load_addr, program, &size);
ulp_run(load_addr);
The program array is an array of ulp_insn_t, i.e. ULP coprocessor instructions. Each I_XXX preprocessor
define translates into a single 32-bit instruction. Arguments of these preprocessor defines can be register numbers
(R0 —R3) and literal constants. See
arguments they take.
Espressif Systems
=
{
//
R3
<-
16
//
R0
<-
RTC_SLOW_MEM[R3
//
R1
<-
RTC_SLOW_MEM[R3
//
R2
<-
R0
+
R1
//
R2
->
RTC_SLOW_MEM[R2
ULP coprocessor instruction defines
1491
Submit Document Feedback
*/
in
RTC_GPIO_OUT_W1TS_REG
+
2, 1, 1)
+
0]
+
1]
+
2]
section for descriptions of instructions and
*/
*/
0
*/
Release v4.4
Need help?
Do you have a question about the ESP32-S2 and is the answer not in the manual?
Questions and answers