- Notifications
You must be signed in to change notification settings - Fork 26
Open
Description
I would like an example of how to use WAKE because I'm not quite sure how it's supposed to work. I'll contribute one if I can, but right now it doesn't work. Should it?
# # Example of putting the main processor to sleep then waking it up # via the ULP after a while # from esp32 import ULP from machine import mem32 import machine from esp32_ulp import src_to_binary source = """\ #define RTC_CNTL_LOW_POWER_ST_REG 0x3FF480c0 #define RTC_CNTL_RDY_FOR_WAKEUP BIT(19) entry: MOVE r0, 2000 loop: WAIT 40000 // at 8 MHz this is 5 msec, if we do this 1000 times that's 5 seconds SUB r0, r0, 1 jump is_rdy_for_wakeup, eq jump loop is_rdy_for_wakeup: // Read RTC_CNTL_RDY_FOR_WAKEUP bit # # This test was described in https://github.com/espressif/esp-idf/issues/8341 # See reference manual 31.19. # # The main issue with this is that it will hang if the main CPU wasn't in deep sleep. # READ_RTC_FIELD(RTC_CNTL_LOW_POWER_ST_REG, RTC_CNTL_RDY_FOR_WAKEUP) AND r0, r0, 1 JUMP is_rdy_for_wakeup, eq // Retry until the bit is set WAKE // Trigger wake up HALT // Stop the ULP program """ # # Compile the ULP code # binary = src_to_binary(source) load_addr, entry_addr = 0, 0 ULP_MEM_BASE = 0x50000000 ULP_DATA_MASK = 0xffff # ULP data is only in lower 16 bits ulp = ULP() ulp.load_binary(load_addr, binary) # # The ULP starts out asleep (halted), so set a timer to wake it # up the first time. # # ulp.set_wakeup_period(0, 50000) # use timer0, wakeup after 50.000 cycles mem32[ULP_MEM_BASE + load_addr] = 0x1000 ulp.run(entry_addr) print("going to sleep") # I think this should enable ULP wakeup mem32[ 0x3ff48038 ] = 0x200 << 10 machine.deepsleep() # # We won't ever reach this, because WAKE is going to cause the main # processor to reset and start over at the beginning. # print("I am awake again")Metadata
Metadata
Assignees
Labels
No labels