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. linux系统tomcat项目部署和tomcat访问日志

    一.只用ip地址访问 先把端口号改成80,然后用 <Host name="localhost"  appBase="webapps"    137     ...

  2. HDU - 1083 Courses /POJ - 1469

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1083 http://poj.org/problem?id=1469 题意:给你P个课程,并且给出每个课 ...

  3. 批量文件重命名工具-极力推荐 advanced renamer

    http://www.advancedrenamer.com/  功能太强大了,自己慢慢探索吧.

  4. 移动端touch点穿(穿透)解决办法

    回答一 穿透(点穿)是在mobile各种浏览器上发生的常见的bug.可能是由click事件的延迟或者事件冒泡导致. 移动web开发常用的Zepto库中的touch和tap事件就会有点穿的bug(Zep ...

  5. android AsyncTask介绍 转载

    http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html AsyncTask和Handler对比 1 ) AsyncTask实 ...

  6. zf-关于注册码过期

    Webroot-index.jsp下 少写了个函数 导致登陆进去不能弹出注册码过期的对话框,函数如下 window.onload = function() { <ww:iterator valu ...

  7. 转 ogg组件介绍

    应用场景:数据分发   ogg的组件: (1) OGG 程序和工具说明 convchk   转换ogg版本的信息 ,该程序可以将checkpoint files 转换成新版本: convprm :OG ...

  8. Android------>TableLayout表格布局方式

    main.xml表格代码分析 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmln ...

  9. HDU 5521 Meeting

    2015 ACM / ICPC 沈阳站现场赛 M题 最短路 设置N+M个节点,前N个节点是Block,后M个节点是Set,每一组Set中的点向该Set连边,从1和n开始分别求最短路.注意爆int. # ...

  10. 深入浅出Ajax(五)

    function initPage() { alert("3+3");//3+3 alert(eval("3+3")); //6 //eval()函数可以解析. ...