ARM9的裸奔(一)——GPIO的輸入與輸出

S3C2440A有九組IO口,共130個。每組IO口數目不一樣,其中A組口只有輸出功能。截圖以下:設計


關於對IO口的操做,就主要設計到3個寄存器。GPXCON(配置),GPXUP(上拉使能),GPXDAT(數據)。其中GPXCON配置IO寄存器中每兩位控制1個IO口。00表示輸入,01表示輸出,10表示第三功能,11保留。code

對數據寄存器GPXDAT的操做則是相應位寫1高電平,寫0低電平。上拉是能寄存器GPXUP則是相應位爲1時禁止相應端口的上拉電阻,爲0使能。it


下面的代碼實現了實現按下某個按鍵時,相應LED亮,鬆開按鍵時LED滅。練習了IO口德輸入與輸出。class


下面是個人原理圖跟LED控制和按鍵控制相關的IO口。原理


寫程序期間有個小插曲。錯把GPF6當作GPG6,直接讓我鬱悶了會兒,又是想固然作的怪。看看其它5個口都是G口。配置

下面是程序代碼:數據類型

#include <S3C2440.h>
#include "cfg.h"

#define	KEY1	(1<<1)			 
#define KEY2	(1<<9)
#define KEY3	(1<<10)
#define KEY4	(1<<11)

#define LED1	(1<<5)
#define	LED2	(1<<6)
#define LED3	(1<<7)
#define LED4	(1<<8)

#define READ_KEY(x) (GPGDAT & (x)) 	
#define TURN_ON(x)	(GPBDAT &= ~(x))
#define TURN_OFF_LEDS	(GPBDAT |= LED1 | LED2 | LED3 | LED4)
#define TURN_ON_LEDS	(GPBDAT &= ~(LED1 | LED2 | LED3 | LED4))

void Key_led_init(void)
{
	//LED Init
	GPBCON &= ~((3<<10) | (3<<12) | (3<<14) | (3<<16));	
	GPBCON |= (1<<10) | (1<<12) | (1<<14) | (1<<16);	//LED_IO configure output
	TURN_OFF_LEDS;
	//KEY Init
	GPGCON &= 0x0;
}

void Key_scan(void)
{
	if(READ_KEY(KEY1) == 0)
		TURN_ON(LED1);
	else if(READ_KEY(KEY2) == 0)
		TURN_ON(LED2);
	else if(READ_KEY(KEY3) == 0)
		TURN_ON(LED3);
	else if(READ_KEY(KEY4) == 0)
		TURN_ON(LED4);
	else
		TURN_OFF_LEDS;
}

int main(void)
{
	Key_led_init();
	
	while(1)
	{
		Key_scan();
	}
}

其中頭文件cfg.h是一個配置文件,如今裏面暫時只有一些數據類型的別名。頭文件以下:

#ifndef _CFG_H
#define _CFG_H

typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
typedef signed int s32;
typedef signed short s16;
typedef signed char s8;

#endif
相關文章
相關標籤/搜索