Si vous avez lu la section 31 de la fiche technique, disponible à partir d' ici , les choses peuvent devenir un peu plus claires pour vous.
Voici un résumé de ce que je sais:
PIO signifie Parallel Input / Output et offre la fonctionnalité de lecture et d'écriture de plusieurs ports de registre à la fois. Lorsque la fiche technique mentionne un registre, par exemple PIO_OWER, la bibliothèque Arduino a des macros pour y accéder dans ce format REG_PIO? _OWER où? est soit A, B, C ou D pour les différents ports disponibles.
J'ai tendance à toujours utiliser la fonction lente Arduino pinMode () pour définir l'entrée / sortie sur les broches car elle rend le code plus lisible que les appels de registres basés sur l'acronyme tels que REG_PIOC_OWER = 0xdeadbeef, mais ensuite utiliser les registres directs pour définir les broches pour performances / synchronisation. Pour l'instant, je n'ai rien fait avec l'entrée, donc mes exemples sont tous basés sur la sortie.
Pour une utilisation de base, vous utiliseriez REG_PIO? _SODR pour définir les lignes de sortie à un niveau élevé et REG_PIO? _CODR pour les définir à un niveau bas. Par exemple, REG_PIOC_SODR = 0x00000002 mettrait le bit 1 (numéroté à partir de zéro) sur PORTC (il s'agit de la broche numérique due 33) à la hauteur. Toutes les autres broches sur PORTC restent inchangées. REG_POIC_CODR = 0x00000002 mettrait le bit 1 sur PORTC bas. Encore une fois, toutes les autres broches seraient inchangées.
Comme cela n'est toujours pas optimal ou synchronisé si vous travaillez avec des données parallèles, il existe un registre qui vous permet d'écrire les 32 bits d'un port en un seul appel. Ce sont les REG_PIO? _ODSR, donc REG_PIOC_ODSR = 0x00000002 mettrait maintenant le bit 1 sur PORTC haut et tous les autres bits sur PORTC seraient mis bas immédiatement dans une seule instruction CPU.
Comme il est peu probable que vous vous trouviez dans une situation où vous devez définir les 32 bits d'un port en même temps, vous devez stocker la valeur actuelle des broches, effectuer une opération ET pour masquer celles que vous vous souhaitez modifier, effectuer une opération OU pour définir celles que vous souhaitez définir à un niveau élevé, puis effectuer votre écriture et à nouveau, et ce n'est pas optimal. Pour surmonter cela, le CPU lui-même effectuera le masquage pour vous. Il existe un registre appelé OWSR (registre d'état d'écriture de sortie) qui masquera tous les bits que vous écrivez dans les ODSR qui ne correspondent pas aux bits définis dans le OWSR.
Donc, maintenant, si nous appelons REG_PIOC_OWER = 0x00000002 (cela définit le bit 1 du haut OWSR) et REG_PIOC_OWDR = 0xfffffffd (cela efface tous les bits sauf le bit 1 du OWSR), puis appelons REG_PIOC_ODSR = 0x00000002 à nouveau, cette fois, cela ne changera que le bit 1 de PORTC et tous les autres bits restent inchangés. Faites attention au fait que OWER active tous les bits définis sur 1 dans la valeur que vous écrivez et que OWDR désactive tous les bits définis sur 1 dans la valeur que vous écrivez. Même si j'ai compris cela lorsque je l'ai lu, j'ai quand même réussi à faire une erreur de code lors de l'écriture de mon premier code de test en pensant que OWDR a désactivé les bits qui n'étaient pas définis sur 1 dans la valeur que j'ai écrite.
J'espère que cela vous a au moins donné un peu de départ pour comprendre le PIO du CPU Due. Lisez et jouez et si vous avez d'autres questions, j'essaierai d'y répondre.
Edit: Encore une chose ...
Comment savez-vous quels bits des PORTs correspondent à quelles lignes numériques du Due? Vérifiez ceci: Brochage dû