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