Code:
BASE_PIO_LED->PIO_OER = (LED_A | LED_B);
pouvez vous m'expliquer par ordre chronologique ce qui se passe svp?
Ici on affecte PIO_OER avec LED_A ou LED_B (ce n'est pas soit l'un, soit l'autre, c'est un ou bit à bit).
Si on regarde les octets LED_A et LED_B, il valent respectivement 00000001 et 00000010 et donc le ou des 2 donne l'octet 00000011.
Je dois aussi avouer que je ne saisi pas non plus ces lignes
Code:
1 2
| #define PIO_OER (AT91_CAST(AT91_REG *) 0x00000010)
#define AT91C_BASE_PIOA (AT91_CAST(AT91PS_PIO) 0xFFFFF400) |
Il s'agit simplement de définition d'adresses physiques du µC que l'on définit dans les constantes PIO_OER et AT91C_BASE_PIOA. les (AT91_CAST(AT91_REG *) et (AT91_CAST(AT91PS_PIO) sont des cast qui permettent de dire que les adresses en question correspondent à des types prédéfinis (structures...) et on a le * juste pour dire que c'est un pointeur.
Pour cette ligne il me faudrai juste la confirmation que la variable vaut 1 décalé de 0 donc 1.
Code:
#define AT91C_PIO_PA0 (1 << 0)
Je confirme
[
B]Pour le cheminement maintenant :[/B]
Si on part du main.c
#define LED_A AT91B_LED1
#define LED_B AT91B_LED2
#define BASE_PIO_LED AT91D_BASE_PIO_LED
BASE_PIO_LED->PIO_OER = (LED_A | LED_B);
on arrive a dire que
AT91D_BASE_PIO_LED = AT91C_BASE_PIOA qui est l'adresse de base de PIOA définit sous forme de stucture (AT91PS_PIO)
Donc quand on fait : BASE_PIO_LED->PIO_OER = (LED_A | LED_B);
On dit que c'est l'élément PIO_OER de la structure BASE_PIO_LED (qui est de type AT91PS_PIO) qui est pointé et auquel on effecte le calcul
LED_A ou LED_B.
le registre PIO_OER aura donc au final la valeur binaire 00000011.
Tu as compris ?