# RP2040

Der RP2040 ist ein 32-Bit-Mikrocontroller, der von der Raspberry Pi Foundation selbst entwickelt und am 21. Januar 2021 der Öffentlichkeit vorgestellt wurde. Er basiert auf einem zweikernigen ARM Cortex-M0+. Sein Nachfolger ist der RP2350.

## Entwurfsziele

* Geringe Kosten (ca. 1 €)
* Hohe Verfügbarkeit
* Einfache Verwendbarkeit
* Deterministisches Interrupt Handling und Instruction Cycle Timing für zeitkritische Anwendungen

## Eigenschaften

* 3,3 V Betriebsspannung
* 133MHz Dual ARM Cortex-M0+ Cores
* 264 kB SRAM
** Für Code und Daten
** Physisch partitioniert in sechs unabhängige Bänke für gleichzeitigen parallelen Zugriff durch verschiedene Bus-Master
* Binärcode kann direkt aus externem Speicher über dedizierte Interfaces ausgeführt werden (SPI, DSPI oder QSPI). Ein kleiner Cache erhöht die Performance für typische Applikationen.
* QSPI Bus-Controller, unterstützt bis zu 16 MB externen Flash-Speicher
* DMA-Controller
** DMA-Busmaster sind verfügbar, um sich wiederholende Datentransfers von den Prozessoren auszulagern
* Advanced High-performance Bus für Chip-internes Daten-Routing
** Max. Bus-Bandbreite: 2 GB/s @ 125 MHz Systemtakt
* 2 × On-Chip PLLs, um unabhängig voneinander den System-Takt und den USB/ADC-Takt zu generieren
* Dedizierte Hardware für feste Peripheriefunktionen wie SPI, I²C, UART
* Interner Ringoszillator (ROSC), 1,8-12 MHz
* Quarzoszillator (XOSC) für externe Quarze mit 1-15 MHz
* 64-Bit System-Timer mit Inkrement von 1 µs
* RTC (Real-Time Clock)
* 2 × 4 PIO (Programmable Input/Output) State Machines
* Interner Temperatursensor
* Watchdog
* Brown-out Detection
Peripherie:
* 30 × GPIO (General Purpose Inputs/Outputs)
** 2 × UART (Universal Asynchronous Receiver Transmitter)
** 2 × SPI (Serial Peripheral Interface)
** 2 × I²C
** 16 × PWM (Pulse Width Modulation)
** 6 weitere GPIOs, falls QSPI unbenutzt
* USB 1.1 (Host- und Device-Modus)
* 4-Kanal 12-Bit Analog-Digital-Umsetzer (ADC)
** Nach dem SAR-Prinzip
** Sample-Rate: 500 kS/s @ 48 MHz ADC-Takt
* 3-Pin SWD (Serial Wire Debug) Interface

## Programmierung

Der RP2040 kann in ARM Assembler, C/C++ oder MicroPython programmiert werden. Ein C/C++ SDK für das Raspberry Pi Pico Board ist verfügbar, das auch das freie Real-Time Betriebssystem FreeRTOS unterstützt. Offizielle Beispiel-Programme für den Raspberry Pi Pico sind in GitHub-Repositories zu finden.
Ein weiteres Echtzeitbetriebssystem für den Raspberry Pi Pico ist Zephyr.
2021 veröffentlichten Geoff Graham und Peter Mather den BASIC-Interpreter PicoMite als Ableger von BBC MMBasic. Dieser unterstützt alle PIOs, SD-Karten im FAT16/32-Format, diverse Sensoren, Grafikdisplays, die Kommunikation per UART, I2C und 1-Wire, ADC, PWM und SPI. Die Programmierung erfolgt über den USB-Anschluss auf der Platine per VT100-Emulation. PicoMite beinhaltet auch einen PIO-Assembler.
Der Raspberry Pi Pico lässt sich auch mit der vereinfachten C/C++-Implementierung der Arduino-Plattform programmieren. Sowohl die offizielle Arduino-IDE als auch die alternative PlatformIO-IDE werden unterstützt. Auch Arduino selbst bietet mit dem Arduino Nano RP2040 Connect ein Board mit dem RP2040 an.

## Besonderheiten

* Das I/O-Subsystem ist als PIO (Programmable Input/Output) ausgeführt. Es handelt sich dabei um State Machines, die sich mittels 9 spezieller Assembler-Instruktionen in ihrer konkreten Funktion frei programmieren lassen. Das ermöglicht somit Software-Implementierungen von Protokollen wie SDIO, I²S, DVI-D und DPI (Display Pixel Interface).
* Ein vollständig verbundener Switch verbindet ARM-Cores und DMA-Engines mit sechs unabhängigen RAM-Bänken
* Ein USB-Controller incl. PHY-Interface ist bereits im Chip integriert, so dass kein externer USB-Controller IC (z. B. USB-UART Bridge) benötigt wird

## Package & Herstellungsprozess

Der Chip wird im 40-nm-Verfahren hergestellt. Er hat eine Größe von 2 mm² und ist in einem 7 × 7 mm großen QFN-56-SMD-Gehäuse untergebracht.

## Namensgebung

Namensschema :
| RP | 2 | 0 | 4 | 0 |
| Raspberry Pi | Anzahl Cores | Prozessor-Typ: M0+ | RAM-Größe: ${\Biggl \lfloor }\log _{2}{\biggl{\frac {\text{RAM}}{16{\text{ KiB}}}}{\biggr )}{\Biggr \rfloor }$ | NVRAM-Größe: ${\Biggl \lfloor }\log _{2}{\biggl{\frac {\text{NVRAM}}{16{\text{ KiB}}}}{\biggr )}{\Biggr \rfloor }$ 0: kein on-board NVRAM |