Da li su svi GPIO pinovi isti na RP2040?

Kratak odgovor je: Ne, nisu svi isti! Iako svaki od 30 GPIO pinova može raditi kao bazični digitalni ulaz ili izlaz, unutar čipa postoji složen sistem preusmjeravanja signala (engl. IO Multiplexing). To znači da pinovi imaju alternativne funkcije. Pored toga, neki pinovi imaju hardverske elemente koji ih čine jedinstvenim (kao što su ADC kanali).

1. Interaktivni selektor pinova

Kliknite na bilo koji pin ispod da biste vidjeli koje specijalne hardverske periferije on može direktno da kontroliše.

Klikni na GPIO pin:

👈

Izaberite pin sa lijeve strane da vidite njegove mogućnosti.

💡 Savjet za razvoj: Žuti tasteri predstavljaju analogne ulaze (ADC), dok crveni predstavljaju interne pinove Pico ploče koji se obično ne koriste za spoljne senzore.

📈 Analogni Ulazi (ADC)

Samo pinovi GPIO 26, 27, 28 i 29 imaju pristup hardverskom 12-bitnom Analogno-Digitalnom Konvertoru (ADC).

  • GP26 (ADC0), GP27 (ADC1), GP28 (ADC2) su slobodni za povezivanje analognih senzora (npr. potenciometara, senzora svetlosti).
  • GP29 (ADC3) se na Pico ploči koristi za mjerenje napona baterije/napajanja (VSYS).

Interno rezervisani pinovi (Pico ploča)

U samom RP2040 čipu ima 30 GPIO pinova, ali na standardnoj Raspberry Pi Pico ploči nisu svi izvučeni na spoljne iglice (letvicu):

  • GP23 i GP24 kontrolišu regulatore napona i USB napajanje na samoj ploči.
  • GP25 kontroliše zelenu LED diodu na ploči (kod klasičnog Pico-a).
  • QSPI Pinovi (6 komada): Služe isključivo za brzu vezu sa eksternim flash čipom. Oni su skriveni i na njih ne možete povezivati vaše senzore.

2. Kako Rust to rješava? (Type-Safe GPIO u Rust-u)

U C/C++ kodu, ako greškom konfigurišete analogni pin kao digitalni izlaz, kompajler vas neće upozoriti i možete oštetiti hardver. Rust koristi Typestate obrazac da to spriječi.

Rust (embassy-rp pinovi i tipovi) Nema grešaka u fazi izvršavanja!
// U Rustu, svaki pin ima sopstveni jedinstveni TIP tokom kompajliranja
let p = embassy_rp::init(Default::default());

// 1. Pravljenje običnog digitalnog izlaza
let mut led = Output::new(p.PIN_25, Level::Low);

// 2. Konfigurisanje ADC pina za analogno čitanje
let mut adc = Adc::new(p.ADC, Irqs, Config::default());
let mut analog_pin = Channel::new(p.PIN_26); // PIN_26 implementira osobinu AdcChannel

// AKO BISTE POKUŠALI OVO:
// let mut pogresan_pin = Channel::new(p.PIN_0); // PIN_0 nema implementiranu AdcChannel osobinu!
// KOMPAJLER BI ODMAH IZBACIO GREŠKU i odbio da napravi program.