Wie Wert von GPIO-Port eines ARM-Mikrocontroller lesen?
Frage
Wie ARM Mikrocontroller-Port-Wert in ein 32-Bit-Variable erhalten.
Ich bin mit LPC2378 Mikrocontroller.
Lösung
Sie müssen die GPIO-Register wie würden Sie irgendwelche anderen speziellen Funktionsregister in dem Chip zugreifen. Die LPC2378-Dokumente zeigen diese Details:
#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
Ich mag dieses Makro verwenden Memory-Mapped-Register zuzugreifen:
#define mmioReg(a) (*(volatile unsigned long *)(a))
Sie den Code dann den Port zu lesen, sieht wie folgt aus:
unsigned long port0 = mmioReg(IOPIN0); // Read port 0
unsigned long port1 = mmioReg(IOPIN1); // Read port 1
Die gleichen Makro funktioniert für den Zugriff auf den Satz / klar / Richtungsregister. Beispiele:
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
In einem realen System, würde ich normalerweise einige Makros oder Funktionen für diese Vorgänge, schreibe auf den magischen Zahlen zu reduzieren.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow