ARM 마이크로 컨트롤러의 GPIO 포트에서 값을 읽는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1810368

  •  05-07-2019
  •  | 
  •  

문제

ARM 마이크로 컨트롤러 포트 값을 32 비트 변수로 얻는 방법

LPC2378 마이크로 컨트롤러를 사용하고 있습니다.

도움이 되었습니까?

해결책

칩의 다른 특수 기능 레지스터와 마찬가지로 GPIO 레지스터에 액세스해야합니다. LPC2378 문서에는 다음과 같은 세부 사항이 표시됩니다.

#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

이 매크로를 사용하여 메모리 매핑 레지스터에 액세스하고 싶습니다.

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

그런 다음 포트를 읽는 코드는 다음과 같습니다.

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

동일한 매크로는 Set/Clear/Direction 레지스터에 액세스하기 위해 작동합니다. 예 :

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

실제 시스템에서는 일반적으로 마법의 숫자를 줄이기 위해 해당 작업에 대한 매크로 또는 기능을 작성합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top