如何从ARM微控制器的GPIO端口读取值?

Ale*_*der 3 c embedded arm

如何将ARM微控制器端口值转换为32位变量.

我正在使用LPC2378微控制器.

Car*_*rum 9

您需要像访问芯片中的任何其他特殊功能寄存器一样访问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
Run Code Online (Sandbox Code Playgroud)

我喜欢使用这个宏来访问内存映射寄存器:

#define mmioReg(a) (*(volatile unsigned long *)(a))
Run Code Online (Sandbox Code Playgroud)

然后读取端口的代码如下所示:

unsigned long port0 = mmioReg(IOPIN0); // Read port 0
unsigned long port1 = mmioReg(IOPIN1); // Read port 1
Run Code Online (Sandbox Code Playgroud)

相同的宏用于访问置位/清除/方向寄存器.例子:

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
Run Code Online (Sandbox Code Playgroud)

在实际系统中,我通常会为这些操作编写一些宏或函数,以减少幻数.

  • 可能有一个头文件可用于LPC2378(由芯片制造商,恩智浦提供,或者可能由编译器公司提供),为您提供所有这些. (3认同)