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

s3c2440的GPIO驱动的更多相关文章

  1. S3C2440上LCD驱动(FrameBuffer)实例开发讲解

    一.开发环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二.背景知识 ...

  2. Linux下GPIO驱动(三) ----gpio_desc()的分析

    上篇最后提出的疑问是结构体gpio_chip中的成员函数set等是怎么实现的,在回答之前先介绍下gpio_desc这个结构体. 如上图所示,右上方部分为GPIO驱动对其它驱动提供的GPIO操作接口,其 ...

  3. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二

    /** ****************************************************************************** * @author    暴走的小 ...

  4. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之一

    /** ****************************************************************************** * @author    暴走的小 ...

  5. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三

    /** ****************************************************************************** * @author    暴走的小 ...

  6. 开发GPIO驱动的基本套路

    最近完成了基于AR9331的GPIO驱动的开发,主要包括:控制一个连接GPIO的灯控:接收一个连接GPIO的按键事件:以及接收一个连接GPIO的脉冲事件. 这里,结合开发实践,总结一下GPIO驱动开发 ...

  7. [RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】

    本文转载自:http://m.blog.csdn.net/kris_fei/article/details/69553422 Platform: ROCKCHIPOS: Android 6.0Kern ...

  8. uboot的GPIO驱动分析--基于全志的A10芯片【转】

    本文转载自:http://blog.csdn.net/lw2011cg/article/details/68954707 uboot的GPIO驱动分析--基于全志的A10芯片 转载至:http://b ...

  9. MM32F0020 GPIO驱动LED灯(MM32F0020 GPIO Toggle)

    目录: 1.MM32F0020简介 2.MM32F0020系统时钟配置 3.MM32F0020的GPIO外设配置及其初始化 4.使用官网的Systick定时器做延时 5.MM32F0020 GPIO驱 ...

随机推荐

  1. [转]MD5加密算法的java实现

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /* * MD5 算法 */ pu ...

  2. 编译hadoop2.4

    摘自 http://www.aboutyun.com/thread-8130-1-1.html.http://www.dataguru.cn/forum.php?mod=viewthread& ...

  3. Ubuntu不可以ping百度,但是可以ping通其ip

    原来也安装过几个ubuntu系统,但是今天遇到一个很奇怪的情况,明明ifconfig显示已经获取了网络上的ip,但是浏览器就是打不开网页,百思不得其解.因为这几天用ping用多了,所以进行了以下尝试: ...

  4. windbg 之 如何定位进程入口点地址

    载入HelloWorld.exe之后我们看看加载了哪些模块:

  5. springmvc json数据

    的 @RequestMapping("/getAllEdu") @ResponseBody public void getAllEdu(HttpServletRequest req ...

  6. php源码分析之base64_encode函数

    base64_encode编码规律分析 字符串长度除以3向上取整乘以4等于编码后的字符串长度 ceil(strlen($string)/3)*4 = strlen(base64_encode($str ...

  7. 关于Jsp页面在ww:iterator 标签里面判断的写法是可以直接写数组里面的变量的

    因为上面已经遍历了,所以可以直接写变量名

  8. Brain Network (medium)

    Brain Network (medium) Further research on zombie thought processes yielded interesting results. As ...

  9. opencv-jni -调试出错taking address of temporary [-fpermissive]

    今天在进行代码往安卓平台移植时,IplImage *qImg=&(IplImage)dst1;报错taking address of temporary [-fpermissive] 百度了一 ...

  10. PAT1010

    Given a pair of positive integers, for example, 6 and 110, 给出一对正整数,例如6和110 can this equation 6 = 110 ...