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. couldn't connect to server 127.0.0.1:27017 at src/mongo/shell/mongo.js:145

    当直接执行./mongo 出现这样的提示:couldn't connect to server 127.0.0.1:27017 at src/mongo/shell/mongo.js:145 解决: ...

  2. ReactiveCocoa 用法实例

      我个人非常推崇ReactiveCocoa,它就像中国的太极,太极生两仪,两仪生四象,四象生八卦,八卦生万物.ReactiveCocoa是一个高度抽象的编程框架,它真的很抽象,初看你不知道它是要干嘛 ...

  3. 让横向ul在页面中水平居中的方法

    在导航的布局中,导航条会用横向布局的ul li.如果要让其居中,怎么办呢? 第一种方法: ul{text-align:center;} li{display:inline} 这种方法不适合ie低版本. ...

  4. 2016中国大学生程序设计竞赛 - 网络选拔赛 1004 Danganronpa

    Problem Description Chisa Yukizome works as a teacher in the school. She prepares many gifts, which ...

  5. 使用Retrofit和RxJava

    使用Retrofit和RxJava整合访问网络,然后将数据显示到界面上 def retrofitVersion = '2.0.0-beta1' dependencies { compile fileT ...

  6. 浅谈ajax的优点与缺点

    AJAX (Asynchronous Javascript and XML) 是一种交互式动态web应用开发技术,该技术能提供富用户体验. 完全的AJAX应用给人以桌面应用的感觉.正如其他任何技术,A ...

  7. JavaBean--JavaBean与表单

    SimpleBean.java: package cn.mldn.lxh.demo ; public class SimpleBean { private String name ; private ...

  8. (转)如何向map和reduce脚本传递参数

    [MapReduce] 如何向map和reduce脚本传递参数,加载文件和目录 分类: hadoop2014-04-28 21:30 1553人阅读 评论(0) 收藏 举报 hadoop 本文主要讲解 ...

  9. sql查询技巧,按时间分段进行分组,每半小时一组统计组内记录数量

    今天拿到一个查询需求,需要统计某一天各个时间段内的记录数量. 具体是统计某天9:00至22:00时间段,每半小时内订单的数量,最后形成的数据形式如下: 时间段          订单数 9:00~9: ...

  10. Bootstrap 手风琴搭配导航条实现常用菜单栏

    效果 HTML代码 <div class="sidebar"> <div class="mc-search"> <div clas ...