Se hai letto la sezione 31 della scheda tecnica, disponibile da qui , le cose potrebbero essere un po 'più chiare per te.
Ecco un riassunto di ciò che so:
PIO è l'acronimo di Parallel Input / Output e offre la funzionalità per leggere e scrivere più porte di registro alla volta. Laddove il foglio dati menziona un registro, ad esempio PIO_OWER, la libreria Arduino ha macro per accedervi in questo formato REG_PIO? _OWER dove? è A, B, C o D per le diverse porte disponibili.
Tendo ancora a usare la funzione pinMode () di Arduino lenta per impostare input / output sui pin in quanto rende il codice più leggibile rispetto alle chiamate di registri basate su acronimo come REG_PIOC_OWER = 0xdeadbeef, ma quindi uso i registri diretti per impostare i pin per prestazioni / sincronizzazione. Finora non ho fatto nulla con l'input, quindi i miei esempi sono tutti basati sull'output.
Per un utilizzo di base, utilizzare REG_PIO? _SODR per impostare le linee di uscita alte e REG_PIO? _CODR per impostarle su basse. Ad esempio REG_PIOC_SODR = 0x00000002 imposterebbe il bit 1 (numerato da zero) su PORTC (questo è il pin 33 del Due digitale) alto. Tutti gli altri pin su PORTC rimangono invariati. REG_POIC_CODR = 0x00000002 imposterà il bit 1 su PORTC basso. Ancora una volta tutti gli altri pin rimarrebbero invariati.
Poiché ciò non è ancora ottimale o sincronizzato se si lavora con dati paralleli, esiste un registro che consente di scrivere tutti i 32 bit di una porta con una sola chiamata. Questi sono REG_PIO? _ODSR, quindi REG_PIOC_ODSR = 0x00000002 ora imposterebbe il bit 1 su PORTC alto e tutti gli altri bit su PORTC verrebbero impostati immediatamente su basso in una singola istruzione CPU.
Poiché è improbabile che ti trovi mai in una situazione in cui è necessario impostare contemporaneamente tutti e 32 i bit di una porta, è necessario memorizzare il valore corrente dei pin, eseguire un'operazione AND per mascherare quelli vuoi modificare, eseguire un'operazione OR per impostare quelli che desideri impostare alto, quindi eseguire la scrittura e di nuovo, e questo non è ottimale. Per ovviare a questo, la CPU stessa eseguirà il mascheramento per te. Esiste un registro chiamato OWSR (registro dello stato di scrittura dell'output) che maschererà tutti i bit che si scrivono negli ODSR che non corrispondono ai bit impostati nell'OWSR.
Quindi, ora se chiamiamo REG_PIOC_OWER = 0x00000002 (questo imposta il bit 1 del valore OWSR alto) e REG_PIOC_OWDR = 0xfffffffd (questo cancella tutti i bit tranne il bit 1 del OWSR) e quindi chiama nuovamente REG_PIOC_ODSR = 0x00000002, questa volta cambierebbe solo il bit 1 di PORTC e tutti gli altri bit rimangono invariati. Prestare attenzione al fatto che OWER abilita tutti i bit impostati su 1 nel valore scritto e che OWDR disabilita tutti i bit impostati su 1 nel valore scritto. Anche se l'ho capito quando l'ho letto, sono comunque riuscito a fare un errore di codice quando scrivevo il mio primo codice di prova pensando che OWDR disabilitasse i bit che non erano impostati su 1 nel valore che ho scritto.
Spero che questo ti abbia almeno dato un po 'di vantaggio nella comprensione del PIO della CPU Due. Buona lettura e ascolto e se hai ulteriori domande, proverò a rispondere.
Modifica: un'altra cosa ...
Come fai a sapere quali bit dei PORT corrispondono a quali linee digitali dei Due? Dai un'occhiata: Due Pinout