2009-11-27 4 views
3

Comment obtenir la valeur du port du microcontrôleur ARM dans une variable 32 bits. J'utilise le microcontrôleur LPC2378.Comment lire la valeur du port GPIO d'un microcontrôleur ARM?

+0

Quel périphérique utilisez-vous? Les GPIO ne font pas partie du noyau ARM, ils sont accessibles via un autre périphérique système sur puce. –

+0

Les fichiers d'en-tête fournis avec votre compilateur contiendront des déclarations pour tous les registres du microcontrôleur et les bits de ces registres. Reportez-vous au manuel de référence pour savoir ce que font tous les registres et les bits, et regardez quelques exemples. Les deux peuvent être trouvés ici: http://www.keil.com/dd/chip/4153.htm –

Répondre

9

Vous devez accéder aux registres GPIO comme vous le feriez pour tout autre registre de fonction spécial de la puce. Les LPC2378 docs montrent ces détails:

#define GPIO_BASE 0xE0028000 
#define IOPIN0  (GPIO_BASE + 0x00) // Port 0 value 
#define IOSET0  (GPIO_BASE + 0x04) // Port 0 set 
#define IODIR0  (GPIO_BASE + 0x08) // Port 0 direction 
#define IOCLR0  (GPIO_BASE + 0x0C) // Port 0 clear 
#define IOPIN1  (GPIO_BASE + 0x10) // Port 1 value 
#define IOSET1  (GPIO_BASE + 0x14) // Port 1 set 
#define IODIR1  (GPIO_BASE + 0x18) // Port 1 direction 
#define IOCLR1  (GPIO_BASE + 0x1C) // Port 1 clear 

J'aime utiliser cette macro pour accéder aux registres de configuration de mémoire:

#define mmioReg(a) (*(volatile unsigned long *)(a)) 

Ensuite, le code pour lire le port ressemble à ceci:

unsigned long port0 = mmioReg(IOPIN0); // Read port 0 
unsigned long port1 = mmioReg(IOPIN1); // Read port 1 

La même macro fonctionne pour accéder aux registres set/clear/direction. Exemples:

mmioReg(IOSET1) = (1UL << 3); // set bit 3 of port 1 
mmioReg(IOCLR0) = (1UL << 2); // clear bit 2 of port 0 
mmioReg(IODIR0) |= (1UL << 4); // make bit 4 of port 0 an output 
mmioReg(IODIR1) &= ~(1UL << 7); // make bit 7 of port 1 an input 

Dans un système réel, je serais normalement écrire des macros ou fonctions pour ces opérations, de réduire les nombres magiques.

+3

Il y a probablement un fichier d'en-tête disponible pour le LPC2378 (fourni par le fabricant de puces, NXP, ou peut-être par la compilatrice) cela fournit tout cela pour vous. –

+0

Je ne comprends pas cette partie: (* (volatile unsigned long *) (a)). Sil te plait aide moi. –

+0

@AkhilPOommen, qu'est-ce que vous ne comprenez pas? –

Questions connexes