Introduction
PIO
The RP2040 has two programmable IO (PIO) blocks, each capable of executing 4 programs in parallel. This allows the RP2040 great flexibility in mix and matching different protocols. Want 3x CANBUS and 1xSPI? RP2040 got you. Want 5xI2C instead? That’s cool too. It is a very flexible approach vs having hardwired peripherals and since PIO execute independently of the CPU, nicer and faster than using the CPU to do bitbang.
PIOs are essentially hyperspecialised CPUs and they have their own assembly language which is parsed by a program called pioasm
, part of the pico-sdk
. pioasm
converts PIO programs in assembly into C-headers which can then be #included
and used. Typically you have your PIO programs in a .pioasm
file which is then transpiled into a .h
file by pioasm
.
PlatformIO
PlatformIO is a very nice platform for doing embedded development. It nicely packages up all the toolchains and dependencies for you and sets everything up all neat and tidy.
PlatformIO and pioasm
While PlatformIO knows how to compile C code, it doesn’t natively support pioasm
, which means you need to remember to manually invoke pioasm
before building with PlatformIO, or configure PlatformIO to run a pre-build step that runs pioasm
against all .pioasm
.
Alternatively, one can use make
which I have opted to do since it feels natural - after all make
is designed for this kind of work.
With the following Makefile
, all .pioasm
files are compiled into their .h
counter-part prior to building the program. The Makefile
wraps common PlatformIO tasks to provide additional convenience.
PIOASM=/path/to/pioasm
%.h: src/%.pioasm
$(PIOASM) $< src/$@
build: pio_trigger.h
pio run
upload: build
pio run -t upload
This script assumes your source code is in /src
and you have a copy of pioasm
.
Building pioasm
Because I use the community developed arduino-pico
core, a copy of pico-sdk
was already available in $HOME/.platformio/packages/framework-arduinopico/pico-sdk/
, including the pioasm
source code. pioasm
can then be built as follows (assuming you are on a unix-like):
cd $HOME/.platformio/packages/framework-arduinopico/pico-sdk/tools/pioasm/
mkdir build
cd build
cmake ..
make
This will produce the pioasm
binary in the build/
directory. You can leave it there or move it.