Einführung in das Multicore-Mikrocontrollerboard Raspberry Pi Pico mit Hilfe von C
Zur Verfügung gestellt von Nordamerikanische Fachredakteure von DigiKey
2023-06-07
Eingebettete Systeme benötigen von Natur aus eine leistungsstarke, kostengünstige Mikrocontroller-Einheit (MCU). Diese Komponenten spielen nicht nur beim Produkt eine wichtige Rolle, sondern auch bei der Unterstützung von Tests, Rapid Prototyping und Funktionen wie maschinelles Lernen (ML). Der Einstieg in die Arbeit mit MCUs erfordert jedoch in der Regel ein tiefes Verständnis der MCU-Technologie und der Low-Level-Programmiersprachen. Hinzu kommt, dass Entwicklungsboards oft zwischen 20 und 1000 USD kosten, was für viele Entwickler zu teuer sein kann. Außerdem ist nicht immer ein Entwicklungsboard verfügbar, und selbst wenn dies der Fall ist, haben die Entwickler oft Schwierigkeiten, ein Board zum Laufen zu bringen.
In diesem Artikel wird das kostengünstige Entwicklungsboard Raspberry Pi Pico (SC0915) für die MCU RP2040 vorgestellt, das Entwicklern eine breite Palette an Möglichkeiten bietet. Der Artikel befasst sich mit dem Pico und einigen Erweiterungsplatinen, untersucht die verschiedenen Software-Entwicklungskits, die der Raspberry Pi Pico unterstützt, und zeigt, wie man mit dem C-SDK eine blinkende LED-Anwendung erstellt.
Einführung in den Raspberry Pi Pico
Der Raspberry Pi Pico wurde erstmals im Jahr 2021 als Entwicklungsplattform für den Mikrocontroller RP2040 vorgestellt. Der Pico kann als eigenständiges Entwicklungsboard verwendet werden, oder er kann dank der Randverbindungen, die auf eine Trägerplatine gelötet werden können, direkt in ein Produkt integriert werden (Abbildung 1). Da der Pico weniger als 5 USD kostet und vielseitig einsetzbar ist, hat er sich zu einer beliebten Lösung sowohl für Maker als auch für professionelle Entwickler entwickelt.
Abbildung 1: Der Raspberry Pi Pico ist ein kostengünstiges Entwicklungsboard, das alles enthält, was zur Entwicklung von Anwendungen mit dem Mikrocontroller RP2040 erforderlich ist. (Bildquelle: Raspberry Pi)
Der RP2040 verfügt über einen Dual-Core-Arm®-Cortex®-M0+-Prozessor, der mit 133 Megahertz (MHz) getaktet ist und bis zu 264 Kilobyte (KByte) SRAM enthält. Der RP2040 verfügt nicht über einen On-Chip-Flash. Stattdessen bietet der Raspberry Pi Pico einen externen 2-Megabyte-Flash-Chip, der über eine vierkanalige serielle Peripherieschnittstelle (QSPI) mit dem RP2040 verbunden ist. Das Board verfügt außerdem über eine Benutzer-LED, einen Quarzoszillator, der von der Phasenregelschleife (PLL) verwendet wird, um einen stabilen Highspeed-CPU-Takt zu erzeugen, und einen Druckknopf, mit dem konfiguriert werden kann, ob der Prozessor normal oder in einen Bootloader bootet.
Ein umfassendes Ökosystem
Der Raspberry Pi Pico verfügt bereits über ein umfangreiches Ökosystem, das Entwicklern die Wahl lässt, ob sie MicroPython oder C-Software-Entwicklungskits verwenden, um Anwendungen für das Board zu schreiben. Eine interessante Anmerkung zum Raspberry Pi Pico ist, dass es nicht nur ein einziges Entwicklungsboard gibt. Stattdessen gibt es drei Modelle: das ursprüngliche SC0915 in der Standardkonfiguration, das SC0917 mit Steckleisten und das SC0918 mit einem kostengünstigen Wi-Fi-Chip für vernetzte Anwendungen (Abbildung 2).
Abbildung 2: Der Raspberry Pi Pico ist in drei Konfigurationen erhältlich. (Bildquelle: Beningo Embedded Group, LLC)
Bei jeder dieser Versionen bleibt der Footprint der Karte gleich. Die Verbindungen des Boards bestehen aus 40-poligen Randanschlüssen für die Peripheriekomponenten und weitere in Abbildung 3 gezeigte Anschlussmöglichkeiten. Dazu gehören Stromversorgung, Masse, ein universeller asynchroner Empfänger und Sender (UART), Allzweck-Eingänge und -Ausgänge (GPIO), Pulsweitenmodulation (PWM), ein Analog/Digital-Wandler (ADC), eine serielle Peripherie-Schnittstelle (SPI), eine Schnittstelle für integrierte Schaltungen (I2C) und Debugging.
Abbildung 3: Die Pinbelegung des Raspberry Pi Pico am Rand bietet eine Vielzahl von Zugriffsmöglichkeiten auf Peripheriekomponenten. (Bildquelle: Raspberry Pi)
Optionen für Erweiterungsplatinen
Wenn der Raspberry Pi für das Rapid Prototyping verwendet werden soll, ist ein einfacher Zugang zu den Randanschlüssen des Boards erforderlich. Eine Möglichkeit des Zugriffs besteht darin, die Kontaktleisten zu bestücken und eine Steckplatine zu verwenden. Diese Lösung führt jedoch häufig zu einem Kabelsalat, der zu Fehlern führen kann. Stattdessen gibt es mehrere Optionen für Erweiterungsplatinen, die die Randanschlüsse auf leichter verfügbare Schnittstellen erweitern.
Bei der Pico-Modulplatine MM2040EV von Bridgetek beispielsweise sind die meisten Randanschlüsse in Stift- und Sockelverbindungen unterteilt. Zusätzlich gibt es von Seeed Studio das Shield 103100142 für den Pico, das jede Peripherieschnittstelle als Steckverbinder bereitstellt. Jeder Steckverbinder ist mit Erweiterungskarten kompatibel, um Funktionen wie Trägheitssensoren, Motortreiber und Entfernungsmesser hinzuzufügen.
C oder MicroPython?
Code für eingebettete Systeme wird traditionell in C geschrieben, da diese Programmiersprache ein Gleichgewicht zwischen Low-Level-Steuerung und höherwertigen Systemanwendungsansätzen schafft. Das Problem mit C ist, dass es sich um eine veraltete, fünfzig Jahre alte Programmiersprache handelt, die an den Universitäten kaum gelehrt wird. Es ist auch zu einfach, versehentlich Fehler einzuschleusen und Schaden anzurichten. Trotz dieser potenziellen Probleme ist C die Sprache der Wahl für den Großteil der Entwicklung eingebetteter Systeme.
Eine Alternative zur Verwendung von C, die vom Ökosystem des Raspberry Pi Pico bereitgestellt wird, ist MicroPython. MicroPython ist eine CPython-Portierung, die auf MCU-basierten Systemen läuft. Obwohl sie zweifellos einen schwereren Prozessor benötigt als C, ist sie eine moderne Sprache, mit der viele Entwickler vertraut sind und sich wohl fühlen. MicroPython kann Low-Level-Details der MCU und der Hardware ausblenden. Der Zugriff auf die Hardware erfolgt über hochentwickelte Programmierschnittstellen (APIs), die einfach zu erlernen sind - ein wichtiges Merkmal bei knappen Projektfristen.
Bei der Entscheidung, welches Software Development Kit (SDK) verwendet werden soll - C oder MicroPython -, müssen sich die Entwickler auf bestimmte Anforderungen konzentrieren. Im Vergleich zu MicroPython bietet die Verwendung von C einen Low-Level-Zugriff auf die Register der MCU, hat einen kleineren Speicherbedarf und ist effizienter.
Einrichten des C-SDK
Wenn Sie das C-SDK verwenden, um eine blinkende LED-Anwendung zu erstellen, gibt es mehrere Möglichkeiten. Die erste besteht darin, die SDK-Dokumentation zu lesen und die Anweisungen zu befolgen. Die zweite Möglichkeit ist die Verwendung eines voreingestellten Docker-Containers zur automatischen Installation aller für den Start erforderlichen Tools. Eine dritte Möglichkeit besteht darin, die Toolchains und den Beispielcode für den Raspberry Pi Pico manuell zu installieren, einschließlich:
- Git
- Python 3
- Cmake
- gcc-arm-none-eabi \
- libnewlib-arm-none-eabi
Der Beispielcode für den Raspberry Pi Pico kann durch Klonen des Git-Repositories für den Raspberry Pi mit dem folgenden Befehl abgerufen werden:
git clone https://github.com/raspberrypi/pico-sdk /home/sdk/pico-sdk && \
cd /home/sdk/pico-sdk && \
git submodule update --init &&
Sobald diese Bibliotheken und der Quellcode installiert sind, besteht der nächste Schritt darin, eine LED-Blink-Anwendung zu untersuchen und zu kompilieren.
Schreiben einer Blink-Anwendung
Das C-SDK wird mit einem Blink-Beispiel geliefert, mit dem Entwickler ihre erste Anwendung erstellen können. Das folgende Code-Listing verwendet die Onboard-LED des Pico und die Direktive PICO_DEFAULT_LED_PIN, um einen I/O-Pin einzurichten und ihn mit einer Verzögerung von 250 Millisekunden (ms) blinken zu lassen.
Kopieren
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pico/stdlib.h"
int main() {
#ifndef PICO_DEFAULT_LED_PIN
#warning blink example requires a board with a regular LED
#else
const uint LED_PIN = PICO_DEFAULT_LED_PIN;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
}
#endif
}
Code-Listing: Der Raspberry Pi Pico verwendet die Direktive PICO_DEFAULT_LED_PIN, um einen I/O-Pin einzurichten und ihn mit einer Verzögerung von 250 ms blinken zu lassen. (Code-Quelle: Raspberry Pi)
Gemäß dem Listing wird dem LED_PIN der Standard-Pin zugewiesen; dann werden Aufrufe an die C-gpio-APIs gemacht. gpio_init wird verwendet, um den Pin zu initialisieren, während gpio_set_dir verwendet wird, um den LED_PIN als Ausgang einzurichten. Dann wird eine Endlosschleife erstellt, die den Zustand der LED alle 250 ms umschaltet.
Die Kompilierung der Anwendung ist relativ einfach. Zunächst muss mit den folgenden Befehlen ein Build-Verzeichnis im Raspberry-Pi-Pico-Ordner erstellt werden:
mkdir build
cd build
Als Nächstes muss cmake für den Build vorbereitet werden, indem der folgende Befehl ausgeführt wird:
cmake
Jetzt kann in das blink-Verzeichnis gewechselt und make ausgeführt werden:
cd blink
make
Die Ausgabe des Build-Prozesses ist eine blinky.uf2-Datei. Das kompilierte Programm kann auf den Raspberry Pi Pico geladen werden, indem man den BOOTSEL-Pin gedrückt hält und das Board einschaltet. Der RP2 erscheint dann als Massenspeichergerät. Jetzt kann die Datei blinky.uf2 auf das Laufwerk gezogen werden, woraufhin der Bootloader die Anwendung installiert. Sobald der Vorgang abgeschlossen ist, sollte die LED anfangen zu blinken.
Fazit
Der Raspberry Pi Pico ist eine attraktive Lösung für Embedded-Entwickler, die Flexibilität in ihrem Entwicklungszyklus suchen. Es stehen mehrere Optionen zur Verfügung, darunter eigenständige Lösungen oder Boards mit drahtloser Vernetzung. Darüber hinaus unterstützt das Ökosystem C und C++ sowie MicroPython. Entwickler können wählen, welche Sprache für ihre Anwendung am besten geeignet ist, und dann das entsprechende SDK nutzen, um die Softwareentwicklung zu beschleunigen.

Haftungsausschluss: Die Meinungen, Überzeugungen und Standpunkte der verschiedenen Autoren und/oder Forumsteilnehmer dieser Website spiegeln nicht notwendigerweise die Meinungen, Überzeugungen und Standpunkte der DigiKey oder offiziellen Politik der DigiKey wider.