S3C2440的GPIO编程
一、初步认识S3C2440A
【S3C2440A简介】
S3C2440A是三星公司推出的基于ARM920t内核的32/16位RISC微处理器。主要用于手持设备和中高端电子产品中。它内部集成16k数据cashe、16k指令cashe,内存管理单元MMU,4KBSRAM(片内内存), nandflash控制器,LCD控制器,USB控制器,中断控制器,支持60个中断源,4通道PWM定时器,1个看门狗定时器。24个外部中断源,两通道SPI。具有PLL片上时钟发生器。片内集成RTC实时时钟芯片。8通道10位的A/D转换器,4通道DMA、系统主频400MHZ,最高533MHZ,通过软件设置。130个多用输入输出口。3通道UART。
二、2440的GPIO口及其控制方法
2440有130个通用输入输出口(GPIO口),分为GPA、GPB、GPC、GPD、GPE、GPF、GPG、GPH、GPI、GPJ共9组,每个端口有三组寄存器来控制,分别是GPxCON(GPx设置寄存器,用于设置引脚是输入、输出、还是其他功能)、GPxDAT (GPx数据寄存器,用于读写引脚的电平值)、GPxUP(GPx上拉电阻寄存器,用于确定引是否使用上拉电阻)
[GPxCON寄存器的功能]:GPx配置寄存器用于确定x端口(x取B~J)是输入、输出、还是其他功能。通过写此寄存器来配置相应引脚的功能,其中每两位控制一个引脚的功能。特别要注意的是2440上电复位后GPIO都默认为输出模式。
[D1:D0]=[0:0] 输入功能
[D1:D0]=[0:1] 输出功能
[D1:D0]=[1 :0] 特殊功能 (中断,PWM,UART、AD。。。。)
[D1:D0]=[1 :1] 未定义其功能
[GPxDAT寄存器的功能]:当引脚被设置为输出时,它的每一位控制一个引脚输出高电平还是低电平低,当引脚设置为输入时,可以通过读次寄存器的值来判断对应引脚电平的高低。
[GPxUP上拉电阻使能寄存器的功能]:GPxUP寄存器的m位用于确定X端口(B~J)的第m个引脚是否用上拉电阻,[m位]=1:不适用上拉电阻[m位]=0:使用上拉电阻。
上拉、下拉电阻的作用是当GPIO口既不是高电平、也不是低电平、而是高阻状态时,由上拉电阻把引脚的电平确定为一个确定的值(高或低)。
三、GPIO实验(led、蜂鸣器、键盘)
一:首先,搭建好开发环境:
开发环境建议windowsXP(如果是win7建议换装XP系统,后续很多软件不兼容),安装好usb下载驱动、usb转串口驱动、和keil4集成开发环境。硬件上需要usb转串口线、usb下载线、以及电源线,(因为刚买到的板子一般都已经预装了bootloader因此JTAG暂时没用)。
二:添加启动文件:
这儿我们要把2440当单片机来使用,但是不同的是2440一上电,系统的看门狗定时器是开着的,它会倒数计时,3秒不去关它,它就会让系统重启。而且CPU外接的64KSDRAM(内存)未初始化不能用,只能用片内的4KRAM,所以还需要初始化系统SDRAM,而且刚一上电系统的主频12M很低,可以通过软件来提高主频。因此,在编写mian()函数前首先要编写系统的初始化代码。具体地说来就是要1:关闭看门狗(必做)2:初始化内存(视情况而定,选做)3:设置系统主频(选作)4:设置好堆栈,调用main()函数(必做)。详细代码及解释如下,如果难以理解,其实keil4编译器已经帮我们写好了启动代码head.s,直接点击是添加即可。
n 2440启动代码:
[原理]2440一上电,系统的看门狗定时器是开着的,它会倒数计时,3秒不去关它, 它就会让系统重启。而且CPU外接的64KSDRAM(内存)未初始化不能用, 只能用片内的4KRAM,所以还需要初始化系统SDRAM,而且刚一上电系统的 主频12M很低,可以通过软件来提高主频。因此,在编写mian()函数前首 先要编写系统的初始化代码
[步骤]:
1:关闭看门狗(必做)
2:初始化SDRAM(选作)
3:初始化系统时钟 (选作)
4:设置好堆栈调用main()函数(必做)
/***************************************************************************************************/
实验1:GPIO输入操作之——控制4个led
[原理]:硬件上led1~led4分别接2440的GPB5,GPB6,GPB7,GPB8,低电平点亮led。
软件上GPBCON寄存器两位控制1个引脚为输入输出还是其它功能
GPBDAT寄存器写0对应引脚输出低电平写1对应引脚输出高电平。
[步骤]:1:设置GPBCON寄存器为输出模式,往寄存器里面写00为输入01为输入
2:写GPBDAT中的某一位为1输出高电平,写0输出低电平。
/********************************************************************************************/
练习1:用软件延时方法让四个led闪烁
/*********************************************************************************************/
/*宏定义,定义GPBCON寄存器GPBDAT寄存器,可以直接包含系统提供的库函数,包含头文件即可#incldue<s3c2440.h>*/
#define GPBCON (*(volatile unsigned long *) 0x56000010)
#define GPBDAT (*(volatile unsigned long *) 0x56000014)
#define uint unsigned int
/*延时函数*/
void delay(uint aa)
{
uint i,j;
for(i=50000;i>0;i--)
for(j=aa;j>0;j--)
{}
}
/*主函数*/
void main(void)
{
GPBCON=0x15400;//GPB5~GPB8全部设置为输出模式0001 0101 0100 0000 0000
while(1)
{
GPBDAT=0x00000001;//GPB5~GPB8全部输出高电平,4个led全亮
delay(300);
GPBDAT=0x000001e0;//GPB5~GPB8全部输出高电平,4个led全灭
delay(300);
}
}
/*********************************************************************************************/
练习2:用数组实现流水灯
/*********************************************************************************************/
#include<s3c2440.h>
#define uint unsigned int
uint led[]={0x000001c0,0x000001a0,0x00000160,0x000000e0};
void delay(uint aa);
int main(void)
{
char i;
GPBCON=0x00015400;//01 0101 0100 0000 0000
while(1)
{
for(i=0;i<4;i++)
{
GPBDAT=led[i];
delay(300);
}
}
return 0;
}
void delay(uint aa)
{
uint i,j;
for(i=50000;i>0;i--)
for(j=aa;j>0;j--)
{}
}
注意:led数组的类型不能是unsigned char型,因为数组值大于uchar型,数据溢出,导致程序出错。
/*********************************************************************************************/
练习3:蜂鸣器滴滴的鸣叫实验
/***************************************************************************************************/
#include<s3c2440.h>
#define uint unsigned int
#define beep_on 0x00000001
#define beep_off 0x00000000
void delay(uint aa);
int main()
{
GPBCON=0x00000001;
while(1)
{
GPBDAT=beep_on;
delay(100);
GPBDAT=beep_off;
delay(100);
}
return 0;
}
void delay(uint aa)
{
uint i,j;
for(i=50000;i>0;i--)
for(j=aa;j>0;j--)
{}
}
/***************************************************************************************************/
练习4:通过循环左移右移实现流水灯
/*********************************************************************************************/
#include<s3c2440.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint aa);
void main(void)
{
uint i,j;
GPBCON=0x00015400;
while(1)
{
for(i=5;i<=8;i++)
{
GPBDAT=~(1<<i);
delay(100);
}
}
}
void delay(uint aa)
{
uint i,j;
for(i=60000;i>0;i--)
for(j=aa;j>0;j--)
{}
}
/*********************************************************************************************/
GPIO操作之---6个独立按键驱动
[原理]:低电平按键按下
六个输入引脚: EINT8 ---- (GPG0) --- K1
* EINT11 ---- (GPG3) --- K2
* EINT13 ---- (GPG5) --- K3
* EINT14 ---- (GPG6) --- K4
* EINT15 ---- (GPG7) --- K5
* EINT19 ---- (GPG11) --- K6 (按下低电平)
/**********************************************************************************************/
练习5:按下按K1键时蜂鸣器名叫,松开k1手时蜂鸣器停止名叫
/*********************************************************************************************/
/*按下k1键蜂鸣器鸣叫、松开手时,蜂鸣器停止鸣叫*/
#include<s3c2440.h>
int main()
{
GPBCON=0x00000001;
GPGCON=0x00000000;
while(1)
{
if((GPGDAT&0x00000001)==0)
GPBDAT=0x00000001;
else
GPBDAT=0x00000000;
}
return 0;
}
/*********************************************************************************************/
练习6:k1按下时led全部闪动,松开手时led流动
/*********************************************************************************************/
#include<s3c2440.h>
#define uint unsigned int
#define uchar unsigned char
void led_liu();
void delay(unsigned int aa);
void led_jump();
void main()
{
GPBCON=0x00015400;//01 0101 0100 0000 00005678设置为输出模式
GPGCON=0x00000000;//GPG全部设置为输入
while(1)
{
if((GPGDAT&0x00000001)==0)
led_jump();
else
led_liu();
}
}
void led_liu()
{
uchar i,aa=10;
for(i=5;i<=8;i++)
{
GPBDAT=~(1<<i);
delay(100);
}
}
void led_jump()
{
uchar aa=10;
GPBDAT=0x00000000;//00000
delay(300);
GPBDAT=0x000001e0;//0001 1110 0000
delay(300);
}
void delay(unsigned int aa)
{
uint i,j;
for(i=50000;i>0;i--)
for(j=aa;j>0;j--)
{}
}
【总结】GPGDAT&0x00000001这句很重要,分析为什么这样写??
/*********************************************************************************************/
练习7:按下k1~k4时对应点亮led1~led4*/
/*********************************************************************************************/
#include<s3c2440.h>
void main()
{
char aa=5;
GPBCON=0x00015400;//01 0101 0100 0000 0000
GPGCON=0x00000000;
while(1)
{
if((GPGDAT&0x00000001)==0)
aa=5;
if((GPGDAT&0x00000008)==0)
aa=6;
if((GPGDAT&0x00000020)==0)
aa=7;
if((GPGDAT&0x00000040)==0)
aa=8;
GPBDAT=~(1<<aa);
}
}
/********************************************************************************************
按键k1按下去之后、蜂鸣器名叫、松开手时、蜂鸣器停止名叫。(主要是位操作的正确方法)
*********************************************************************************************/
#include<s3c2440.h>
int main()
{
GPBCON=GPBCON&0xfffffffc|0x00000001;//*1100 仅仅将GPB0设置为输出模式、而不改变其他位
GPGCON=GPGCON&0xffffff3c;//111 0011 1100 仅仅将GPG0和GPG3设置为输入模式、而不改变其他位
while(1)
{
if((GPGDAT&0x00000001)==0)
GPBDAT=GPBDAT&0xfffffffe|0x00000001;//仅仅将GPB0设置为1、其他位的电平不要发生变化
else
GPBDAT=GPBDAT&0xfffffffe;//仅仅将GPB0设置为0、而不影响其他位
}
return 0;
}
S3C2440的GPIO编程的更多相关文章
- Python自动化编程-树莓派GPIO编程(二)
树莓派我们编程一般都直接用高效的python,针对于GPIO编程,python也是有这一方面的库的,这里最有名也是最常用的就是RPI.GPIO了.这个库是专门为树莓派GPIO编程所设计的,利用它你可以 ...
- (一)GPIO 编程实验 LED 流水灯控制
7个寄存器 是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)类似于单片机的R0-R7. GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P ...
- s3c2440的GPIO驱动
多个通用的GPIO,同时这些端口也拥有一些复用功能(如ADC输入),有部分端口只能输入,有部分端口只能输出,今天我们来看看如何设置一个GPIO的输出电平以及如何获取一个端口的GPIO电平 对GPIO进 ...
- 树莓派的GPIO编程
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 树莓派除了提供常见的网口和USB接口 ,还提供了一组GPIO(General Purpose Input/ ...
- s3c2440裸机-时钟编程(二、配置时钟寄存器)
s3c2440裸机编程-时钟编程(二.配置时钟寄存器) 1.2440时钟时序 下图是2440时钟配置时序: 1.上电后,nRESET复位信号拉低,此时cpu还无法取指令工作. 2.nRESET复位信号 ...
- s3c2440裸机-时钟编程(一、2440时钟体系介绍)
1.总线框架 下图是2440的总线框架,其中有AHB(Advanced High performance Bus)高速总线,APB(Advanced Peripheral Bus)外围总线. 不同总线 ...
- 十一、S3C2440 裸机 — GPIO
11.1 GPIO 介绍 11.1.1 GPIO 管脚 GPIO 即是输入输出端口,S3C2440A 包含了 130 个多功能输入/输出口引脚并且它们为如下显示的八个端口: 端口 A(GPA):25 ...
- S3C2440的GPIO
S3C2440一共有A B C D E F G H J 共九组IO口,一共是130个,每组IO口的个数如下图所示, 其中A组IO口只有输出功能,没有输入功能, 关于GPXCON寄存器,这个寄存器用来配 ...
- 7、树莓派编程;gpio编程;led闪烁
本博文仅作本人操作过程的记录,留作备忘.自强不息 QQ12226981 1.树莓派接口对照,一定要找到对应的引脚,不要接错了.我画上箭头. 2.安装 下载地址,https://git.drogon.n ...
随机推荐
- Java常用jar包用途
Java常用jar包用途: USAGE INDEX JAR NAME USAGE 1 ASM asm-2.2.3.jar ASM字节码库 2 ASM asm-commons-2.2.3.jar ASM ...
- count(*)、count(val)和count(1)的解释
一.关于count的一些谣言: 1.count(*)比count(val)更慢!项目组必须用count(val),不准用count(*),谁用扣谁钱! 2.count(*)用不到索引,count(va ...
- 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数
1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...
- run loop 输入源
做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出 ...
- OS开发拓展篇—应用之间的跳转和数据传
iOS开发拓展篇-应用之间的跳转和数据传 说明:本文介绍app如何打开另一个app,并且传递数据. 一.简单说明 新建两个应用,分别为应用A和应用B. 实现要求:在appA的页面中点击对应的按钮,能够 ...
- ACM题目————最长回文串
Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组cas ...
- JS获取非行间样式
我们都知道用offset函数获取元素样式是一件很方便的事,但是offset只能获取行间样式,而无法获得非行间样式,这是它的瓶颈所在. 我们都知道js获取行间样式的方法,那么js是如何获取行距样式的呢? ...
- JSP 资源与网站
JS文件说明 1.1 jquery 描述:一个兼容多浏览器的javascript框架,可以操作文档对象.选择DOM元素.制作动画效果.事件处理.使用Ajax以及其他功能. 文件路径:Commonjs/ ...
- 安装zeromq以及zeromq的python示例
下载ZeroMq: wget https://github.com/zeromq/zeromq4-1/releases/download/v4.1.5/zeromq-4.1.5.tar.gz 解压: ...
- phpcms 04
首页index.html 首页头条推荐 <div class="col-left"> <div class="news-hot"> &l ...