🛠 Console série sur RP2350 : USB CDC natif et UART0 de secours
Objectifs
Le RP2350 intègre un contrôleur USB unique : USB 2.0 Full-Speed device (12 Mb/s) et hôte Full/Low-Speed avec PHY 1.1 intégré (datasheet RP2350, §12 USB). Sous MicroPython, la console passe par cet USB CDC natif — aucune puce série n'existe sur la carte. Mais dès que l'USB est occupé (mode HID, alimentation sur batterie) ou que les broches USB ne sont pas câblées (Pro Micro mal soudées, module nu), il te faut l'UART : le RP2350 dispose de 2 UART mappables sur n'importe quelle GPIO. Ce tuto met en place les deux voies de secours.
Matériel
- 1 × carte RP2350 générique + MicroPython rp2 (tuto précédent)
- 1 × adaptateur USB↔TTL (CP2102, CH340, FTDI…) en 3,3 V — l'IO du RP2350 fonctionne en IOVDD 1,8–3,3 V : du 5 V sur une broche peut la détruire
- 3 × câbles : GP0 (TX0) → RX de l'adaptateur, GP1 (RX0) → TX, GND ↔ GND (masse commune obligatoire)
- Ne relie pas le VCC de l'adaptateur à la carte si elle est déjà alimentée
Code complet
# main.py — printf sur USB CDC ET trace sur UART0 (GP0/GP1, 115200 8N1)
import sys
from machine import UART, Pin
import time
# 1) La console par défaut est l'USB CDC natif du RP2350 :
print('Bonjour depuis USB CDC') # visible dans Thonny / mpremote
# 2) Console de secours indépendante sur UART0 :
uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))
uart.write('RP2350 pret (UART0 115200 8N1)\r\n')
n = 0
while True:
n += 1
msg = 'tick %d uptime_ms=%d\r\n' % (n, time.ticks_ms)
sys.stdout.write(msg) # USB CDC
uart.write(msg) # UART0 physique
if uart.any: # écho de ce que le PC envoie
uart.write('recu: ' + uart.read.decode(errors='replace') + '\r\n')
time.sleep_ms(500)
Vérification attendue
Deux fenêtrès, mêmes lignes : Thonny (port CDC de la carte) et ton terminal série sur l'adaptateur (115200 8N1 — picocom -b 115200 /dev/ttyUSB0, ou le port COM sous Windows). Un caractère tapé côté adaptateur revient en écho. Débranche l'USB de la carte tout en la gardant alimentée en 5 V sur VREG_VIN (2,7–5,5 V) : la trace UART continue — tu as une console découplée de l'USB, indispensable pour debugger un programme qui plante l'énumération USB.
Erreurs fréquentes
- TX relié à TX : on croise toujours — TX carte → RX adaptateur.
- Masse commune oubliée : rien, ou des octets parasites.
- Adaptateur en 5 V : le RP2350 n'est pas 5 V tolérant en IO (plage 1,8–3,3 V selon IOVDD) — vérifie le sélecteur de l'adaptateur.
- Confondre les deux : l'USB CDC est un port série virtuel (ttyACM/COM) créé par la carte ; l'adaptateur TTL est un second port (ttyUSB…). Les deux peuvent coexister.
- GP0/GP1 déjà prises par ton montage : l'UART du RP2350 se route sur toute GPIO —
UART(1, tx=Pin(4), rx=Pin(5))libère le bus. - REPL silencieux sur UART : sous MicroPython rp2, le REPL reste sur USB CDC ; si tu veux le REPL sur UART, il faut le configurer (
machine.UART+ réaffectation du stdio) ou utiliser le C SDK avecstdio_init_uart. - Câble d'alimentation seul : l'USB CDC n'existe que si les broches data sont reliées — encore le câble.
Autres tutoriels pour cette carte
- Flasher MicroPython sur une carte RP2350 générique et faire clignoter la première LED
- Lire l'ADC 12 bits et le capteur de température interne du RP2350
- Exploiter les 3 blocs PIO et 12 machines d'état du RP2350 (avec IRQ dédiées)
- Pico SDK 2.x sur une carte RP2350 générique : CMake, board header et PICO_BOARD
- Basculer les cœurs de Arm Cortex-M33 à Hazard3 RISC-V avec ARCHSEL
- Secure boot et TrustZone-M sur RP2350 : signer son firmware sans se faire avoir
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython