
RPi
Pico – PIO in der Arduino-IDE
von Martin
Müller
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry
An einem einfachen Beispiel soll gezeigt werden, wie die
PIO-Funktionalität des RPi-Pico in der Arduino-IDE genutzt werden kann.
An den RPi-Pico werden 2 LEDs (mit integrierten Vorwiderständen)
angeschlossen. Die LED an GPIO 0 wird klassisch durch den üblichen
Programmcode zum Blinken gebracht, für die LED an GPIO 15 wird dazu die
PIO-Funktionalität verwendet.
Voraussetzungen:
Um mit der Arduino-IDE Zugriff auf alle Funktionen des RPi-Pico-SDK zu
erhalten, installiert man die von Earle F. Philhower III. erstellte
Boarderweiterung. Sie kann leicht als zusätzliche Boardverwalter-URL
hinzugefügt werden. Eine detaillierte Beschreibung findet sich hier:
https://arduino-pico.readthedocs.io/_/downloads/en/latest/pdf/
Programmdateien:
Als erstes wird ein Sketch (pioblink.ino) erstellt, der, nachdem er auf
den RPi-Pico übertragen wurde, die LED an GPIO 0 mit einer Frequenz von
1 Hz zum Blinken bringt.
Mit einem Texteditor schreibt man dann den Quellcode für das
Assemblerfile, das später von der PIO abgearbeitet werden soll. Es
heißt hier „blinkasm.pio“.
set pins, 1 [31]
setzt einen GPIO-Pin auf HIGH.
set pins, 0 [31]
setzt den GPIO-Pin auf LOW.
Für jede dieser Aktionen wird genau ein Taktzyklus benötigt. [31] sorgt
dafür, dass noch 31 weitere Taktzyklen vergehen, bevor der nächste
Befehl abgearbeitet wird.
nop [31]
Hiermit wird erreicht, dass für weitere 32 Takte keine Aktion stattfindet.
Insgesamt dauert es 16 x 32 = 512 Taktzyklen, bevor
.wrap
dafür sorgt, dass das Programm zurück zu
.wrap_target
springt, ohne, dass dafür eine weiterer Taktzyklus benötigt wird.
Wichtig ist, dass die Datei „blinkasm.pio“ im gleichen Verzeichnis
(pioblink) gespeichert wird in dem sich auch „pioblink.ino“ befindet.
Compilieren und Zusammenführen:
Damit der Quellcode vom RPi-Pico abgearbeitet werden kann, muss er so
übersetzt (compiliert) werden, dass er in den Sketch „pioblink.ino“
eingebunden werden kann.
In den Tiefen der Verzeichnisstruktur der Arduino-IDE findet sich die Datei „pioasm.exe“.
(B.K.: Das Verzeichniss AppData war auf meinem Win10 unsichtbar. Ich musste erst Ansicht/Ausgeblendete Elemente anklicken.)
„pioasm.exe“ wird in den Ordner (pioblink) kopiert in dem sich auch „blinkasm.pio“ und „pioblink.ino“ befinden.
In der Eingabeaufforderung navigiert man sich in das Verzeichnis „pioblink“.
pioasm.exe blinkasm.pio blinkasm.pio.h
sorgt dafür, dass aus „blinkasm.pio“ die Datei „blinkasm.pio.h“ compiliert wird.
Wurde „blinkasm.pio.h“ erfolgreich erstellt, befindet sie sich ebenfalls im Verzeichnis „pioblink“.
Die beschriebene Vorgehensweise ist unter Linux
praktisch identisch. „pioasm.exe“ heißt dort einfach nur „pioasm“.
„pioasm“ wird nach „pioblink“ kopiert. Mit dem Terminal navigiert
man in das Verzeichnis „pioblink“. Mit „./pioasm blinkasm.pio blinkasm.pio.h“ wird dann der Quellcode compiliert.
Jetzt wird der eigentliche Sketch „pioblink.ino“ erweitert.
#include "blinkasm.pio.h"
bindet den compilierten Code für die PIO ein.
Nun muss noch festgelegt werden, auf welcher PIO-Einheit, welcher
Statemachine und mit welchen Einstellungen der compilierte Code
abgearbeitet werden soll.
pio_gpio_init(pio0, 15);
GPIO 15 wird der PIO-Einheit „pio0“ zugeordnet.
uint offset = pio_add_program(pio0, &blinkasm_program);
Hier wird die Adresse festgelegt ab der „blinkasm“ auf dem RPi-Pico gespeichert und ausgeführt wird.
pio_sm_set_consecutive_pindirs(pio0, 0, 15, 1, true);
In der PIO-Einheit „pio0“ wird auf der Statemachine „0“ GPIO „15“ und nur dieser eine Pin „1“ als Ausgang „true“ geschaltet.
pio_sm_config c = blinkasm_program_get_default_config(offset);
Der Konfigurationsvariablen „c“ werden Vorgabeeinstellungen für „blinkasm“ zugeordnet.
sm_config_set_set_pins(&c, 15, 1);
Hier wird festgelegt, dass GPIO „15“ und nur dieser eine Pin „1“ mit dem „set“ - Befehl angesprochen werden kann.
sm_config_set_clkdiv(&c, 50000);
Die Taktfrequenz von 125 MHz wird für pio0 und Statemachine 0 durch 50000 geteilt.
125.000.000 Hz : 50.000 = 2.500 Hz
Da ein Programmdurchlauf (in pio0, Statemachine 0) 512 Taktzyklen
benötigt, blinkt die LED an GPIO 15 mit einer Frequenz von ca. 5 Hz.
2.500 Hz : 512 = 4,88 Hz
pio_sm_init(pio0, 0, offset, &c);
PIO-Einheit „pio0“ und Statemachine „0“ werden an der Startadresse
„offset“ mit der gewählten Konfiguration „&c“ initialisiert.
pio_sm_set_enabled(pio0, 0, true);
PIO-Einheit „pio0“ und Statemachine „0“ werden eingeschaltet „true“.
Nach dem Hochladen des Sketches auf den RPi-Pico, blinkt die LED an
GPIO 0 mit einer Frequenz von 1 Hz, die LED an GPIO 15 mit einer
Frequenz von ca. 5 Hz.
Download: pioblink.zip
Elektronik-Labor
Projekte
Mikrocontroller
Raspberry