s3c2440的GPIO驱动
S3C2440包含有130多个通用的GPIO,同时这些端口也拥有一些复用功能(如ADC输入),有部分端口只能输入,有部分端口只能输出,今天我们来看看如何设置一个GPIO的输出电平以及如何获取一个端口的GPIO电平
对GPIO进行操作分为以下几步
1. 功能设置,GPXCON寄存器,针对于2440addr.h,分别为
rGPACON, rGPBCON, rGPCCON, rGPDCON, rGPECON, rGPFCON, rGPGCON, rGPHCON, rGPJCON
通过设置不同的值来选着不同的功能,输入,输出,复用,等
2. 数据读写,GPXDAT寄存器,在输入模式下,dat寄存器相应位代表相应引脚的当前电平,在输出模式下, dat寄存器相应位代想要设置的相应电平
(注,2440addr.h中的寄存器前面都有一个小写r开头).
3. 内部上拉寄存器GPXUP寄存器,可以设置相应位的内部上拉是否打开
设置好这三位之后,GPIO就可以正常操作了
以下是GPIO输出LED,使用GPB5-GPB8
Led.c
#include "led.h" void LedInit(void) { //GPB 01为输出模式,先清零寄存器为00 rGPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16));//10 b5 12 b6 14 b7 16 b8 //设置相应寄存器为01 rGPBCON |= ((1<<10)|(1<<12)|(1<<14)|(1<<16)); //禁止上拉,因为是输出 rGPBUP &= ~((1<<5)|(1<<6)|(1<<7)|(1<<8)); //设置初始化为1 led处于熄灭状态 rGPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8)); } void LedSet(u8 ch,u8 value) { switch(ch) { case 0: if(value)rGPBDAT |= (1<<5); else rGPBDAT &= ~(1<<5); break; case 1: if(value)rGPBDAT |= (1<<6); else rGPBDAT &= ~(1<<6); break; case 2: if(value)rGPBDAT |= (1<<7); else rGPBDAT &= ~(1<<7); break; case 3: if(value)rGPBDAT |= (1<<8); else rGPBDAT &= ~(1<<8); break; } }
Led.h
#ifndef __LED_H #define __LED_H #include "2440addr.h" #include "def.h" void LedInit(void); void LedSet(u8 ch,u8 value); #endif
以下是GPIO输入按键检测,使用GPIOF 0 1 2 4
Key.c
#include "key.h" u8 keyValue = 0; void KeyInit(void) { rGPFCON &=~((3<<2)|(3<<8)|(3<<4)|(3<<0)); //对GPFCON[10:17]清零 rGPFUP &=~((1<<1)|(1<<4)|(1<<2)|(1<<0)); //设置上拉功能 rGPFDAT |=(1<<1)|(1<<4)|(1<<2)|(1<<0); //设定初始值 } //按键按下,相关端口为0,没有按键按下时,不会自动清零,会保持最后一次的状态,需要用户自己去清零 u8 GetKeyValue(void) { u32 temp = rGPFDAT; if(!(temp & (1<<0))) //如果相关端口为0 { keyValue = KEY_UP; return keyValue; } if(!(temp & (1<<1))) { keyValue = KEY_DOWN; return keyValue; } if(!(temp & (1<<2))) { keyValue = KEY_LEFT; return keyValue; } if(!(temp & (1<<4))) { keyValue = KEY_RIGHT; return keyValue; } return 0; }
Key.h
#ifndef __KEY_H #define __KEY_H #include "2440addr.h" #include "def.h" //按键全部上拉 //key1 对应 F1 //key2 对应 F4 //key3 对应 F2 //key4 对应 F0 #define KEY_UP 1 #define KEY_DOWN 2 #define KEY_LEFT 3 #define KEY_RIGHT 4 extern u8 keyValue; void KeyInit(void); u8 GetKeyValue(void); #endif