remove docs added in merge
This commit is contained in:
parent
fa29be5aea
commit
a703561402
@ -1,93 +0,0 @@
|
|||||||
.. _ssd1306:
|
|
||||||
|
|
||||||
Using a SSD1306 OLED display
|
|
||||||
============================
|
|
||||||
|
|
||||||
The SSD1306 OLED display uses either a SPI or I2C interface and comes in a variety of
|
|
||||||
sizes (128x64, 128x32, 72x40, 64x48) and colours (white, yellow, blue, yellow + blue).
|
|
||||||
|
|
||||||
Hardware SPI interface::
|
|
||||||
|
|
||||||
from machine import Pin, SPI
|
|
||||||
import ssd1306
|
|
||||||
|
|
||||||
hspi = SPI(1) # sck=14 (scl), mosi=13 (sda), miso=12 (unused)
|
|
||||||
|
|
||||||
dc = Pin(4) # data/command
|
|
||||||
rst = Pin(5) # reset
|
|
||||||
cs = Pin(15) # chip select, some modules do not have a pin for this
|
|
||||||
|
|
||||||
display = ssd1306.SSD1306_SPI(128, 64, hspi, dc, rst, cs)
|
|
||||||
|
|
||||||
Software SPI interface::
|
|
||||||
|
|
||||||
from machine import Pin, SoftSPI
|
|
||||||
import ssd1306
|
|
||||||
|
|
||||||
spi = SoftSPI(baudrate=500000, polarity=1, phase=0, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
|
|
||||||
|
|
||||||
dc = Pin(4) # data/command
|
|
||||||
rst = Pin(5) # reset
|
|
||||||
cs = Pin(15) # chip select, some modules do not have a pin for this
|
|
||||||
|
|
||||||
display = ssd1306.SSD1306_SPI(128, 64, spi, dc, rst, cs)
|
|
||||||
|
|
||||||
I2C interface::
|
|
||||||
|
|
||||||
from machine import Pin, I2C
|
|
||||||
import ssd1306
|
|
||||||
|
|
||||||
# using default address 0x3C
|
|
||||||
i2c = I2C(sda=Pin(4), scl=Pin(5))
|
|
||||||
display = ssd1306.SSD1306_I2C(128, 64, i2c)
|
|
||||||
|
|
||||||
Print Hello World on the first line::
|
|
||||||
|
|
||||||
display.text('Hello, World!', 0, 0, 1)
|
|
||||||
display.show()
|
|
||||||
|
|
||||||
Basic functions::
|
|
||||||
|
|
||||||
display.poweroff() # power off the display, pixels persist in memory
|
|
||||||
display.poweron() # power on the display, pixels redrawn
|
|
||||||
display.contrast(0) # dim
|
|
||||||
display.contrast(255) # bright
|
|
||||||
display.invert(1) # display inverted
|
|
||||||
display.invert(0) # display normal
|
|
||||||
display.rotate(True) # rotate 180 degrees
|
|
||||||
display.rotate(False) # rotate 0 degrees
|
|
||||||
display.show() # write the contents of the FrameBuffer to display memory
|
|
||||||
|
|
||||||
Subclassing FrameBuffer provides support for graphics primitives::
|
|
||||||
|
|
||||||
display.fill(0) # fill entire screen with colour=0
|
|
||||||
display.pixel(0, 10) # get pixel at x=0, y=10
|
|
||||||
display.pixel(0, 10, 1) # set pixel at x=0, y=10 to colour=1
|
|
||||||
display.hline(0, 8, 4, 1) # draw horizontal line x=0, y=8, width=4, colour=1
|
|
||||||
display.vline(0, 8, 4, 1) # draw vertical line x=0, y=8, height=4, colour=1
|
|
||||||
display.line(0, 0, 127, 63, 1) # draw a line from 0,0 to 127,63
|
|
||||||
display.rect(10, 10, 107, 43, 1) # draw a rectangle outline 10,10 to 107,43, colour=1
|
|
||||||
display.fill_rect(10, 10, 107, 43, 1) # draw a solid rectangle 10,10 to 107,43, colour=1
|
|
||||||
display.text('Hello World', 0, 0, 1) # draw some text at x=0, y=0, colour=1
|
|
||||||
display.scroll(20, 0) # scroll 20 pixels to the right
|
|
||||||
|
|
||||||
# draw another FrameBuffer on top of the current one at the given coordinates
|
|
||||||
import framebuf
|
|
||||||
fbuf = framebuf.FrameBuffer(bytearray(8 * 8 * 1), 8, 8, framebuf.MONO_VLSB)
|
|
||||||
fbuf.line(0, 0, 7, 7, 1)
|
|
||||||
display.blit(fbuf, 10, 10, 0) # draw on top at x=10, y=10, key=0
|
|
||||||
display.show()
|
|
||||||
|
|
||||||
Draw the MicroPython logo and print some text::
|
|
||||||
|
|
||||||
display.fill(0)
|
|
||||||
display.fill_rect(0, 0, 32, 32, 1)
|
|
||||||
display.fill_rect(2, 2, 28, 28, 0)
|
|
||||||
display.vline(9, 8, 22, 1)
|
|
||||||
display.vline(16, 2, 22, 1)
|
|
||||||
display.vline(23, 8, 22, 1)
|
|
||||||
display.fill_rect(26, 24, 2, 4, 1)
|
|
||||||
display.text('MicroPython', 40, 0, 1)
|
|
||||||
display.text('SSD1306', 40, 12, 1)
|
|
||||||
display.text('OLED 128x64', 40, 24, 1)
|
|
||||||
display.show()
|
|
@ -1,79 +0,0 @@
|
|||||||
.. currentmodule:: machine
|
|
||||||
.. _machine.PWM:
|
|
||||||
|
|
||||||
class PWM -- pulse width modulation
|
|
||||||
===================================
|
|
||||||
|
|
||||||
This class provides pulse width modulation output.
|
|
||||||
|
|
||||||
Example usage::
|
|
||||||
|
|
||||||
from machine import PWM
|
|
||||||
|
|
||||||
pwm = PWM(pin) # create a PWM object on a pin
|
|
||||||
pwm.duty_u16(32768) # set duty to 50%
|
|
||||||
|
|
||||||
# reinitialise with a period of 200us, duty of 5us
|
|
||||||
pwm.init(freq=5000, duty_ns=5000)
|
|
||||||
|
|
||||||
pwm.duty_ns(3000) # set pulse width to 3us
|
|
||||||
|
|
||||||
pwm.deinit()
|
|
||||||
|
|
||||||
Constructors
|
|
||||||
------------
|
|
||||||
|
|
||||||
.. class:: PWM(dest, \*, freq, duty_u16, duty_ns)
|
|
||||||
|
|
||||||
Construct and return a new PWM object using the following parameters:
|
|
||||||
|
|
||||||
- *dest* is the entity on which the PWM is output, which is usually a
|
|
||||||
:ref:`machine.Pin <machine.Pin>` object, but a port may allow other values,
|
|
||||||
like integers.
|
|
||||||
- *freq* should be an integer which sets the frequency in Hz for the
|
|
||||||
PWM cycle.
|
|
||||||
- *duty_u16* sets the duty cycle as a ratio ``duty_u16 / 65535``.
|
|
||||||
- *duty_ns* sets the pulse width in nanoseconds.
|
|
||||||
|
|
||||||
Setting *freq* may affect other PWM objects if the objects share the same
|
|
||||||
underlying PWM generator (this is hardware specific).
|
|
||||||
Only one of *duty_u16* and *duty_ns* should be specified at a time.
|
|
||||||
|
|
||||||
Methods
|
|
||||||
-------
|
|
||||||
|
|
||||||
.. method:: PWM.init(\*, freq, duty_u16, duty_ns)
|
|
||||||
|
|
||||||
Modify settings for the PWM object. See the above constructor for details
|
|
||||||
about the parameters.
|
|
||||||
|
|
||||||
.. method:: PWM.deinit()
|
|
||||||
|
|
||||||
Disable the PWM output.
|
|
||||||
|
|
||||||
.. method:: PWM.freq([value])
|
|
||||||
|
|
||||||
Get or set the current frequency of the PWM output.
|
|
||||||
|
|
||||||
With no arguments the frequency in Hz is returned.
|
|
||||||
|
|
||||||
With a single *value* argument the frequency is set to that value in Hz. The
|
|
||||||
method may raise a ``ValueError`` if the frequency is outside the valid range.
|
|
||||||
|
|
||||||
.. method:: PWM.duty_u16([value])
|
|
||||||
|
|
||||||
Get or set the current duty cycle of the PWM output, as an unsigned 16-bit
|
|
||||||
value in the range 0 to 65535 inclusive.
|
|
||||||
|
|
||||||
With no arguments the duty cycle is returned.
|
|
||||||
|
|
||||||
With a single *value* argument the duty cycle is set to that value, measured
|
|
||||||
as the ratio ``value / 65535``.
|
|
||||||
|
|
||||||
.. method:: PWM.duty_ns([value])
|
|
||||||
|
|
||||||
Get or set the current pulse width of the PWM output, as a value in nanoseconds.
|
|
||||||
|
|
||||||
With no arguments the pulse width in nanoseconds is returned.
|
|
||||||
|
|
||||||
With a single *value* argument the pulse width is set to that value.
|
|
@ -1,35 +0,0 @@
|
|||||||
.. currentmodule:: rp2
|
|
||||||
.. _rp2.Flash:
|
|
||||||
|
|
||||||
class Flash -- access to built-in flash storage
|
|
||||||
===============================================
|
|
||||||
|
|
||||||
This class gives access to the SPI flash memory.
|
|
||||||
|
|
||||||
In most cases, to store persistent data on the device, you'll want to use a
|
|
||||||
higher-level abstraction, for example the filesystem via Python's standard file
|
|
||||||
API, but this interface is useful to :ref:`customise the filesystem
|
|
||||||
configuration <filesystem>` or implement a low-level storage system for your
|
|
||||||
application.
|
|
||||||
|
|
||||||
|
|
||||||
Constructors
|
|
||||||
------------
|
|
||||||
|
|
||||||
.. class:: Flash()
|
|
||||||
|
|
||||||
Gets the singleton object for accessing the SPI flash memory.
|
|
||||||
|
|
||||||
|
|
||||||
Methods
|
|
||||||
-------
|
|
||||||
|
|
||||||
.. method:: Flash.readblocks(block_num, buf)
|
|
||||||
Flash.readblocks(block_num, buf, offset)
|
|
||||||
.. method:: Flash.writeblocks(block_num, buf)
|
|
||||||
Flash.writeblocks(block_num, buf, offset)
|
|
||||||
.. method:: Flash.ioctl(cmd, arg)
|
|
||||||
|
|
||||||
These methods implement the simple and extended
|
|
||||||
:ref:`block protocol <block-device-interface>` defined by
|
|
||||||
:class:`uos.AbstractBlockDev`.
|
|
@ -1,93 +0,0 @@
|
|||||||
.. currentmodule:: rp2
|
|
||||||
.. _rp2.PIO:
|
|
||||||
|
|
||||||
class PIO -- advanced PIO usage
|
|
||||||
===============================
|
|
||||||
|
|
||||||
The :class:`PIO` class gives access to an instance of the RP2040's PIO
|
|
||||||
(programmable I/O) interface.
|
|
||||||
|
|
||||||
The preferred way to interact with PIO is using :class:`rp2.StateMachine`, the
|
|
||||||
PIO class is for advanced use.
|
|
||||||
|
|
||||||
For assembling PIO programs, see :func:`rp2.asm_pio`.
|
|
||||||
|
|
||||||
|
|
||||||
Constructors
|
|
||||||
------------
|
|
||||||
|
|
||||||
.. class:: PIO(id)
|
|
||||||
|
|
||||||
Gets the PIO instance numbered *id*. The RP2040 has two PIO instances,
|
|
||||||
numbered 0 and 1.
|
|
||||||
|
|
||||||
Raises a ``ValueError`` if any other argument is provided.
|
|
||||||
|
|
||||||
|
|
||||||
Methods
|
|
||||||
-------
|
|
||||||
|
|
||||||
.. method:: PIO.add_program(program)
|
|
||||||
|
|
||||||
Add the *program* to the instruction memory of this PIO instance.
|
|
||||||
|
|
||||||
The amount of memory available for programs on each PIO instance is
|
|
||||||
limited. If there isn't enough space left in the PIO's program memory
|
|
||||||
this method will raise ``OSError(ENOMEM)``.
|
|
||||||
|
|
||||||
.. method:: PIO.remove_program([program])
|
|
||||||
|
|
||||||
Remove *program* from the instruction memory of this PIO instance.
|
|
||||||
|
|
||||||
If no program is provided, it removes all programs.
|
|
||||||
|
|
||||||
It is not an error to remove a program which has already been removed.
|
|
||||||
|
|
||||||
.. method:: PIO.state_machine(id, [program, ...])
|
|
||||||
|
|
||||||
Gets the state machine numbered *id*. On the RP2040, each PIO instance has
|
|
||||||
four state machines, numbered 0 to 3.
|
|
||||||
|
|
||||||
Optionally initialize it with a *program*: see `StateMachine.init`.
|
|
||||||
|
|
||||||
>>> rp2.PIO(1).state_machine(3)
|
|
||||||
StateMachine(7)
|
|
||||||
|
|
||||||
.. method:: PIO.irq(handler=None, trigger=IRQ_SM0|IRQ_SM1|IRQ_SM2|IRQ_SM3, hard=False)
|
|
||||||
|
|
||||||
Returns the IRQ object for this PIO instance.
|
|
||||||
|
|
||||||
MicroPython only uses IRQ 0 on each PIO instance. IRQ 1 is not available.
|
|
||||||
|
|
||||||
Optionally configure it.
|
|
||||||
|
|
||||||
|
|
||||||
Constants
|
|
||||||
---------
|
|
||||||
|
|
||||||
.. data:: PIO.IN_LOW
|
|
||||||
PIO.IN_HIGH
|
|
||||||
PIO.OUT_LOW
|
|
||||||
PIO.OUT_HIGH
|
|
||||||
|
|
||||||
These constants are used for the *out_init*, *set_init*, and *sideset_init*
|
|
||||||
arguments to `asm_pio`.
|
|
||||||
|
|
||||||
.. data:: PIO.SHIFT_LEFT
|
|
||||||
PIO.SHIFT_RIGHT
|
|
||||||
|
|
||||||
These constants are used for the *in_shiftdir* and *out_shiftdir* arguments
|
|
||||||
to `asm_pio` or `StateMachine.init`.
|
|
||||||
|
|
||||||
.. data:: PIO.JOIN_NONE
|
|
||||||
PIO.JOIN_TX
|
|
||||||
PIO.JOIN_RX
|
|
||||||
|
|
||||||
These constants are used for the *fifo_join* argument to `asm_pio`.
|
|
||||||
|
|
||||||
.. data:: PIO.IRQ_SM0
|
|
||||||
PIO.IRQ_SM1
|
|
||||||
PIO.IRQ_SM2
|
|
||||||
PIO.IRQ_SM3
|
|
||||||
|
|
||||||
These constants are used for the *trigger* argument to `PIO.irq`.
|
|
@ -1,130 +0,0 @@
|
|||||||
.. currentmodule:: rp2
|
|
||||||
.. _rp2.StateMachine:
|
|
||||||
|
|
||||||
class StateMachine -- access to the RP2040's programmable I/O interface
|
|
||||||
=======================================================================
|
|
||||||
|
|
||||||
The :class:`StateMachine` class gives access to the RP2040's PIO (programmable
|
|
||||||
I/O) interface.
|
|
||||||
|
|
||||||
For assembling PIO programs, see :func:`rp2.asm_pio`.
|
|
||||||
|
|
||||||
|
|
||||||
Constructors
|
|
||||||
------------
|
|
||||||
|
|
||||||
.. class:: StateMachine(id, [program, ...])
|
|
||||||
|
|
||||||
Get the state machine numbered *id*. The RP2040 has two identical PIO
|
|
||||||
instances, each with 4 state machines: so there are 8 state machines in
|
|
||||||
total, numbered 0 to 7.
|
|
||||||
|
|
||||||
Optionally initialize it with the given program *program*: see
|
|
||||||
`StateMachine.init`.
|
|
||||||
|
|
||||||
|
|
||||||
Methods
|
|
||||||
-------
|
|
||||||
|
|
||||||
.. method:: StateMachine.init(program, freq=-1, *, in_base=None, out_base=None, set_base=None, jmp_pin=None, sideset_base=None, in_shiftdir=None, out_shiftdir=None, push_thresh=None, pull_thresh=None)
|
|
||||||
|
|
||||||
Configure the state machine instance to run the given *program*.
|
|
||||||
|
|
||||||
The program is added to the instruction memory of this PIO instance. If the
|
|
||||||
instruction memory already contains this program, then its offset is
|
|
||||||
re-used so as to save on instruction memory.
|
|
||||||
|
|
||||||
- *freq* is the frequency in Hz to run the state machine at. Defaults to
|
|
||||||
the system clock frequency.
|
|
||||||
|
|
||||||
The clock divider is computed as ``system clock frequency / freq``, so
|
|
||||||
there can be slight rounding errors.
|
|
||||||
|
|
||||||
The minimum possible clock divider is one 65536th of the system clock: so
|
|
||||||
at the default system clock frequency of 125MHz, the minimum value of
|
|
||||||
*freq* is ``1908``. To run state machines at slower frequencies, you'll
|
|
||||||
need to reduce the system clock speed with `machine.freq()`.
|
|
||||||
- *in_base* is the first pin to use for ``in()`` instructions.
|
|
||||||
- *out_base* is the first pin to use for ``out()`` instructions.
|
|
||||||
- *set_base* is the first pin to use for ``set()`` instructions.
|
|
||||||
- *jmp_pin* is the first pin to use for ``jmp(pin, ...)`` instructions.
|
|
||||||
- *sideset_base* is the first pin to use for side-setting.
|
|
||||||
- *in_shiftdir* is the direction the ISR will shift, either
|
|
||||||
`PIO.SHIFT_LEFT` or `PIO.SHIFT_RIGHT`.
|
|
||||||
- *out_shiftdir* is the 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-push or conditional
|
|
||||||
re-pushing is triggered.
|
|
||||||
|
|
||||||
.. method:: StateMachine.active([value])
|
|
||||||
|
|
||||||
Gets or sets whether the state machine is currently running.
|
|
||||||
|
|
||||||
>>> sm.active()
|
|
||||||
True
|
|
||||||
>>> sm.active(0)
|
|
||||||
False
|
|
||||||
|
|
||||||
.. method:: StateMachine.restart()
|
|
||||||
|
|
||||||
Restarts the state machine and jumps to the beginning of the program.
|
|
||||||
|
|
||||||
This method clears the state machine's internal state using the RP2040's
|
|
||||||
``SM_RESTART`` register. This includes:
|
|
||||||
|
|
||||||
- input and output shift counters
|
|
||||||
- the contents of the input shift register
|
|
||||||
- the delay counter
|
|
||||||
- the waiting-on-IRQ state
|
|
||||||
- a stalled instruction run using `StateMachine.exec()`
|
|
||||||
|
|
||||||
.. method:: StateMachine.exec(instr)
|
|
||||||
|
|
||||||
Execute a single PIO instruction. Uses `asm_pio_encode` to encode the
|
|
||||||
instruction from the given string *instr*.
|
|
||||||
|
|
||||||
>>> sm.exec("set(0, 1)")
|
|
||||||
|
|
||||||
.. method:: StateMachine.get(buf=None, shift=0)
|
|
||||||
|
|
||||||
Pull a word from the state machine's RX FIFO.
|
|
||||||
|
|
||||||
If the FIFO is empty, it blocks until data arrives (i.e. the state machine
|
|
||||||
pushes a word).
|
|
||||||
|
|
||||||
The value is shifted right by *shift* bits before returning, i.e. the
|
|
||||||
return value is ``word >> shift``.
|
|
||||||
|
|
||||||
.. method:: StateMachine.put(value, shift=0)
|
|
||||||
|
|
||||||
Push a word onto the state machine's TX FIFO.
|
|
||||||
|
|
||||||
If the FIFO is full, it blocks until there is space (i.e. the state machine
|
|
||||||
pulls a word).
|
|
||||||
|
|
||||||
The value is first shifted left by *shift* bits, i.e. the state machine
|
|
||||||
receives ``value << shift``.
|
|
||||||
|
|
||||||
.. method:: StateMachine.rx_fifo()
|
|
||||||
|
|
||||||
Returns the number of words in the state machine's RX FIFO. A value of 0
|
|
||||||
indicates the FIFO is empty.
|
|
||||||
|
|
||||||
Useful for checking if data is waiting to be read, before calling
|
|
||||||
`StateMachine.get()`.
|
|
||||||
|
|
||||||
.. method:: StateMachine.tx_fifo()
|
|
||||||
|
|
||||||
Returns the number of words in the state machine's TX FIFO. A value of 0
|
|
||||||
indicates the FIFO is empty.
|
|
||||||
|
|
||||||
Useful for checking if there is space to push another word using
|
|
||||||
`StateMachine.put()`.
|
|
||||||
|
|
||||||
.. method:: StateMachine.irq(handler=None, trigger=0|1, hard=False)
|
|
||||||
|
|
||||||
Returns the IRQ object for the given StateMachine.
|
|
||||||
|
|
||||||
Optionally configure it.
|
|
@ -1,83 +0,0 @@
|
|||||||
.. 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.org/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-push or conditional
|
|
||||||
re-pushing 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)
|
|
||||||
|
|
||||||
Assemble a single PIO instruction. You usually want to use `asm_pio()`
|
|
||||||
instead.
|
|
||||||
|
|
||||||
>>> rp2.asm_pio_encode("set(0, 1)", 0)
|
|
||||||
57345
|
|
||||||
|
|
||||||
.. class:: PIOASMError
|
|
||||||
|
|
||||||
This exception is raised from `asm_pio()` or `asm_pio_encode()` if there is
|
|
||||||
an error assembling a PIO program.
|
|
||||||
|
|
||||||
|
|
||||||
Classes
|
|
||||||
-------
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
rp2.Flash.rst
|
|
||||||
rp2.PIO.rst
|
|
||||||
rp2.StateMachine.rst
|
|
@ -1,18 +0,0 @@
|
|||||||
.. _rp2_general:
|
|
||||||
|
|
||||||
General information about the RP2xxx port
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
The rp2 port supports boards powered by the Raspberry Pi Foundation's RP2xxx
|
|
||||||
family of microcontrollers, most notably the Raspberry Pi Pico that employs
|
|
||||||
the RP2040.
|
|
||||||
|
|
||||||
Technical specifications and SoC datasheets
|
|
||||||
-------------------------------------------
|
|
||||||
|
|
||||||
Datasheets!
|
|
||||||
|
|
||||||
Short summary of tech specs!
|
|
||||||
|
|
||||||
Description of general structure of the port (it's built on top of the APIs
|
|
||||||
provided by the Raspberry Pi SDK).
|
|
Binary file not shown.
Before Width: | Height: | Size: 87 KiB |
@ -1,288 +0,0 @@
|
|||||||
.. _rp2_quickref:
|
|
||||||
|
|
||||||
Quick reference for the RP2
|
|
||||||
===========================
|
|
||||||
|
|
||||||
.. image:: img/rpipico.jpg
|
|
||||||
:alt: Raspberry Pi Pico
|
|
||||||
:width: 640px
|
|
||||||
|
|
||||||
The Raspberry Pi Pico Development Board (image attribution: Raspberry Pi Foundation).
|
|
||||||
|
|
||||||
Below is a quick reference for Raspberry Pi RP2xxx boards. If it is your first time
|
|
||||||
working with this board it may be useful to get an overview of the microcontroller:
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
general.rst
|
|
||||||
tutorial/intro.rst
|
|
||||||
|
|
||||||
Installing MicroPython
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
See the corresponding section of tutorial: :ref:`rp2_intro`. It also includes
|
|
||||||
a troubleshooting subsection.
|
|
||||||
|
|
||||||
General board control
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
The MicroPython REPL is on the USB serial port.
|
|
||||||
Tab-completion is useful to find out what methods an object has.
|
|
||||||
Paste mode (ctrl-E) is useful to paste a large slab of Python code into
|
|
||||||
the REPL.
|
|
||||||
|
|
||||||
The :mod:`machine` module::
|
|
||||||
|
|
||||||
import machine
|
|
||||||
|
|
||||||
machine.freq() # get the current frequency of the CPU
|
|
||||||
machine.freq(240000000) # set the CPU frequency to 240 MHz
|
|
||||||
|
|
||||||
The :mod:`rp2` module::
|
|
||||||
|
|
||||||
import rp2
|
|
||||||
|
|
||||||
Delay and timing
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Use the :mod:`time <utime>` module::
|
|
||||||
|
|
||||||
import time
|
|
||||||
|
|
||||||
time.sleep(1) # sleep for 1 second
|
|
||||||
time.sleep_ms(500) # sleep for 500 milliseconds
|
|
||||||
time.sleep_us(10) # sleep for 10 microseconds
|
|
||||||
start = time.ticks_ms() # get millisecond counter
|
|
||||||
delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference
|
|
||||||
|
|
||||||
Timers
|
|
||||||
------
|
|
||||||
|
|
||||||
How do they work?
|
|
||||||
|
|
||||||
.. _rp2_Pins_and_GPIO:
|
|
||||||
|
|
||||||
Pins and GPIO
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Use the :ref:`machine.Pin <machine.Pin>` class::
|
|
||||||
|
|
||||||
from machine import Pin
|
|
||||||
|
|
||||||
p0 = Pin(0, Pin.OUT) # create output pin on GPIO0
|
|
||||||
p0.on() # set pin to "on" (high) level
|
|
||||||
p0.off() # set pin to "off" (low) level
|
|
||||||
p0.value(1) # set pin to on/high
|
|
||||||
|
|
||||||
p2 = Pin(2, Pin.IN) # create input pin on GPIO2
|
|
||||||
print(p2.value()) # get value, 0 or 1
|
|
||||||
|
|
||||||
p4 = Pin(4, Pin.IN, Pin.PULL_UP) # enable internal pull-up resistor
|
|
||||||
p5 = Pin(5, Pin.OUT, value=1) # set pin high on creation
|
|
||||||
|
|
||||||
UART (serial bus)
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
See :ref:`machine.UART <machine.UART>`. ::
|
|
||||||
|
|
||||||
from machine import UART
|
|
||||||
|
|
||||||
uart1 = UART(1, baudrate=9600, tx=33, rx=32)
|
|
||||||
uart1.write('hello') # write 5 bytes
|
|
||||||
uart1.read(5) # read up to 5 bytes
|
|
||||||
|
|
||||||
|
|
||||||
PWM (pulse width modulation)
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
How does PWM work on the RPi RP2xxx?
|
|
||||||
|
|
||||||
Use the ``machine.PWM`` class::
|
|
||||||
|
|
||||||
from machine import Pin, PWM
|
|
||||||
|
|
||||||
pwm0 = PWM(Pin(0)) # create PWM object from a pin
|
|
||||||
pwm0.freq() # get current frequency
|
|
||||||
pwm0.freq(1000) # set frequency
|
|
||||||
pwm0.duty_u16() # get current duty cycle, range 0-65535
|
|
||||||
pwm0.duty_u16(200) # set duty cycle, range 0-65535
|
|
||||||
pwm0.deinit() # turn off PWM on the pin
|
|
||||||
|
|
||||||
ADC (analog to digital conversion)
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
How does the ADC module work?
|
|
||||||
|
|
||||||
Use the :ref:`machine.ADC <machine.ADC>` class::
|
|
||||||
|
|
||||||
from machine import ADC
|
|
||||||
|
|
||||||
adc = ADC(Pin(32)) # create ADC object on ADC pin
|
|
||||||
adc.read_u16() # read value, 0-65535 across voltage range 0.0v - 3.3v
|
|
||||||
|
|
||||||
Software SPI bus
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Software SPI (using bit-banging) works on all pins, and is accessed via the
|
|
||||||
:ref:`machine.SoftSPI <machine.SoftSPI>` class::
|
|
||||||
|
|
||||||
from machine import Pin, SoftSPI
|
|
||||||
|
|
||||||
# construct a SoftSPI bus on the given pins
|
|
||||||
# polarity is the idle state of SCK
|
|
||||||
# phase=0 means sample on the first edge of SCK, phase=1 means the second
|
|
||||||
spi = SoftSPI(baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4))
|
|
||||||
|
|
||||||
spi.init(baudrate=200000) # set the baudrate
|
|
||||||
|
|
||||||
spi.read(10) # read 10 bytes on MISO
|
|
||||||
spi.read(10, 0xff) # read 10 bytes while outputting 0xff on MOSI
|
|
||||||
|
|
||||||
buf = bytearray(50) # create a buffer
|
|
||||||
spi.readinto(buf) # read into the given buffer (reads 50 bytes in this case)
|
|
||||||
spi.readinto(buf, 0xff) # read into the given buffer and output 0xff on MOSI
|
|
||||||
|
|
||||||
spi.write(b'12345') # write 5 bytes on MOSI
|
|
||||||
|
|
||||||
buf = bytearray(4) # create a buffer
|
|
||||||
spi.write_readinto(b'1234', buf) # write to MOSI and read from MISO into the buffer
|
|
||||||
spi.write_readinto(buf, buf) # write buf to MOSI and read MISO back into buf
|
|
||||||
|
|
||||||
.. Warning::
|
|
||||||
Currently *all* of ``sck``, ``mosi`` and ``miso`` *must* be specified when
|
|
||||||
initialising Software SPI.
|
|
||||||
|
|
||||||
Hardware SPI bus
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Hardware SPI is accessed via the :ref:`machine.SPI <machine.SPI>` class and
|
|
||||||
has the same methods as software SPI above::
|
|
||||||
|
|
||||||
from machine import Pin, SPI
|
|
||||||
|
|
||||||
spi = SPI(1, 10000000)
|
|
||||||
spi = SPI(1, 10000000, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
|
|
||||||
spi = SPI(2, baudrate=80000000, polarity=0, phase=0, bits=8, firstbit=0, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
|
|
||||||
|
|
||||||
Software I2C bus
|
|
||||||
----------------
|
|
||||||
|
|
||||||
Software I2C (using bit-banging) works on all output-capable pins, and is
|
|
||||||
accessed via the :ref:`machine.SoftI2C <machine.SoftI2C>` class::
|
|
||||||
|
|
||||||
from machine import Pin, SoftI2C
|
|
||||||
|
|
||||||
i2c = SoftI2C(scl=Pin(5), sda=Pin(4), freq=100000)
|
|
||||||
|
|
||||||
i2c.scan() # scan for devices
|
|
||||||
|
|
||||||
i2c.readfrom(0x3a, 4) # read 4 bytes from device with address 0x3a
|
|
||||||
i2c.writeto(0x3a, '12') # write '12' to device with address 0x3a
|
|
||||||
|
|
||||||
buf = bytearray(10) # create a buffer with 10 bytes
|
|
||||||
i2c.writeto(0x3a, buf) # write the given buffer to the slave
|
|
||||||
|
|
||||||
Hardware I2C bus
|
|
||||||
----------------
|
|
||||||
|
|
||||||
The driver is accessed via the :ref:`machine.I2C <machine.I2C>` class and
|
|
||||||
has the same methods as software I2C above::
|
|
||||||
|
|
||||||
from machine import Pin, I2C
|
|
||||||
|
|
||||||
i2c = I2C(0)
|
|
||||||
i2c = I2C(1, scl=Pin(5), sda=Pin(4), freq=400000)
|
|
||||||
|
|
||||||
Real time clock (RTC)
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
See :ref:`machine.RTC <machine.RTC>` ::
|
|
||||||
|
|
||||||
from machine import RTC
|
|
||||||
|
|
||||||
rtc = RTC()
|
|
||||||
rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # set a specific date and time
|
|
||||||
rtc.datetime() # get date and time
|
|
||||||
|
|
||||||
WDT (Watchdog timer)
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Is there a watchdog timer?
|
|
||||||
|
|
||||||
See :ref:`machine.WDT <machine.WDT>`. ::
|
|
||||||
|
|
||||||
from machine import WDT
|
|
||||||
|
|
||||||
# enable the WDT with a timeout of 5s (1s is the minimum)
|
|
||||||
wdt = WDT(timeout=5000)
|
|
||||||
wdt.feed()
|
|
||||||
|
|
||||||
Deep-sleep mode
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Is there deep-sleep support for the rp2?
|
|
||||||
|
|
||||||
The following code can be used to sleep, wake and check the reset cause::
|
|
||||||
|
|
||||||
import machine
|
|
||||||
|
|
||||||
# check if the device woke from a deep sleep
|
|
||||||
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
|
|
||||||
print('woke from a deep sleep')
|
|
||||||
|
|
||||||
# put the device to sleep for 10 seconds
|
|
||||||
machine.deepsleep(10000)
|
|
||||||
|
|
||||||
OneWire driver
|
|
||||||
--------------
|
|
||||||
|
|
||||||
The OneWire driver is implemented in software and works on all pins::
|
|
||||||
|
|
||||||
from machine import Pin
|
|
||||||
import onewire
|
|
||||||
|
|
||||||
ow = onewire.OneWire(Pin(12)) # create a OneWire bus on GPIO12
|
|
||||||
ow.scan() # return a list of devices on the bus
|
|
||||||
ow.reset() # reset the bus
|
|
||||||
ow.readbyte() # read a byte
|
|
||||||
ow.writebyte(0x12) # write a byte on the bus
|
|
||||||
ow.write('123') # write bytes on the bus
|
|
||||||
ow.select_rom(b'12345678') # select a specific device by its ROM code
|
|
||||||
|
|
||||||
There is a specific driver for DS18S20 and DS18B20 devices::
|
|
||||||
|
|
||||||
import time, ds18x20
|
|
||||||
ds = ds18x20.DS18X20(ow)
|
|
||||||
roms = ds.scan()
|
|
||||||
ds.convert_temp()
|
|
||||||
time.sleep_ms(750)
|
|
||||||
for rom in roms:
|
|
||||||
print(ds.read_temp(rom))
|
|
||||||
|
|
||||||
Be sure to put a 4.7k pull-up resistor on the data line. Note that
|
|
||||||
the ``convert_temp()`` method must be called each time you want to
|
|
||||||
sample the temperature.
|
|
||||||
|
|
||||||
NeoPixel and APA106 driver
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
Use the ``neopixel`` and ``apa106`` modules::
|
|
||||||
|
|
||||||
from machine import Pin
|
|
||||||
from neopixel import NeoPixel
|
|
||||||
|
|
||||||
pin = Pin(0, Pin.OUT) # set GPIO0 to output to drive NeoPixels
|
|
||||||
np = NeoPixel(pin, 8) # create NeoPixel driver on GPIO0 for 8 pixels
|
|
||||||
np[0] = (255, 255, 255) # set the first pixel to white
|
|
||||||
np.write() # write data to all pixels
|
|
||||||
r, g, b = np[0] # get first pixel colour
|
|
||||||
|
|
||||||
|
|
||||||
The APA106 driver extends NeoPixel, but internally uses a different colour order::
|
|
||||||
|
|
||||||
from apa106 import APA106
|
|
||||||
ap = APA106(pin, 8)
|
|
||||||
r, g, b = ap[0]
|
|
||||||
|
|
||||||
APA102 (DotStar) uses a different driver as it has an additional clock pin.
|
|
@ -1,6 +0,0 @@
|
|||||||
.. _rp2_intro:
|
|
||||||
|
|
||||||
Getting started with MicroPython on the RP2xxx
|
|
||||||
==============================================
|
|
||||||
|
|
||||||
Let's get started!
|
|
Loading…
Reference in New Issue
Block a user