开始搞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交替闪烁,用的是IOSET和IOCLR实现的
#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++) ; }
本文来自博客,转载请标明出处:http://blog.csdn.net/leafjunwing/archive/2011/03/05/6225099.aspx