| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /* ULP Example: pulse counting
- This example code is in the Public Domain (or CC0 licensed, at your option.)
- Unless required by applicable law or agreed to in writing, this
- software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- CONDITIONS OF ANY KIND, either express or implied.
- This file contains assembly code which runs on the ULP.
- ULP wakes up to run this code at a certain period, determined by the values
- in SENS_ULP_CP_SLEEP_CYCx_REG registers. On each wake up, the program checks
- the input on GPIO0. If the value is different from the previous one, the
- program "debounces" the input: on the next debounce_max_count wake ups,
- it expects to see the same value of input.
- If this condition holds true, the program increments edge_count and starts
- waiting for input signal polarity to change again.
- When the edge counter reaches certain value (set by the main program),
- this program running triggers a wake up from deep sleep.
- */
- /* ULP assembly files are passed through C preprocessor first, so include directives
- and C macros may be used in these files
- */
- #include "soc/rtc_cntl_reg.h"
- #include "soc/rtc_io_reg.h"
- #include "soc/soc_ulp.h"
- /* Define variables, which go into .bss section (zero-initialized data) */
- .bss
- /* Next input signal edge expected: 0 (negative) or 1 (positive) */
- .global next_edge
- next_edge:
- .long 0
- /* Counter started when signal value changes.
- Edge is "debounced" when the counter reaches zero. */
- .global debounce_counter
- debounce_counter:
- .long 0
- /* Value to which debounce_counter gets reset.
- Set by the main program. */
- .global debounce_max_count
- debounce_max_count:
- .long 0
- /* Total number of signal edges acquired */
- .global edge_count
- edge_count:
- .long 0
- /* Number of edges to acquire before waking up the SoC.
- Set by the main program. */
- .global edge_count_to_wake_up
- edge_count_to_wake_up:
- .long 0
- /* RTC IO number used to sample the input signal.
- Set by main program. */
- .global io_number
- io_number:
- .long 0
- /* Code goes into .text section */
- .text
- .global entry
- entry:
- /* Read the value of lower 16 RTC IOs into R0 */
- READ_RTC_FIELD(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT)
- /* Load io_number, extract the state of input */
- move r3, io_number
- ld r3, r3, 0
- rsh r0, r0, r3
- and r0, r0, 1
- /* State of input changed? */
- move r3, next_edge
- ld r3, r3, 0
- add r3, r0, r3
- and r3, r3, 1
- jump changed, eq
- /* Not changed */
- /* Reset debounce_counter to debounce_max_count */
- move r3, debounce_max_count
- move r2, debounce_counter
- ld r3, r3, 0
- st r3, r2, 0
- /* End program */
- halt
- .global changed
- changed:
- /* Input state changed */
- /* Has debounce_counter reached zero? */
- move r3, debounce_counter
- ld r2, r3, 0
- add r2, r2, 0 /* dummy ADD to use "jump if ALU result is zero" */
- jump edge_detected, eq
- /* Not yet. Decrement debounce_counter */
- sub r2, r2, 1
- st r2, r3, 0
- /* End program */
- halt
- .global edge_detected
- edge_detected:
- /* Reset debounce_counter to debounce_max_count */
- move r3, debounce_max_count
- move r2, debounce_counter
- ld r3, r3, 0
- st r3, r2, 0
- /* Flip next_edge */
- move r3, next_edge
- ld r2, r3, 0
- add r2, r2, 1
- and r2, r2, 1
- st r2, r3, 0
- /* Increment edge_count */
- move r3, edge_count
- ld r2, r3, 0
- add r2, r2, 1
- st r2, r3, 0
- /* Compare edge_count to edge_count_to_wake_up */
- move r3, edge_count_to_wake_up
- ld r3, r3, 0
- sub r3, r3, r2
- jump wake_up, eq
- /* Not yet. End program */
- halt
- .global wake_up
- wake_up:
- /* Check if the system can be woken up */
- READ_RTC_FIELD(RTC_CNTL_LOW_POWER_ST_REG, RTC_CNTL_RDY_FOR_WAKEUP)
- and r0, r0, 1
- jump wake_up, eq
- /* Wake up the SoC, end program */
- wake
- halt
|