【转】ARM7 LPC2103–GPIO功能详细使用说明

 

 

开始搞ARM7了,虽说本来很早就准备玩ARM,手头这个LPC2103的板子还是08年2月份买的……一直到最近学校那什么无聊实习在用ARM,好吧,我其实突击还是很可以的……
芯片上手第一件事干嘛!?看基本的电路,芯片的引脚链接,既然手头已经有现成开发板,那么省得自己做电路了。学芯片,首当其冲的当然是GPIO喽!~
啥是GPIO?通用输入/输出~是完全可控的引脚,就像51中没有硬件SPI和IIC就得靠GPIO模拟出来。
NXP的ARM7有几组GPIO的控制寄存器,对于我手头的LPC2103,32个GPIO正好4字节,也就是控制寄存器基本都是一个DWORD(unsigned long)类型的。

首先来说说PINSEL0和PINSEL1。因为这个芯片很多引脚是复用的,自然多个功能不可能同时使用,所以就需要选择引脚功能,用的就是这两个寄存器,具体细节就不说了,自己看Datasheet吧…LPC2103中PINSEL0管PIN0.0-PIN0.15,PINSEL1管PIN0.16-PIN0.31。值的设定基本是00–GPIO,01–第一复用功能,02–第二复用功能03–第三复用功能。这两个寄存器的复位值都是0×00000000,也就是所有引脚复位都是做GPIO用的。

再下来是GPIO的控制寄存器了。
IOPIN 管脚值寄存器。可以用来读取当前的管脚值,赋值也可以控制管脚输出。
IOSET 用来管脚置位的寄存器。写0无效,写1管脚置高电平。
IOCLR 用来管脚清除的寄存器。写0无效,写1管脚置低电平。
IODIR 管脚方向控制寄存器。0对应输入,1对应输出。复位值:0×00000000(所有管脚复位为输入)

IOSET和IOCLR是组合起来用的,也可以直接用IOPIN来控制引脚。其实和51以及AVR比起来,这个控制还是很随意的,对于51连方向寄存器都没,AVR的话只有一个类似IOPIN的寄存器。还是人家ARM好啊……

另外对于GPIO还有一组功能相同的寄存器,叫快速GPIO寄存器(Fast GPIO),速度比慢速的快大约3.5倍。
寄存器有FIODIR/FIOMASK/FIOPIN/FIOSET/FIOCLR,这个除了多的那个FIOMASK寄存器,其他功能与上面相同
FIOMASK 快速GPIO管脚屏蔽寄存器,对快速IO管脚的任何操作只有在对该寄存器对应位激活(写0)时有效

下面给出一些示例代码:

1.第一个实例是令两个LED交替闪烁,用的是IOSETIOCLR实现的

#include <LPC2103.H>
 
#define uint unsigned int
#define uchar unsigned char
 
#define LED1 (1<<17)//define LED1 port
#define LED2 (1<<18)//define LED2 port
 
void MyDelay(uint tm);
 
int main(){
 PINSEL0=0x00000000;//link all port to GPIO
 PINSEL1=0x00000000;
 IODIR=LED1|LED2;//set LED1 & LED2 port to be output
 while(1){  
  IOCLR=LED1;//set LED1 port low
  IOSET=LED2;//set LED2 port high
  MyDelay(100);
  IOCLR=LED2;//set LED2 port low
  IOSET=LED1;//set LED1 port high
  MyDelay(100);
 }
}
 
void MyDelay(uint tm){//delay function
 uint i,j,k;
 for(i=0;i<tm;i++)
  for(j=0;j<1000;j++)
   for(k=0;k<100;k++)
    ;
}
2.第二个实例是从5向按钮(类似手机导航键那种按钮)读取按键来进行不同的闪烁。控制端口输出使用的IOPIN寄存器。
#include <LPC2103.H>
 
#define uint unsigned int
#define uchar unsigned char
 
#define LED1 (1<<17)//define LED1 port
#define LED2 (1<<18)//define LED2 port
 
#define KEY0 (1<<24)//define KEY0 port (SELECT)
#define KEY1 (1<<11)//define KEY1 port (UP)
#define KEY2 (1<<10)//define KEY2 port (DOWN)
#define KEY3 (1<<23)//define KEY3 port (LEFT)
#define KEY4 (1<<12)//define KEY4 port (RIGHT)
 
void MyDelay(uint tm);
 
int main(){
 IODIR=LED1|LED2;//set LED1 & LED2 port to be output
 IOPIN=0xFFFFFFFF;//set output port high
 while(1){
  if((IOPIN & KEY0)==0x00){//SELECT press
   IOPIN=0;
   MyDelay(100);
   IOPIN=LED1|LED2;//LEDs off
  }
  else if((IOPIN & KEY1)==0x00){//UP press
   IOPIN=LED1;//LED1 on
   MyDelay(100);  
   IOPIN=LED1|LED2;//LEDs off
  }
  else if((IOPIN & KEY2)==0x00){//DOWN press
   IOPIN=LED2;//LED2 on
   MyDelay(100);  
   IOPIN=LED1|LED2;//LEDs off
  }
  else if((IOPIN & KEY3)==0x00){//LEFT press
   IOPIN=LED1;//LED1 on
   MyDelay(100);  
   IOPIN=LED1|LED2;//LEDs off
   MyDelay(100);
   IOPIN=LED1;//LED1 on
   MyDelay(100);     
   IOPIN=LED1|LED2;//LEDs off
  }
  else if((IOPIN & KEY4)==0x00){//RIGHT press
   IOPIN=LED2;//LED2 on
   MyDelay(100);     
   IOPIN=LED1|LED2;//LEDs off
   MyDelay(100);
   IOPIN=LED2;//LED2 on
   MyDelay(100);     
   IOPIN=LED1|LED2;//LEDs off
  }
 }
}
 
void MyDelay(uint tm){//delay function
 uint i,j,k;
 for(i=0;i<tm;i++)
  for(j=0;j<1000;j++)
   for(k=0;k<100;k++)
    ;
}
3.第三个实例是快速GPIO的示例,注意一点是—-要让GPIO工作在快速GPIO需要设置SCS寄存器为1!!!然后对快速GPIO寄存器操作才有效。程序功能与示例1略有不同,示例里面还演示了FIOMASK寄存器,屏蔽了LED2,所以只有LED1在闪烁。
#include <LPC2103.H>
 
#define uint unsigned int
#define uchar unsigned char
 
#define LED1 (1<<17)//define LED1 port
#define LED2 (1<<18)//define LED2 port
 
void MyDelay(uint tm);
 
int main(){
 SCS=1;
 FIODIR=LED1|LED2;//set LED1 & LED2 port to be output
 while(1){
  FIOMASK=~(LED1);
  FIOCLR=LED1;//set LED1 port low
  FIOSET=LED2;//set LED2 port high -- No use
  MyDelay(100);
  FIOCLR=LED2;//set LED2 port low
  FIOSET=LED1;//set LED1 port high -- No use
  MyDelay(100);
 }
}
 
void MyDelay(uint tm){//delay function
 uint i,j,k;
 for(i=0;i<tm;i++)
  for(j=0;j<1000;j++)
   for(k=0;k<100;k++)
    ;
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leafjunwing/archive/2011/03/05/6225099.aspx

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值