f80d040c03
This function seems to work fine in multi-core applications now. The delay is now in units of microseconds instead of depending on the clock speed, and is adjustable by board configuration headers. Also added documentation.
247 lines
8.3 KiB
ReStructuredText
247 lines
8.3 KiB
ReStructuredText
.. currentmodule:: rp2
|
|
|
|
:mod:`rp2` --- functionality specific to the RP2040
|
|
===================================================
|
|
|
|
.. module:: rp2
|
|
:synopsis: functionality specific to the RP2
|
|
|
|
The ``rp2`` module contains functions and classes specific to the RP2040, as
|
|
used in the Raspberry Pi Pico.
|
|
|
|
See the `RP2040 Python datasheet
|
|
<https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-python-sdk.pdf>`_
|
|
for more information, and `pico-micropython-examples
|
|
<https://github.com/raspberrypi/pico-micropython-examples/tree/master/pio>`_
|
|
for example code.
|
|
|
|
|
|
PIO related functions
|
|
---------------------
|
|
|
|
The ``rp2`` module includes functions for assembling PIO programs.
|
|
|
|
For running PIO programs, see :class:`rp2.StateMachine`.
|
|
|
|
.. function:: asm_pio(*, out_init=None, set_init=None, sideset_init=None, in_shiftdir=0, out_shiftdir=0, autopush=False, autopull=False, push_thresh=32, pull_thresh=32, fifo_join=PIO.JOIN_NONE)
|
|
|
|
Assemble a PIO program.
|
|
|
|
The following parameters control the initial state of the GPIO pins, as one
|
|
of `PIO.IN_LOW`, `PIO.IN_HIGH`, `PIO.OUT_LOW` or `PIO.OUT_HIGH`. If the
|
|
program uses more than one pin, provide a tuple, e.g.
|
|
``out_init=(PIO.OUT_LOW, PIO.OUT_LOW)``.
|
|
|
|
- *out_init* configures the pins used for ``out()`` instructions.
|
|
- *set_init* configures the pins used for ``set()`` instructions. There can
|
|
be at most 5.
|
|
- *sideset_init* configures the pins used side-setting. There can be at
|
|
most 5.
|
|
|
|
The following parameters are used by default, but can be overridden in
|
|
`StateMachine.init()`:
|
|
|
|
- *in_shiftdir* is the default direction the ISR will shift, either
|
|
`PIO.SHIFT_LEFT` or `PIO.SHIFT_RIGHT`.
|
|
- *out_shiftdir* is the default direction the OSR will shift, either
|
|
`PIO.SHIFT_LEFT` or `PIO.SHIFT_RIGHT`.
|
|
- *push_thresh* is the threshold in bits before auto-push or conditional
|
|
re-pushing is triggered.
|
|
- *pull_thresh* is the threshold in bits before auto-pull or conditional
|
|
re-pulling is triggered.
|
|
|
|
The remaining parameters are:
|
|
|
|
- *autopush* configures whether auto-push is enabled.
|
|
- *autopull* configures whether auto-pull is enabled.
|
|
- *fifo_join* configures whether the 4-word TX and RX FIFOs should be
|
|
combined into a single 8-word FIFO for one direction only. The options
|
|
are `PIO.JOIN_NONE`, `PIO.JOIN_RX` and `PIO.JOIN_TX`.
|
|
|
|
.. function:: asm_pio_encode(instr, sideset_count, sideset_opt=False)
|
|
|
|
Assemble a single PIO instruction. You usually want to use `asm_pio()`
|
|
instead.
|
|
|
|
>>> rp2.asm_pio_encode("set(0, 1)", 0)
|
|
57345
|
|
|
|
.. function:: bootsel_button()
|
|
|
|
Temporarily turns the QSPI_SS pin into an input and reads its value,
|
|
returning 1 for low and 0 for high.
|
|
On a typical RP2040 board with a BOOTSEL button, a return value of 1
|
|
indicates that the button is pressed.
|
|
|
|
Since this function temporarily disables access to the external flash
|
|
memory, it also temporarily disables interrupts and the other core to
|
|
prevent them from trying to execute code from flash.
|
|
|
|
.. class:: PIOASMError
|
|
|
|
This exception is raised from `asm_pio()` or `asm_pio_encode()` if there is
|
|
an error assembling a PIO program.
|
|
|
|
|
|
PIO assembly language instructions
|
|
----------------------------------
|
|
|
|
PIO state machines are programmed in a custom assembly language with nine core
|
|
PIO-machine instructions. In MicroPython, PIO assembly routines are written as
|
|
a Python function with the decorator ``@rp2.asm_pio()``, and they use Python
|
|
syntax. Such routines support standard Python variables and arithmetic, as well
|
|
as the following custom functions that encode PIO instructions and direct the
|
|
assembler. See sec 3.4 of the RP2040 datasheet for further details.
|
|
|
|
wrap_target()
|
|
Specify the location where execution continues after program wrapping.
|
|
By default this is the start of the PIO routine.
|
|
|
|
wrap()
|
|
Specify the location where the program finishes and wraps around.
|
|
If this directive is not used then it is added automatically at the end of
|
|
the PIO routine. Wrapping does not cost any execution cycles.
|
|
|
|
label(label)
|
|
Define a label called *label* at the current location. *label* can be a
|
|
string or integer.
|
|
|
|
word(instr, label=None)
|
|
Insert an arbitrary 16-bit word in the assembled output.
|
|
|
|
- *instr*: the 16-bit value
|
|
- *label*: if given, look up the label and logical-or the label's value with
|
|
*instr*
|
|
|
|
jmp(...)
|
|
This instruction takes two forms:
|
|
|
|
jmp(label)
|
|
- *label*: label to jump to unconditionally
|
|
|
|
jmp(cond, label)
|
|
- *cond*: the condition to check, one of:
|
|
|
|
- ``not_x``, ``not_y``: true if register is zero
|
|
- ``x_dec``, ``y_dec``: true if register is non-zero, and do post
|
|
decrement
|
|
- ``x_not_y``: true if X is not equal to Y
|
|
- ``pin``: true if the input pin is set
|
|
- ``not_osre``: true if OSR is not empty (hasn't reached its
|
|
threshold)
|
|
|
|
- *label*: label to jump to if condition is true
|
|
|
|
wait(polarity, src, index)
|
|
Block, waiting for high/low on a pin or IRQ line.
|
|
|
|
- *polarity*: 0 or 1, whether to wait for a low or high value
|
|
- *src*: one of: ``gpio`` (absolute pin), ``pin`` (pin relative to
|
|
StateMachine's ``in_base`` argument), ``irq``
|
|
- *index*: 0-31, the index for *src*
|
|
|
|
in_(src, bit_count)
|
|
Shift data in from *src* to ISR.
|
|
|
|
- *src*: one of: ``pins``, ``x``, ``y``, ``null``, ``isr``, ``osr``
|
|
- *bit_count*: number of bits to shift in (1-32)
|
|
|
|
out(dest, bit_count)
|
|
Shift data out from OSR to *dest*.
|
|
|
|
- *dest*: one of: ``pins``, ``x``, ``y``, ``pindirs``, ``pc``, ``isr``,
|
|
``exec``
|
|
- *bit_count*: number of bits to shift out (1-32)
|
|
|
|
push(...)
|
|
Push ISR to the RX FIFO, then clear ISR to zero.
|
|
This instruction takes the following forms:
|
|
|
|
- push()
|
|
- push(block)
|
|
- push(noblock)
|
|
- push(iffull)
|
|
- push(iffull, block)
|
|
- push(iffull, noblock)
|
|
|
|
If ``block`` is used then the instruction stalls if the RX FIFO is full.
|
|
The default is to block. If ``iffull`` is used then it only pushes if the
|
|
input shift count has reached its threshold.
|
|
|
|
pull(...)
|
|
Pull from the TX FIFO into OSR.
|
|
This instruction takes the following forms:
|
|
|
|
- pull()
|
|
- pull(block)
|
|
- pull(noblock)
|
|
- pull(ifempty)
|
|
- pull(ifempty, block)
|
|
- pull(ifempty, noblock)
|
|
|
|
If ``block`` is used then the instruction stalls if the TX FIFO is empty.
|
|
The default is to block. If ``ifempty`` is used then it only pulls if the
|
|
output shift count has reached its threshold.
|
|
|
|
mov(dest, src)
|
|
Move into *dest* the value from *src*.
|
|
|
|
- *dest*: one of: ``pins``, ``x``, ``y``, ``exec``, ``pc``, ``isr``, ``osr``
|
|
- *src*: one of: ``pins``, ``x``, ``y``, ``null``, ``status``, ``isr``,
|
|
``osr``; this argument can be optionally modified by wrapping it in
|
|
``invert()`` or ``reverse()`` (but not both together)
|
|
|
|
irq(...)
|
|
Set or clear an IRQ flag.
|
|
This instruction takes two forms:
|
|
|
|
irq(index)
|
|
- *index*: 0-7, or ``rel(0)`` to ``rel(7)``
|
|
|
|
irq(mode, index)
|
|
- *mode*: one of: ``block``, ``clear``
|
|
- *index*: 0-7, or ``rel(0)`` to ``rel(7)``
|
|
|
|
If ``block`` is used then the instruction stalls until the flag is cleared
|
|
by another entity. If ``clear`` is used then the flag is cleared instead of
|
|
being set. Relative IRQ indices add the state machine ID to the IRQ index
|
|
with modulo-4 addition. IRQs 0-3 are visible from to the processor, 4-7 are
|
|
internal to the state machines.
|
|
|
|
set(dest, data)
|
|
Set *dest* with the value *data*.
|
|
|
|
- *dest*: ``pins``, ``x``, ``y``, ``pindirs``
|
|
- *data*: value (0-31)
|
|
|
|
nop()
|
|
This is a pseudoinstruction that assembles to ``mov(y, y)`` and has no side
|
|
effect.
|
|
|
|
.side(value)
|
|
This is a modifier which can be applied to any instruction, and is used to
|
|
control side-set pin values.
|
|
|
|
- *value*: the value (bits) to output on the side-set pins
|
|
|
|
.delay(value)
|
|
This is a modifier which can be applied to any instruction, and specifies
|
|
how many cycles to delay for after the instruction executes.
|
|
|
|
- *value*: cycles to delay, 0-31 (maximum value reduced if side-set pins are
|
|
used)
|
|
|
|
[value]
|
|
This is a modifier and is equivalent to ``.delay(value)``.
|
|
|
|
|
|
Classes
|
|
-------
|
|
|
|
.. toctree::
|
|
:maxdepth: 1
|
|
|
|
rp2.Flash.rst
|
|
rp2.PIO.rst
|
|
rp2.StateMachine.rst
|