ARM9的裸奔(一)——GPIO的输入与输出

S3C2440A有九组IO口,共130个。每组IO口数目不同,其中A组口只有输出功能。截图如下:


关于对IO口的操作,就主要设计到3个寄存器。GPXCON(配置),GPXUP(上拉使能),GPXDAT(数据)。其中GPXCON配置IO寄存器中每两位控制1个IO口。00表示输入,01表示输出,10表示第三功能,11保留。

对数据寄存器GPXDAT的操作则是相应位写1高电平,写0低电平。上拉是能寄存器GPXUP则是相应位为1时禁止相应端口的上拉电阻,为0使能。


下面的代码实现了实现按下某个按键时,相应LED亮,松开按键时LED灭。练习了IO口德输入与输出。


下面是我的原理图跟LED控制和按键控制相关的IO口。


写程序期间有个小插曲。错把GPF6看成GPG6,直接让我郁闷了会儿,又是想当然做的怪。看看其它5个口都是G口。

下面是程序代码:

#include 
#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


你可能感兴趣的:(Linux)