s3c2440的GPIO驱动

发布者:shiwanyongbing最新更新时间:2017-01-07 来源: eefocus关键字: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


关键字:s3c2440  GPIO驱动 引用地址:s3c2440的GPIO驱动

上一篇:S3C2440串口及其中断系统详解
下一篇:S3C2440硬件连接解析

推荐阅读最新更新时间:2024-03-16 15:29

基于嵌入式ARMS3C2440的裂纹实时测量系统的设计
引 言 在建筑业中,评价墙体裂纹,地面裂纹是评价房屋质量的一项重要指标。一个嵌入式系统装置一般都由嵌入式计算机系统和执行装置组成,嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、系统软件层和应用软件层组成。执行装置也称为被控对象,它可以接受嵌入式计算机系统发出的控制命令,执行所规定的操作或任务。执行装置可以很简单,如手机上的一个微小型的电机,当手机处于震动接收状态时打开;也可以很复杂,如SONY 智能机器狗,上面集成了多个微小型控制电机和多种传感器,从而可以执行各种复杂的动作和感受各种状态信息。嵌入式系统硬件层的核心是嵌入式微处理器,嵌入式微处理器与通用CPU最大的不同在于嵌入式微处理器大多工作在为特定用户群所专用设计
[单片机]
基于嵌入式ARMS3C2440的裂纹实时测量系统的设计
S3C2440PWM 定时器
S3C2440A 有5个16位定时器。其中定时器0、1、2和3具有脉宽调制(PWM)功能。定时器4是一个无输出引脚 的内部定时器。定时器0还包含用于大电流驱动的死区发生器。 定时器0和1共用一个8位预分频器,定时器2、3和4共用另外的8位预分频器。每个定时器都有一个可以生成5种 不同分频信号(1/2,1/4,1/8,1/16和TCLK)的时钟分频器。每个定时器模块从相应8位预分频器得到其自己的时钟信 号。8位预分频器是可编程的,并且按存储在TCFG0和TCFG1寄存器中的加载值来分频PCLK。 定时计数缓冲寄存器(TCNTBn)包含了一个当使能了定时器时的被加载到递减计数器中的初始值。定时比较缓 冲寄
[单片机]
S3C2440PWM 定时器
mini2440也即S3C2440地址分配问题
写这篇文章完全是回答一个网友的问题,因为我之前也是对这里不理解,现在简单说一下。源引问题“mini2440的地址到底是怎么分配的呢?内部rom ram 外部的ram和rom分别占用的地址是多少啊,我从板子上看到有3个k4561632N芯片还有一个S29AL016J70TF102.但是看了相关的电路图也不知道他的地址是怎么分配的” 你问的是mini2440的地址怎么分配。我只能再细节一下你的问题,mini2440处理器的地址怎么分配。mini2440的处理器是S3C2440,理论上,S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址(也就是0x0000 0000--0x4000 0000)为外设地址空间
[单片机]
mini2440也即<font color='red'>S3C2440</font>地址分配问题
S3C2440裸机------LCD_框架与准备
1.框架 2.准备工作 我们需要准备一个支持norfalsh和nandflash启动的程序,当我们的程序小于4K时,我们可以把nandflash的程序拷贝到片内4K内存,但是现在我们的程序大于4K,这时候我们要把程序拷贝到SDRAM里面。
[单片机]
<font color='red'>S3C2440</font>裸机------LCD_框架与准备
基于linux2.6.30.4的s3c2440寄存器的虚拟地址和物理地址的关系
1 想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理。 刚开始学字符设备驱动,感觉最难的是驱动和底层硬件的连接。linux上的驱动程序,是基于操作系统之上的,他并不直接和底层的硬件打交道,但是我们写的驱动必须能使硬件“跑”起来,即与硬件紧密相连。 就拿最简单的LED驱动来说,我们的驱动程序是在虚拟的内存上面跑的,但是最终,LED的点亮还是必须靠GPIO管脚的高低电平来控制。那么,我们的虚拟的内存怎么才能和实际的硬件上面的寄存器对应起来呢? 这篇要写的就是ioremap这个映射函数,他可以将我们硬件上面的寄存器,映射为虚拟的内存,从而使驱动程序在我们的虚拟的内存中运行。 #incl
[单片机]
通过嵌入式Linux和S3C2440处理器实现无线监控报警系统的设计
随着计算机网络技术、移动通信技术、多媒体技术的快速发展,无线监控系统以其便捷、实用、安装方便等优点被广泛应用于军事、工业、农业等场合,更走进了人们的日常生活,给人们的生活带来了便捷的信息化服务。文中设计实现了一种基于ARM9的室内无线监控报警系统,实现了室内环境信息监控、智能家居控制、图像信息采集存储及与用户实时远程信息交互的功能,并可在紧急情况下报警。在智能楼宇、智能家居、农业大棚、养殖等领域有广泛的应用和发展前景。 1、 硬件设计 1.1 系统总体架构 无线监控报警系统以ARM9为核心,主要实现室内环境信息采集、智能家居控制、图像信息采集、远程无线监控报警等功能。系统的总体架构如图1所示,由7个主要模块构成。其中室内信息采
[单片机]
通过嵌入式Linux和<font color='red'>S3C2440</font>处理器实现无线监控报警系统的设计
Uboot在S3C2440上的移植详解(四)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 在这一篇中,我们首先让开发板对CS8900或者DM9000X网卡的支持,然后再分析实现u-boot怎样来引导Linux内核启动。因为测试u-boot引导内核我们要用到网络下载功能。 7)u-boot对CS8900或者DM9000X网卡的支持。 u-boot-2009.08版本已经对CS8900和DM9000X网卡有比较完善的代码支持(代码在
[单片机]
Uboot在<font color='red'>S3C2440</font>上的移植详解(四)
s3c2440对K9F2G08UOB Nand Flash的简单操作函数
功能:先擦除一块nand flash地址,然后往里面写一字符串,最后再读出来 实现,擦除、写、读功能。 芯片型号:K9F2G08UOB /**************************************************** 擦除nand flash 0x500000 地址 主函数:erase.c ****************************************************/ #define NFCONF *(volatile unsigned long *)0x4E000000 #define NFCONT *(volatile unsigned long *)0x4E000004
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved