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. ReactiveCocoa 浅析

    转载自:http://limboy.me/ios/2013/12/27/reactivecocoa-2.html   ReactiveCocoa是Github开源的一款cocoa FRP 框架,我在之 ...

  2. SQL Server触发器的禁用和启用

    禁用: ALTER TABLE trig_example DISABLE TRIGGER trig1 GO 恢复: ALTER TABLE trig_example ENABLE TRIGGER tr ...

  3. LINUX中磁盘挂载与卸除

    一.挂载格式与参数说明: 要将文件系统挂载到我们的 Linux 系统上,就要使用 mount 这个命令啦! 不过,这个命令真的是博大精深-粉难啦!我们学简单一点啊- ^_^ [root@www ~]# ...

  4. CNS数据库网站开发环境的配置

    1)下载wamp服务器.使用php来开发 2)配置mysql服务器,主要把原来已有的数据导入到wamp服务器的mysql.改mysql的my.ini里德datadir的地址即可,将datadir设为已 ...

  5. Linux查看文件最后几行的命令,日志的福音啊

    tail -n 20 filename说明:显示filename最后20行

  6. c# 如何判断字符串中相同字符串的个数 (相同字符在字符串中出现的次数)

    /// <summary> /// 计算字符串中子串出现的次数 /// </summary> /// <param name="str">字符串 ...

  7. 【gcd】 最大公约数

    int gcd(int a,int b) { int r; ) { r=a%b; a=b; b=r; } return a; }

  8. Htpasswd 给网站后台目录加密

    http://www.l0phtcrack.com/download.html打开apache配置文件 httpd.conf  配置如下:  <Directory "/var/www/ ...

  9. Django之路:简介以及环境

     (sudo) pip install Django 或者 (sudo) pip install Django==1.6.10 或者 pip install Django==1.7.6 Windows ...

  10. sqlDataAdapter的FillSchema用法

    摘自于网络:http://blog.csdn.net/bupt_zoucq/article/details/6653385 FillSchema是用来向DataTable中填入详细的元数据信息的,例如 ...