【问题标题】:How to read value from GPIO port of an ARM microcontroller?如何从 ARM 微控制器的 GPIO 端口读取值?
【发布时间】:2009-11-27 19:37:44
【问题描述】:

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

我正在使用 LPC2378 微控制器。

【问题讨论】:

  • 您使用的是哪种设备? GPIO 不是 ARM 内核的一部分,它们是通过其他一些片上系统外设访问的。
  • 编译器附带的头文件将包含所有微控制器寄存器的声明,以及这些寄存器中的位。有关所有寄存器和位的作用,请参阅参考手册,并查看一些示例。两者都可以在这里找到:keil.com/dd/chip/4153.htm

标签: c embedded arm


【解决方案1】:

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

同样的宏可用于访问设置/清除/方向寄存器。例子:

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

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

【讨论】:

  • 可能有一个可用于 LPC2378 的头文件(由芯片制造商 NXP 或编译器公司提供)为您提供所有这些。
  • 这部分我看不懂:(*(volatile unsigned long *)(a))。请帮帮我。
  • @AkhilPOommen,你不明白什么?
  • 嘿,请告诉我两者的区别:(1.) #define newreg (GPIO_addr) (2.) unsigned long *newreg = (GPIO_addr) (3.) unsigned long *newreg = (unsigned长 *)(GPIO_addr)。
  • 我正在尝试在不使用任何库的情况下对微控制器进行编程,只需查看数据表即可。我想知道如何直接声明一个指向内存映射中特定寄存器的变量。请帮帮我。
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多