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

同じマクロは、セット/クリア/方向レジスタにアクセスするために機能します。例:

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