Raspberry Pi Pico und der Mikrocontroller RP2040
Schon wieder ein neuer Raspberry Pi? Allerdings! In Bild 1 können Sie den niegelnagelneuen Raspberry Pi Pico bewundern.
Vorweg: Pico ersetzt keine ältere RPi-Variante, sondern ist eine Erweiterung der Raspberry-Pi-Familie. Obwohl es sich ebenfalls um einen Raspberry Pi handelt, ist dieses Modell völlig anders als alle bisherigen RPi-Boards. Ein Pico ist ein mit einem Dual-Core-ARM-Controller bestücktes Board, das nur die nackte, zum Betrieb notwendige Elektronik mitbringt. Auch wenn der Name Assoziationen zu einer Art neuem RPi Zero nahelegt, handelt es sich doch um etwas ziemlich anderes. Ein wichtiger Unterschied: Auf dem Board eines Raspberry Pi Pico befindet sich - anders als bei den bisherigen RPi-Boards - kein SoC von Broadcom. Stattdessen ist der hier aufgelötete Chip RP2040 eine Eigenentwicklung der Raspberry Pi Foundation.
Beim RP2040 handelt es sich nämlich um einen Dual-Core-Mikrocontroller auf der Basis von ARM Cortex-M0+. Es ist also keiner der üblichen Linux-fähigen SoCs. Ein RPico gehört eher zur Welt der Mikrocontroller-Boards, die heute von Arduino, STM32-BluePill und ESP32-basierten Boards dominiert wird, und in der RISC-V-basierte SBCs (wie das Modell GD32VF103) immer beliebter werden. Ein RPico-Board ist mit nur ca. 5 € ungewöhnlich preiswert, weshalb ein RPico durchaus mit billigen Clones von Arduino Nano und STM32 BluePill konkurrieren kann. Der RPico ist auch günstiger als ein ESP32 Pico Kit.
Nachfolgend geht es vor allem um die Spezifikationen und Funktionen des RPico und seiner MCU RP2040. In diesem Zusammenhang ist das Unboxing-Video von Clemens Valens auf Elektors YouTube-Kanal [1] sowie die Übersicht unter [2] sehr informativ.
Erste Eindrücke von Pico
Der Dual-Core-Mikrocontroller RP2040 kann mit bis zu 133 MHz Takt arbeiten. Dual-Core-Cortex-M-MCUs sind heute nichts Ungewöhnliches. Sie enthalten aber normalerweise nicht zwei Cores des Typs Cortex-M0+, sondern bieten leistungsfähigere Cortex-M4-, Cortex-M7- oder gar die neueren Cortex-M33-Cores.
Die Bezeichnung der MCU RP2040 folgt der Nomenklatur von Bild 2, die ein Indiz für weitere Varianten darstellt, die noch kommen könnten.
Unsere Nachfrage bei der Raspberry Pi Foundation brachte allerdings keine weiteren Hinweise. Die technischen Spezifikationen des RP2040 sind in Tabelle 1 aufgelistet.
Bild 3 zeigt die Blockschaltung von Peripherie und Funktionsblöcken des RP2040.
Eine leicht zu übersehende Besonderheit ist das Fehlen von integriertem Flash-Speicher. Auf dem RPico-Board befindet sich deshalb mit dem W25Q16JUXIQ ein kleines IC neben der MCU, das 2 MB NOR-Flash bietet. Ein RP2040 unterstützt bis zu 16 MB an externem Speicher, so dass eine Speichererweiterung eine Frage des Austauschs dieses Flash-Chips ist. Ein RPico verfügt auch über einen USB-1.1-Port, der als Host oder Slave konfiguriert werden und USB-Peripherie mit bis zu 12 Mbit/s anbinden oder den RPico als Slave selbst in ein USB-Device verwandeln kann.
In der MCU RP2040 steckt ein Boot-ROM, das es ermöglicht, neuen Code von einem PC zu laden. Um die Notwendigkeit spezieller Programmer-Tools zu vermeiden, wird der Flash-Speicher des angeschlossenen Boards von einem PC als Massenspeicher angezeigt. Ein RPico kann durch einfaches Kopieren neuer Firmware-Dateien auf diesen Speicher programmiert werden (Bild 4) - eine besondere einfache und bequeme Art, ein Mikrocontroller-Board mit neuer Firmware zu versorgen.
Auch die Spannungsversorgung ist unkritisch. Das Board funktioniert nicht nur mit 5 V via Micro-USB-Buchse, sondern akzeptiert auch Spannungen von 1,8 bis 5,5 V über einen DC/DC-Buck-Boost-Converter an seinem Pin VSYS. Auf diese Weise kann man einen RPico z.B. sehr einfach durch einen Lithium-Akku oder einen Satz von zwei oder drei NiMH-Akkus versorgen. Bild 5 des Datenblatts [3] illustriert den Anschluss verschiedener Spannungsquellen.
Das verwendete DC/DC-Buck-Boost-IC ist ein RT6150, dessen Datenblatt unter [4] zu finden ist. Dieses IC benötigt laut Schaltung von Bild 6 nur wenige externe Bauteile.
40 Pins des RPico sind an die Seiten der Platine geführt, wodurch 26 GPIOs (darunter drei ADC-Eingänge des RP2040 zugänglich sind. Die anderen Pins führen größtenteils die Versorgungsspannungen und Masse. Maximal sind Spannungen bis 3,3 V an allen GPIO-Pins erlaubt. Auf der Unterseite der Platine (Bild 7) ist jeder Pin beschriftet.
Auf dem RPico-Board befinden sich drei zusätzliche Pins (SWCLK, SWIO und GND) für den Serial-Wire-Debug-Port, der die Programmierung des RP2040 und auch das Debugging ermöglicht.
Peripherie und programmierbarer Input/Output-Block
Ein RPico bietet mit zwei UARTs, zwei I²C-Controllern, zwei SPI-Controllern, 16 PWM-Kanälen, einem 12-Bit-ADC mit 500 kS/s, einem integrierten Temperatursensor, einer Echtzeituhr und Timern die grundlegenden GPIO-Funktionen und die übliche Peripherie. Ebenfalls enthalten aber weniger üblich für Mikrocontroller sind eine als Host oder Slave konfigurierbare USB-Schnittstelle sowie State Machines für acht PIOs (Programmable IOs).
Mit den State-Machines lassen sich verschiedene (zusätzliche) Schnittstellen wie UART, I²C, I²S und SPI, sowie ein SD-Karten-Interface, VGA, DPI und vieles mehr realisieren. Das Datenblatt des RP2040 enthält einen eigenen Abschnitt, der die Verwendung und Beispielprogramme erläutert. Bild 8 zeigt einen Block mit vier State Machines.
Diese Zustandsautomaten können einen Satz von neun Befehlen ausführen: JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ und SET. Da diese Zustandsmaschinen unabhängig von den beiden CPU-Kernen laufen können, lassen sich damit Schnittstellen realisieren, die nicht schon als MCU-Peripherie vorhanden sind. Außerdem entlasten diese autonomen State Machines die CPU-Kerne..
Die nativen UARTs des RP2040 basieren auf der ARM Primecell UART (PL011), die auch von den SoCs anderer RPi-Boards verwendet wird. Mit ihnen ist eine maximale Geschwindigkeit von 961,6 kBd möglich. Die beiden SPI-Schnittstellen basieren auf der ARM Primecell SPI (PL022) - ganz analog zu anderen RPis. Sie können als Master Daten mit einem SPI-Takt von bis zu F_CPU/2 übertragen. Der integrierte I²C-Controller unterstützt die Taktraten Standard (100 kHz), Fast (400 kHz) und Fast-plus (1 MHz) mit 7- und 10-Bit-Adressierung als Master oder Slave. Diese drei Schnittstellen ermöglichen den Anschluss der meisten externen Hardware und bieten eine gute Balance zwischen Funktionen und Komplexität.
Der ADC des RP2040 ist ein Basis-SAR mit 500 kS/s bei einer Auflösung von 12 bit. Er hat vier Eingänge und einen Temperatursensor. Wenn man die ADCs eines AVRs gewohnt ist, erwartet man eine Bandgap-Referenz, die 2,56 oder 1,1 V als Referenzspannung zur Verfügung stellt. Bei einem RPico muss allerdings bei Bedarf eine externe Referenzspannung an den Pin ADC_AVDD gelegt werden. In der Schaltung des RPico in Bild 9 kann man sehen, wie dieser Pin gefiltert über das RC-Glied aus R7 + R9 und C13 an 3,3 V angeschlossen ist.
Ein weiteres interessantes Feature ist die USB-Schnittstelle des RP2040. Sie kann entweder als Host oder als Slave konfiguriert werden und bietet eine Übertragungsgeschwindigkeit von bis zu 12 Mbit/s (USB Full Speed). Daher kann man nicht nur USB-Geräte wie Mäuse und Tastaturen nutzen, sondern das Board auch an einen PC oder einen anderen RPi anschließen. Als USB-Host unterstützt der Controller die Verwendung von USB-Hubs, so dass Sie nicht auf den Anschluss nur eines Geräts begrenzt ist.
Der RP2040 hat einen 64-bit-Timer mit einer Zeitbasis von 1 µs integriert. Er erlaubt bis zu vier Alarm-Timer und kann zur Erzeugung von Verzögerungen im µs-Bereich verwendet werden. Für sich wiederholende zeitgesteuerte Ereignisse oder Interrupts eignet sich eine der acht 16-bit-PWM-Einheiten mit jeweils zwei Kanälen. Bild 10 zeigt den Block einer PWM-Einheit.
Die GPIO-Pins der PWMs können auch für die Messung von Frequenz oder Tastverhältnis verwendet werden, um damit Interrupts und DMA-Anfragen zu generieren. Sie verfügen über einen „fraktionalen“ Takt-Teiler für eine genauere Frequenzeinstellung.
Für weitergehende Programmierungen bietet der RP2040 eine DMA-Einheit, die den Datentransfer im System ohne Belastung der CPU ermöglicht. So ist es z.B. möglich, A/D-Wandlungen durchzuführen und Ergebnisse in einen vordefinierten Puffer im Speicher zu schreiben, ohne dass die CPU eingreifen muss. Man kann auch Daten via DMA aus dem Speicher an einen UART senden. Selbst das Kopieren einer größeren Anzahl von Puffern innerhalb des RP2040 von einem Ort zum einem anderen kann ohne Beteiligung der CPUs erfolgen - sogar schneller als es die CPUs selbst tun könnte. Dies ist praktisch zum Transport von Daten auf ein externes Display. Da die DMA-Einheit auch mit den PIO-Zustandsmaschinen verbunden werden kann, erlaubt dies den hochperformanten Datenaustausch mit externen Geräten.
Schaltpläne, Handbücher und Design-Dateien
Das RPico-Board ist das erste Board mit einem RP2040. Bild 9 zeigt dessen Schaltplan. Die MCU ist umgeben vom DC/DC-Wandler, dem QSPI-NOR-Flash-IC, der USB-Schnittstelle und Elektronik zur Messung der Versorgungsspannung sowie zum Versetzen des DC/DC-Wandlers in den Low-Power-Modus.
Die Raspberry Pi Foundation stellt auch KiCad- und Fritzing-Dateien zur Entwicklung eigener Designs zur Verfügung. Interessanterweise handelt es sich dabei nicht etwa um RPico als Referenzdesign, sondern um eine Demonstration für den Selbstbau eines eigenen RP2040-Boards. Wer Hardware entwickelt weiß, dass bei den meisten anderen Mikrocontrollern kein besonderes Gewicht auf die Pin-Anordnung gelegt wurde. Beim RP2040 jedoch kann man sich bei der Raspberry Pi Foundation dafür bedanken, dass die Pins in sinnvolle Gruppen zusammengefasst wurden, die leicht an externe Hardware geroutet werden können. Die Pin-Belegung von Bild 11 beweist, dass intensiv über das Hardware-Design nachgedacht wurde.
Als dieser Artikel geschrieben wurde waren sowohl die Handbücher als auch die Software noch nicht auf dem endgültigen Stand. In der Zwischenzeit kann es daher noch zu kleineren Änderungen oder Ergänzungen gekommen sein. Nichtsdestotrotz ist die Dokumentation für diese RPi-Variante von Anfang an fertig und vollständig, und es handelt sich um „offene“ Hardware. Außerdem steht von Anfang an ein offenes SDK zur Verfügung, das die Entwicklung auf einem Raspberry Pi oder einem PC unter Linux und Windows sowie sogar unter MacOS (auf einem Intel-basierten Mac) ermöglicht. Für die Entwicklung eigener Anwendungen gibt es derzeit die Wahl zwischen MicroPython und C/C++.
Entwickeln mit MicroPython
Viele RP2040-Programmierer werden C/C++ bevorzugen (oder bald die Arduino-IDE, denn die Unterstützung für RP2040 ist bereits angekündigt). Allerdings ist MicroPython auch eine erwägenswerte Option. Hierfür ist ein Raspberry Pi 4 mit Raspberry Pi OS oder laut Handbuch eine äquivalente Debian-basierte Linux-Distribution auf einer anderen Plattform erforderlich. Die Befolgung der Anweisungen im Handbuch [5] führt zu einer eigenen RPico-MicroPython-Portierung. Man kann aber auch schlicht eine fertige Binärdatei von der Webseite Pico getting started [6] herunterladen.
Wenn Sie das Board mit einem Micro-USB-Kabel und gedrückter BOOTSEL-Taste an einen RPi 4 anschließen, wird das RPico-Board als USB-Massenspeicher gemountet. Die Binärdatei kann dann schlicht auf das Board kopiert werden, um seinen Flash-Speicher zu programmieren. Nach dieser Installation können Sie sich mit dem RPico im „MicroPython Interactive Interpreter Mode“ (auch REPL genannt) über USB oder den UART des RPico verbinden.
Alternativ funktioniert die MicroPython-Schnittstelle zum RPico und anderen RP2040-basierten Boards mit gängigen integrierten IDEs wie etwa Thonny (Bild 12). Das Handbuch enthält eine Anleitung zur Installation und Konfiguration dieser IDE für die MicroPython-Programmierung mit dem RPico.
Interessieren Sie sich für MicroPython? Im Buch „Get Started with MicroPython on RPico“ von G. Halfacree und B. Everard (Raspberry Pi Foundation 2021) lernen Sie, wie Sie mit MicroPython Programme schreiben und Hardware anschließen können, um Ihren RPico mit seiner Umwelt interagieren zu lassen.
RPi-Entwicklung mit C/C++
Die Entwicklung mit C/C++ ist laut Beschreibung und den mitgelieferten Tools auf einem RPi 4 vorgesehen. Die Einrichtung einer Entwicklungsumgebung auf anderen Systemen ist im Handbuch [7] beschrieben. Für den RPi kann ein praktisches Script heruntergeladen werden [8], das alle für die Installation erforderlichen Schritte übernimmt. Die Verbindung zwischen dem RPi◦4 und RPico wird gemäß Bild 13 vorgenommen. In diesem Setup fungiert der RPi 4 auch als Debug-Interface unter Verwendung einer gepatchten Version von OpenOCD. Wer einen PC oder Mac verwenden möchte, kann wie im Handbuch beschrieben einen Debugger mit einem zweiten RPico realisieren.
Wem eine IDE mehr zusagt als das Entwickeln in einer Shell, dem bietet das mitgelieferte Script Visual Studio Code (Bild 14) eine IDE für den Einstieg. Bei unseren Tests haben die Beispiele ganz gut funktioniert, aber der Projektgenerator zum einfachen Start neuer Projekte (ohne alles Mögliche manuell auf der Kommandozeile erledigen zu müssen) ist noch nicht ganz ausgereift. Auch wenn es zum Start noch ein paar kleine Ärgerlichkeiten gibt: Wie schon beim RPi 4 wird es mit der Zeit sicherlich Verbesserungen geben, da mehr Benutzer die mitgelieferte Software nutzen und Fehler melden werden.
Für den RP2040 gibt es einen reichhaltigen Satz an Bibliotheken und Beispielen, so dass Sie nicht für jeden Teil des Chips selbst Treiber schreiben müssen. Für USB wurde die TinyUSB-Bibliothek um die Unterstützung des RP2040 erweitert, was einen schnellen Einstieg ermöglicht. Da der gesamte Code offen ist, können Sie in den Dateien herumwühlen und studieren, wie die Dinge gemacht wurden. Wenn Sie eher an ein zu Arduino Wiring kompatibles Framework gewöhnt sind: Dies war zur Zeit der Arbeit an diesem Beitrag noch nicht fertig. Allerdings ist es wohl wie bei anderen interessanten Nicht-Arduino-Plattformen eine Frage der Zeit, bis es zur Verfügung steht.
Wenn Sie auf einem PC oder Mac entwickeln, haben Sie vermutlich schon Erfahrung mit virtuellen Maschinen gemacht, auf denen die Entwicklungsumgebung eingerichtet wurde. Gibt es da Probleme, kann man auf den Stand eines früheren Snapshots zurückschalten, um innerhalb kurzer Zeit wieder ein gut funktionierendes System vor sich zu haben.
Pico und der Mikrocontroller RP2040
Erschienen Ihnen Mikrocontroller bisher als zu teuer oder nicht ausreichend dokumentiert? Jetzt zieht diese „Ausrede“ nicht mehr. Schnappen Sie sich ein paar RPicos, solange sie noch verfügbar sind, und fangen Sie an zu programmieren. Bei einem Preis von 5◦€ pro Stück und mit dem von der Raspberry Pi Foundation zur Verfügung gestellten Support samt Dokumentation ist es keine Frage, ob Sie sie kaufen sollten, sondern eher, wie viele RPico-Boards Sie kaufen sollen. Durch die verfügbaren Datenblätter, Entwicklungswerkzeuge, Beispiele und die einsteigerfreundlichen Handbücher macht die Arbeit mit einem RPico sehr viel Spaß. RPico ist nicht auf erfahrene Entwickler beschränkt, sondern eignet sich auch prima für Studenten und sogar Kinder. Wenn Sie neue Projekte mit dem Board starten, lassen Sie es uns wissen und teilen Sie Ihre Erfahrungen. Wir sind gespannt, was Sie sich einfallen lassen.
Wollen Sie weitere Elektor-Artikel lesen? Jetzt Elektor-Mitglied werden und nichts verpassen!