<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
LPC2131共47个GPIO口。分别为P0[31:0]、P1[31:16],其中,P0.24未用,P0.31仅为输出口。
LPC2131的大部分引脚都有复用功能,所以有一个专门的寄存器来设置选择该引脚使用什么功能,这个寄存器就是PINSELx.(注x表示0、1、2)。PINSEL0和PINSEL1每两位代数代表一个引脚功能选择。如PINSEL0[1:0]设置P0.0功能,PINSEL0[3:2]设置P0.1功能,其余引脚依次类推。比较特殊的是PINSEL2的设置与其他上述两个PINSEL完全不同,PINSEL2是32位寄存器,其中我们只用到PINSEL2[3:2]这2位。当PINSEL2.2位为0时,P1.36:26设置为GPIO功能;为1时P1.31:26用作一个调试端口。当PINSEL2.3位为0时,P1.25:15设置为GPIO功能;为1时P1.25:15用作一个跟踪端口。
选择GPIO后,需要通过IODIR设置相应引脚的输入/输出状态。IODIR为32位寄存器,每位对应一个IO口,当某位为0时,则对应的IO口位被设为输入,反之,则被设为输出。如IO0DIR = 0x01,则P0.1被设为输出。
当GPIO被设为输出时,通过写寄存器IOSET/IOCLR可以设置相应引脚输出值1/0。IOSET为32位寄存器,每位对应一个IO口,当某位为1时,则对应的IO口位输出高电平;为0时,无效。如IO0SET = 0x01,则P0.1输出高电平;IOCLR为32位寄存器,每位对应一个IO口,当某位为1时,则对应的IO口位输出低电平;为0时,无效。如IO0CLR = 0x01,则P0.1输出低电平。读IOSET寄存器,返回的值为上一次对IOSET和IOCLR寄存器的设置值,与外部环境对引脚的影响无关。
当GPIO被设为输入时,通过读寄存器IOPIN可以知道相应引脚的当前值。IOPIN为32寄存器,每位对应一个IO口,当某位为1时,则对应的IO口位当前值为高电平;当某位为0时,则对应的IO口位当前值为低电平。
LPC的IO口与我们熟悉的51单片机最大的不同是:IO的输出需要寄存器IOSET和IOCLR,这两个寄存器一次只能输出高电平或低电平,而无法使IO口同时输出包含0和1的二进制数。当我们需要同时置位和清零几个IO口时,就需要用到IOPIN寄存器了。对IOPIN寄存器进行写操作时,就可以设置相应的IO口同时输出包含0和1的二进制数。如IO0PIN = 0x05; 则P0.0和P0.2输出高电平,其他引脚输出低电平。
下图为GPIO的使用流程:
接下来我们来看一个实例,看看C程序是怎么实现对GPIO的操作。
#include "config.h"
const uint32 BEEP = 1 << 7; // P0.7控制蜂鸣器,低电平蜂鸣
const uint32 KEY1 = 1 << 16; // P0.16连接KEY1,按下为低电平
/***************************************************************
** 函数名称 :main()
** 函数功能 :GPIO输入实验测试。
** 检测按键KEY1。KEY1按下 ,蜂鸣器蜂鸣,松开后停止蜂鸣。
** 跳线说明 :把JP8的KEY1跳线短接,JP11连接蜂鸣器。
***************************************************************/
int main (void)
{
PINSEL0 = 0x00000000; // 所有管脚连接GPIO
PINSEL1 = 0x00000000;
IO0DIR = BEEP; // 蜂鸣器控制口输出,其余输入
while (1)
{
if ((IO0PIN & KEY1) == 0) IO0CLR = BEEP;
// 如果KEY1按下,蜂鸣器鸣叫
else IO0SET = BEEP; // 松开则停止蜂鸣
}
}
用户315504 2010-12-2 11:41
用户171433 2009-8-24 09:14
用户491040 2009-7-26 12:54