manipulation registre arduino DUE

bonjour,

j'ai regardé la doc du SAMX3 de l'arduino due pour savoir comment modifier l'état des pin I/O en écrivant sur les registres et je me pose quelques questions.

Cet article :

32.5.5 Synchronous Data Output

Clearing one (or more) PIO line(s) and setting another one (or more) PIO line(s) synchronously
cannot be done by using PIO_SODR and PIO_CODR registers. It requires two successive write
operations into two different registers. To overcome this, the PIO Controller offers a direct control
of PIO outputs by single write access to PIO_ODSR (Output Data Status Register).Only bits
unmasked by PIO_OWSR (Output Write Status Register) are written. The mask bits in
PIO_OWSR are set by writing to PIO_OWER (Output Write Enable Register) and cleared by
writing to PIO_OWDR (Output Write Disable Register).
After reset, the synchronous data output is disabled on all the I/O lines as PIO_OWSR resets at
0x0.

cet article indique si je ne me trompe pas qu'on ne peut pas mettre des pins en high et d'autres en low sur la même instruction. Par exemple on ne peut pas faire:

PIOB -> PIO_SODR=0b1010;
PIOB -> PIO_SODR=0b0101;

Il faut pour ça écrire sur le registre PIO_ODSR, et il est écrit que seuls les bits non masqués par le registre PIO_OWSR sont écrits. Je ne suis pas certain de comprendre comment ça s'écrit tous ça. merci a ceux qui m’éclairciront .

D'ailleurs, j'ai vu ce type d'instruction pour l'écriture des registres : PIOB -> PIO_SODR qui est donc un pointeur de structure
mais j'ai aussi vu ce type d'instruction la : REG_PIOB_SODR, pourquoi y en a t il deux?

merci

meruem:
D'ailleurs, j'ai vu ce type d'instruction pour l'écriture des registres : PIOB -> PIO_SODR qui est donc un pointeur de structure
mais j'ai aussi vu ce type d'instruction la : REG_PIOB_SODR, pourquoi y en a t il deux?

Ces 2 écritures fonctionnent, je trouve cependant que la première est plus facile à utiliser.

Pour basculer une broche de haut à bas et inversement, le plus simple est le type de code suivant:

void setup() {
  
pinMode(LED_BUILTIN, OUTPUT); // PB27 = LED_BUILTIN

}

void loop() {
  
PIOB->PIO_ODSR ^= PIO_ODSR_P27;
delay(1000);
}

2 documents sont essentiels pour utiliser les registres, le datasheet du Sam3x, et le pinout diagram de Greynomad que tu trouveras dans les messages épinglés du sous-forum arduino DUE de ce forum, auquel il faut ajouter le fichier des header files:
https://android.googlesource.com/platform/external/arduino-ide/+/f876b2abdebd02acfa4ba21e607327be4f9668d4/hardware/arduino/sam/system/CMSIS/Device/ATMEL/sam3xa/include/component

salut newbie,

merci pour ta réponse, et merci pour le lien, je vais regarder le component_pio.h

j'ai quand même une question qui demeure

moi ce qui m’intéresse c'est écrire sur plusieurs pin simultanément, et parmi elles d'en placer en high (set) certaines et d'en placer en low(clear) d'autres, et donc en écrivant directement sur le PIO_ODSR d'après l'article 32.5.5

mais je ne comprend pas le lien entre PIO_ODSR et PIO_OWSR pour le masque.
disons que PIO_ODSR vaut 0b1010 pour les 4 premiers bit , est ce que je peux faire ceci ? :
PIOB -> PIO_ODSR=0b0101;

la jai "clear" les bits 1 et 3 et j'ai "set" les bits 0 et 2, et ça fonctionne? Je ne peux pas faire de test car je n'ai pas encore reçu la carte

merci

Si tu veux écrire simultanément sur 4 broches de type PBx, c'est très simple:

Dans le setup():

1/ Tu actives PIOB avec PMC : PMC->PMC_PCER0 |= PMC_PCER0_PID12;

2/ Tu valides le fait que les broches numéros x0, x1, x2 et x3 sont commandées par le GPIO:

PIOB->PIO_PER |= PIO_PER_Px0 | PIO_PER_Px1 | ....

3/ Tu déclares que toutes les broches qui n'ont pas pour numéros x0, ..... ne doivent pas être affectées par une écriture dans PIO_ODSR : PIOB->PIO_OWDR = PIO_OWDR_Py | ....

4/ Tu déclares que les broches x0, .... doivent être affectées par une écriture dans PIO_ODSR:
PIOB->PIO_OWER = PIO_OWER_Px0 | ....

Dans la loop():

Tu écris sur les broches x0,... avec PIOB->PIO_ODSR en plaçant un 0 ou un 1 sur les 4 broches sélectionnées, ailleurs c'est indifférent.

Un exemple de ce qui précède avec 2 broches activées:

const uint32_t PinSelection = PIO_ODSR_P13 | PIO_ODSR_P27;

void setup() {

  PMC->PMC_PCER0 |= PMC_PCER0_PID12;  // PIOB power ON

  PIOB->PIO_PER |= PinSelection;

  PIOB->PIO_OER = PinSelection; 

  PIOB->PIO_OWDR = ~PinSelection;
                 
  PIOB->PIO_OWER = PinSelection;

}

void loop() {

  PIOB->PIO_ODSR = PinSelection;
  delay(1000);

  PIOB->PIO_ODSR = ~PinSelection;
  delay(1000);

}

salut et merci bcp pour ta réponse

je commence a comprendre, mais pour moi qui découvre le monde des mcu j'ai un peu de mal avec une doc de 1500 pages :stuck_out_tongue: j'ai quelques questions sur ce que tu dis vis à vis de la doc:

en 1) tu dis qu'il faut autoriser le PIO avec le PMC, mais sauf erreur de m'a part cet article dit que c'est pas nécessaire pour du output ?:

32.4.2 Power Management
The Power Management Controller controls the PIO Controller clock in order to save power.
Writing any of the registers of the user interface does not require the PIO Controller clock to be
enabled. This means that the configuration of the I/O lines does not require the PIO Controller
clock to be enabled. [...]

en 3)et 4) il y a quelque chose que je comprend pas, dans la doc:

32.5.5 Synchronous Data Output
[...] Only bits unmasked by PIO_OWSR are written. The mask bits in PIO_OWSR are set by writing to PIO_OWER and cleared by writing to PIO_OWDR .
After reset, the synchronous data output is disabled on all the I/O lines as PIO_OWSR resets at
0x0.

ce qui veut dire que toutes les pin qui vaudront 1 dans PIO_OWSR ne seront pas modifiées par PIO (masquage). Et la dernière phrase dit que par defaut PIO_OWSR est à zero et donc pas de masquage par defaut. Donc selon cette logique ce qu'il faudrait c'est mettre toutes les pin de PIO_OWER à 1 sauf celles qu'on veut utiliser. Ou est ce que je me trompe ? Et a quoi sert d'écrire ET sur PIO_OWDR ET sur PIO_OWDR? Je sais pas si je suis clair dans ma question :confused:

merci encore

Il faut vraiment avoir une carte DUE à disposition pour commencer à se former dessus de façon à expérimenter.

32.4.2 Power Management
.....

Lorsque c'est un périphérique qui utilise une broche, il ne sert à rien d'activer l'horloge du GPIO effectivement. MAIS, lorsqu'on utilise une broche en tant que GPIO, il FAUT activer l'horloge du PIO correspondant. Je te laisse faire l'essai avec ta future carte.

32.5.5 Synchronous Data Output
....

Si tu lis attentivement la datasheet aux pages 662 (PIO_OWDR) et 661 (PIO_OWER), tu verras que seuls des 1 ont un effet. Donc si tu veux, en même temps, autoriser l'écriture par PIO_ODSR sur certaines broches ET interdire l'écriture sur d'autres broches par PIO_ODSR, tu dois écrire ET sur PIO_OWDR et sur PIO_OWER !

La datasheet fait plus de 1400 pages, néanmoins, tu verras à l'usage qu'il y a une grande similitude dans la mise en oeuvre de la plupart des périphériques. Et par ailleurs, la section sur les PIO ne fait que 58 pages.

salut,

d'accord merci je vois. Du coup avant d'aller plus loin jvais attendre la carte pour faire des tests. Je reviendrai si besoin, merci encore et bonne soirée !