This ensures the same number of cycles are used for LED on and LED off in the PIO 1Hz example. It's also possible to swap the first set() and the irq() to avoid using an extra instruction, but this tutorial is a good example of how to calculate the cycles. Signed-off-by: Stig Bjørlykke <stig@bjorlykke.org>
37 lines
885 B
Python
37 lines
885 B
Python
# Example using PIO to blink an LED and raise an IRQ at 1Hz.
|
|
|
|
import time
|
|
from machine import Pin
|
|
import rp2
|
|
|
|
|
|
@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW)
|
|
def blink_1hz():
|
|
# fmt: off
|
|
# Cycles: 1 + 1 + 6 + 32 * (30 + 1) = 1000
|
|
irq(rel(0))
|
|
set(pins, 1)
|
|
set(x, 31) [5]
|
|
label("delay_high")
|
|
nop() [29]
|
|
jmp(x_dec, "delay_high")
|
|
|
|
# Cycles: 1 + 1 + 6 + 32 * (30 + 1) = 1000
|
|
nop()
|
|
set(pins, 0)
|
|
set(x, 31) [5]
|
|
label("delay_low")
|
|
nop() [29]
|
|
jmp(x_dec, "delay_low")
|
|
# fmt: on
|
|
|
|
|
|
# Create the StateMachine with the blink_1hz program, outputting on Pin(25).
|
|
sm = rp2.StateMachine(0, blink_1hz, freq=2000, set_base=Pin(25))
|
|
|
|
# Set the IRQ handler to print the millisecond timestamp.
|
|
sm.irq(lambda p: print(time.ticks_ms()))
|
|
|
|
# Start the StateMachine.
|
|
sm.active(1)
|