原创 LPC2131学习笔记之GPIO(一)

2009-7-26 13:56 3691 8 11 分类: MCU/ 嵌入式


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />



LPC213147GPIO口。分别为P0[31:0]P1[31:16],其中,P0.24未用,P0.31仅为输出口。


 LPC2131的大部分引脚都有复用功能,所以有一个专门的寄存器来设置选择该引脚使用什么功能,这个寄存器就是PINSELx.(x表示012)PINSEL0PINSEL1每两位代数代表一个引脚功能选择。如PINSEL0[1:0]设置P0.0功能,PINSEL0[3:2]设置P0.1功能,其余引脚依次类推。比较特殊的是PINSEL2的设置与其他上述两个PINSEL完全不同,PINSEL232位寄存器,其中我们只用到PINSEL2[3:2]2位。当PINSEL2.2位为0时,P1.36:26设置为GPIO功能;为1P1.31:26用作一个调试端口。当PINSEL2.3位为0时,P1.25:15设置为GPIO功能;为1P1.25:15用作一个跟踪端口。


  选择GPIO后,需要通过IODIR设置相应引脚的输入/输出状态。IODIR32位寄存器,每位对应一个IO口,当某位为0时,则对应的IO口位被设为输入,反之,则被设为输出。如IO0DIR = 0x01,则P0.1被设为输出。


   GPIO被设为输出时,通过写寄存器IOSET/IOCLR可以设置相应引脚输出值1/0IOSET32位寄存器,每位对应一个IO口,当某位为1时,则对应的IO口位输出高电平;为0时,无效。如IO0SET = 0x01,则P0.1输出高电平;IOCLR32位寄存器,每位对应一个IO口,当某位为1时,则对应的IO口位输出低电平;为0时,无效。如IO0CLR = 0x01,则P0.1输出低电平。读IOSET寄存器,返回的值为上一次对IOSETIOCLR寄存器的设置值,与外部环境对引脚的影响无关。


   GPIO被设为输入时,通过读寄存器IOPIN可以知道相应引脚的当前值。IOPIN32寄存器,每位对应一个IO口,当某位为1时,则对应的IO口位当前值为高电平;当某位为0时,则对应的IO口位当前值为低电平。


   LPCIO口与我们熟悉的51单片机最大的不同是:IO的输出需要寄存器IOSETIOCLR,这两个寄存器一次只能输出高电平或低电平,而无法使IO口同时输出包含01的二进制数。当我们需要同时置位和清零几个IO口时,就需要用到IOPIN寄存器了。对IOPIN寄存器进行写操作时,就可以设置相应的IO口同时输出包含01的二进制数。如IO0PIN = 0x05; P0.0P0.2输出高电平,其他引脚输出低电平。


下图为GPIO的使用流程:


adeeb17d-5b59-4bc7-8e22-0f680475d215.jpg


 

接下来我们来看一个实例,看看C程序是怎么实现对GPIO的操作。


 


#include "config.h"


 


const uint32 BEEP = 1 << 7;                   // P0.7控制蜂鸣器,低电平蜂鸣


const uint32 KEY1 = 1 << 16;                // P0.16连接KEY1,按下为低电平


 


/***************************************************************


** 函数名称 main()


** 函数功能 GPIO输入实验测试。


**                  检测按键KEY1KEY1按下 ,蜂鸣器蜂鸣,松开后停止蜂鸣。


** 跳线说明 :把JP8KEY1跳线短接,JP11连接蜂鸣器。


***************************************************************/


int main (void)


{


       PINSEL0 = 0x00000000;                        // 所有管脚连接GPIO   


       PINSEL1 = 0x00000000;


       IO0DIR  = BEEP;                                   // 蜂鸣器控制口输出,其余输入


      


       while (1)


       {


              if ((IO0PIN & KEY1) == 0)  IO0CLR = BEEP;   


                                                                  // 如果KEY1按下,蜂鸣器鸣叫


                     else IO0SET = BEEP;            // 松开则停止蜂鸣


       }


      


}


PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户315504 2010-12-2 11:41

不错,原来理解错误,现在看了这个懂了

用户171433 2009-8-24 09:14

当PINSEL2.2位为0时,P1.36:26设置为GPIO功能;为1时P1.31:26用作一个调试端口。当PINSEL2.3位为0时,P1.25:15设置为GPIO功能;为1时P1.25:15用作一个跟踪端口。 ?????????????????

用户491040 2009-7-26 12:54

python_ky 朋友,是的。我看的也是周立功的书
相关推荐阅读
用户491040 2009-07-25 00:03
LPC2131学习笔记之GPIO(二)
上一篇日志中的程序并不复杂,但是却已经把GPIO的输入输出等内容都包含其中了,然后我们来看一下写好的C语言程序怎么在MDK中调试。<?xml:namespace prefix = o ns = ...
EE直播间
更多
我要评论
3
8
关闭 站长推荐上一条 /3 下一条