RPi Pico C SDK – Sequenza Boot/Startup RP2040

Boot in Rom

All’uscita dal reset l’RP2040 punta in memoria all’indirizzo 0x0 come di consueto, dove trova il bootloader di primo livello residente in ROM (aka BOOTROM), quindi non modificabile.
Questo effettua un’inizializzazione di base dei core (core0 attivo e core1 in sleep) e controlla lo stato del pulsante BOOTSEL per decidere se:

  • rimanere in BOOTROM e passare alla modalità disco USB, permettendo la programmazione di un nuovo firmware sul dispositivo;
  • inizializzare il controller SSI con impostazioni standard non ottimizzate, in modo da poter accedere alla memoria flash XIP esterna, e saltare in memoria all’indirizzo 0x1000_0000 dove è presente il codice compilato residente in flash, quindi modificabile.

Boot in Flash – C SDK

L’SDK del Pico è costruita per presentare all’indirizzo 0x0 della memoria flash il bootloader di secondo livello, il cui compito principale è configurare in maniera corretta e ottimizzata il controller SSI in base allo specifico modulo di memoria flash XIP montato sulla scheda e passare alla zona successiva, dove viene eseguito il codice utente.

Utilizzando l’SDK in linguaggio C il codice utente parte dalla funzione cosiddetta _reset_handler, contenuta assieme alla vector table nel file crt0.s al path pico-sdk/src/rp2_common/pico_standard_link, che sostanzialmente:

  • inizializza le variabili globali;
  • esegue la funzione runtime_init(), contenuta nel file runtime.c al path pico-sdk/src/rp2_common/pico_runtime, la quale fondamentalmente:
    • resetta tutte le periferiche interne ai valori di default;
    • inizializza i clock di sistema tramite la funzione clocks_init(), contenuta nel file clocks.c al path pico-sdk/src/rp2_common/hardware_clocks.
  • esegue la funzione main(), contenuta nei veri e propri sorgenti utente del progetto.

I clock vengono inizializzati dall’SDK ai seguenti valori:

REF clock: 12MHz – Watchdog and timers reference clock
SYS clock: 125MHz – Processors, bus fabric, memory, memory mapped registers
PERI clock: 125MHz – Peripheral clock for UART and SPI
USB clock: 48MHz – USB module clock
ADC clock: 48MHz – ADC module clock
RTC clock: 46.875kHz – Real time clock

Per visualizzarne il valore impostato runtime dal codice basta utilizzare la funzione clock_get_hz(<nome_clock>).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *