原创 GPIO基本操作之——ARM7:NXP_LPC2103

2008-7-30 14:16 10354 8 11 分类: MCU/ 嵌入式

注:本文的所有操作都是基于NXP公司的ARM7TDMI-S系列芯片LPC2103,关于寄存器的定义请见我上传的附件的“LPC2103.h”头文件




一、相关主要寄存器


1,PINSEL0PINSEL1 (引脚功能选择寄存器)可读写


一个引脚大多数情况都是复用的,可以通过这个寄存器来设置相应引脚做的功能。默认初始值为“0”,即做为GPIO口使用,因此作为I/O口使用时大多数情况不用设置此寄存器;



2,IOPIN (I/O引脚状态值寄存器)可读写


保存引脚当前状态值的寄存器,无论引脚的方向如何设置,引脚的状态都是可以从这个寄存器读出的;



3,IODIR (I/O引脚方向控制寄存器)可读写


该寄存器用于控制每个I/O脚的方向(输入/输出);相应位写“0”则为输入,写“1”则为输出



4,IOSET (I/O引脚输出设置寄存器)可读写


该寄存器和IOCLR一起控制引脚的输出状态。给其写“1”,就输出一个高电平,写“0”则无效。该引脚若被设置为输入,则对其进行写操作无效;



5,IOCLR (I/O引脚输出清零寄存器)


该寄存器控制引脚的输出状态。给其写“1”就输出一个低电平,同时清零IOSET的相应位,写“0”则无效。该引脚若被设置为输入,则对其进行写操作无效;





二、操作示例


    在这里我以操作GPIO口P0.22为例:
   (注:关于寄存器的的赋值操作请见我C编程分类下寄存器操作一文)



1,  设置为输出使用,并读写P0.22



/* 前面我说过PINSEL1寄存器的默认初始设置为做GPIO,但是有时会对一个引脚的几个功能切换使用,故我习惯对一个引脚做I/O使用时先对其相应位清零操作 */


PINSEL1 &= ~(3 << 7);



/* 设置I/O口的方向,输出 */ 


IODIR |= (1 << 22);



/* 读P0.22状态值*/


temp = IOPIN;



/* 让P0.22输出“1”(高电平) */


IOSET |= (1 << 22);



/* 让P0.22输出“0” (低电平)*/


IOCLR |= (1 << 22);



/* 让P0.22输出上升沿 */


IOCLR |= (1 << 22);


IOSET |= (1 << 22);



/* 让P0.22输出下降沿 */


IOSET |= (1 << 22);


IOCLR |= (1 << 22);



2,  设置为输入使用,并读写P0.22


   (注:LPC2103的引脚做I/O使用时由于其本身不带内部上拉功能,故在作为输入使用时,其状态只能通过接收外部输入来改变)


/* 功能选择 */


PINSEL1 &= ~(3 << 7);



/* 设置I/O口的方向,输入 */


IODIR |= (1 << 22);



/* 读P0.22状态值 */


temp = IOPIN;


关于LPC2103的寄存器定义的头文件:

rar






这只是我学习过程中的记录和整理,由于本人才刚刚进入这个行业,在文中如有错误和不托之处还请大师留言指点,学生先在此谢过过!!!


PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户377235 2014-3-11 15:55

不够细心,配置输入例子错误,相应位写“0”则为输入

用户377235 2013-4-11 15:23

收集资料阶段 谢谢了

用户1552690 2009-3-10 08:38

谢谢你分享啦
相关推荐阅读
用户156616 2008-08-13 17:39
C编程之——循环缓冲区的操作
        在实际工作中很多时候要收发数据,于是便要用到循环缓存,下面就我常常用的通用的循环缓存做个总结,有不妥之处还请高手指点。(1)    定义循环缓存:#define   MAX_BUFF_...
用户156616 2008-07-30 18:25
C 编程之——寄存器赋值操作
    通过这段时间的工作和学习,我感觉在嵌入式硬件编程中,大多数情况下都是对相应硬件的功能寄存器进行设置和操作。一, 寄存器的设置和操作特性1,一个寄存器的每个位有其不同的意义,进行不同的设置会使硬...
EE直播间
更多
我要评论
3
8
关闭 站长推荐上一条 /3 下一条