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.
GP0
Alternativni hardverski modovi:
Važna napomena za ovaj pin:
...
📈 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.
// 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.