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

来源:互联网 发布:ubuntu 14.04 jdk 编辑:程序博客网 时间:2024/04/29 06:16

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 <S3C2440.h>#include "cfg.h"#defineKEY1(1<<1) #define KEY2(1<<9)#define KEY3(1<<10)#define KEY4(1<<11)#define LED1(1<<5)#defineLED2(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 InitGPBCON &= ~((3<<10) | (3<<12) | (3<<14) | (3<<16));GPBCON |= (1<<10) | (1<<12) | (1<<14) | (1<<16);//LED_IO configure outputTURN_OFF_LEDS;//KEY InitGPGCON &= 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);elseTURN_OFF_LEDS;}int main(void){Key_led_init();while(1){Key_scan();}}

其中头文件cfg.h是一个配置文件,现在里面暂时只有一些数据类型的别名。头文件如下:

#ifndef _CFG_H#define _CFG_Htypedef unsigned int u32;typedef unsigned short u16;typedef unsigned char u8;typedef signed int s32;typedef signed short s16;typedef signed char s8;#endif


原创粉丝点击