嵌入式系统 第二章 GPIOWord文件下载.docx
- 文档编号:4482600
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:16
- 大小:70.05KB
嵌入式系统 第二章 GPIOWord文件下载.docx
《嵌入式系统 第二章 GPIOWord文件下载.docx》由会员分享,可在线阅读,更多相关《嵌入式系统 第二章 GPIOWord文件下载.docx(16页珍藏版)》请在冰点文库上搜索。
P0.0
GPIOP0.0
TxD0
PWM1
保留
3:
2
P0.1
GPIOP0.1
RxD0
PWM3
EINT0
5:
4
P0.2
GPIOP0.2
SCL
捕获0.0
7:
6
P0.3
GPIOP0.3
SDA
匹配0.0
EINT1
9:
8
P0.4
GPIOP0.4
SCK0
捕获0.1
11:
P0.5
GPIOP0.5
MISO0
匹配0.1
13:
12
P0.6
GPIOP0.6
MOSI0
捕获0.2
15:
14
P0.7
GPIOP0.7
SSEL0
PWM2
EINT2
17:
16
P0.8
GPIOP0.8
TxD1
PWM4
19:
18
P0.9
GPIOP0.9
RxD1
PWM6
EINT3
21:
20
P0.10
GPIOP0.10
RTS
捕获1.0
23:
22
P0.11
GPIOP0.11
CTS
捕获1.1
25:
24
P0.12
GPIOP0.12
DSR
匹配1.0
27:
26
P0.13
GPIOP0.13
DTR
匹配1.1
29:
28
P0.14
GPIOP0.14
CD
31:
30
P0.15
GPIOP0.15
RI
表2-2PINSEL0寄存器控制
其中第一列指的是PINSEL0对应的位,第二列是被控制管脚的名称,第三列是当PINSEL0对应的位取值为”00”时该管脚对应的功能,第四列是当PINSEL0对应的位取值为”01”时对应的功能,第五列是当PINSEL0对应的位取值为”10”时对应的功能,第六列是当PINSEL0对应的位取值为”11”时对应的功能,第七列是该位在复位时候的值。
如管脚P0.9,从表3.2可以查出它的控制位为PINSEL0的第18和19两位,当CPU复位时,该两位是复位值”00”,从表3.2的第三列可以看出,当这两位为”00”时,P0.9连接的是GPIO模块,此时作为GPIO。
当我们要把P0.9作为串口输入引脚RxD使用时,从表3.2可以查到,此时需要将PINSEL0的第18和19为设置”01”,即第十八位为0,第十九位为1,这样设置后,P0.9管脚即连接到了串口输出模块上,作为RxD引脚使用。
2.3.2PINSEL1寄存器
PINSEL1寄存器控制的是P0.16-P0.31的管脚连接模块,如表2-3所示。
P0.16
GPIOP0.16
匹配0.2
P0.17
GPIOP0.17
捕获1.2
SCK1
匹配1.2
P0.18
GPIOP0.18
捕获1.3
MISO1
匹配1.3
P0.19
GPIOP0.19
MOSI1
P0.20
GPIOP0.20
SSEL1
P0.21
GPIOP0.21
PWM5
P0.22
GPIOP0.22
P0.23
GPIOP0.23
P0.24
GPIOP0.24
P0.25
GPIOP0.25
P0.26
P0.27
GPIOP0.27
AIN0
P0.28
GPIOP0.28
AIN1
P0.29
GPIOP0.29
AIN2
捕获0.3
匹配0.3
P0.30
GPIOP0.30
AIN3
P0.31
表2-3PINSEL1寄存器
PINSEL1寄存器各个位段的含义与PINSEL0相近,具体内容可以参考PINSEL0的内容。
2.3.4PINSEL2寄存器
PINSEL2寄存器控制类LPC213X所有的其他管脚的连接模块。
如表2-4所示。
警告:
请使用“读-修改-写”的方法来访问PINSEL2寄存器。
对位0~2和/或位3的意外写操作会造成调试和/或跟踪功能的丢失!
该位为0时,P1.36:
26用作GPIO。
该位为1时,P1.31:
26用作一个调试端口。
P1.26/RTCK
3
该位为0时,P1:
16用作GPIO。
该位为1时,P1.25:
16用作一个跟踪端口。
P1.20
控制数据总线和选通管脚的使用:
管脚P2.7:
011=P2.7:
0
0x或10=D7:
管脚P1.011=P1.0
0x或10=CS0
管脚P1.111=P1.1
0x或10=OE
管脚P3.3111=P3.31
0x或10=BLS0
管脚P2.15:
800或11=P2.15:
8
01或10=D15:
管脚P3.3000或11=P3.30
01或10=BLS1
管脚P2.27:
160x或11=P2.27:
16
10=D27:
管脚P2.29:
280x或11=P2.29:
28
10=D29:
管脚P2.31:
300x或11=P2.31:
30或AIN5:
410=D31:
管脚P3.29:
280x或11=P3.29:
28或AIN6:
710=BLS2:
BOOT1:
如果位5:
4不为10,由该位控制P3.29脚的使用:
为0时使能P3.29,为1时使能AIN6。
1
7
4不为10,由该位控制P3.28脚的使用:
为0时使能P3.28,为1时使能AIN7。
该位控制P3.27脚的使用:
为0时使能P3.27,为1时使能WE。
10:
9
该位控制P3.26脚的使用:
为0时使能P3.26,为1时使能CS1。
13
如果位27:
25不为111,由该位控制P3.23/A23/XCLK脚的使用:
为0时使能P3.23,为1时使能XCLK。
控制P3.25脚的使用:
00使能P3.25,01使能CS2,10和11保留。
控制P3.24脚的使用:
00使能P3.24,01使能CS3,10和11保留。
4不为10,由该位控制P2.29:
28的使用:
0使能P2.29:
28,1保留。
21
4不为10,由该位控制P2.30的使用:
0使能P2.30,1使能AIN4
4不为10,由该位控制P2.31的使用:
0使能P2.31,1使能AIN5。
23
控制P3.0/A0用作端口管脚(0)或地址线
(1)。
如果RESET=0时BOOT1:
0=00,
该位的复位值为
1。
反之为0。
控制P3.1/A1用作端口管脚(0)或地址线
(1)。
25
控制P3.23/A23/XCLK和P3.22:
2/A2.22:
2中地址线的数目:
000=无地址线100=A11:
2为地址线
001=A3:
2为地址线101=A15:
010=A5:
2为地址线110=A19:
011=A7:
2为地址线111=A23:
如果复位时
0=11,该
域的复位值为
000。
反之为111。
表2-4PINSEL2
2.4管脚连接模块的使用
在使用任何一个管脚之前,都应该按照管脚的实际功能设置相关的管脚连接控制寄存器,在没有设置之前就直接进行管脚的操作,有可能导致意外事件的发生。
关键连接模块的使用非常简单,只需要根据实际需要设置相关的控制寄存器即可。
比如P0.0口,它可以作为GPIO(GeneralPurposeI/Oports)功能,可以作为UART0的TxD0,还可以作脉宽调制器输出PWM1。
1、设置P0.0为GPIO功能
假如P0.0连接的是LED、按键等需要直接使用IO口控制的元器件,那么就应该把该管脚设置成GPIO功能。
经过查询PINSELx的功能表格可知,控制P0.0管脚的功能使用的是PINSEL0寄存器,而且只有当PINSEL0寄存器的第一位和第零位为”00”的使用P0.0才为GPIO功能。
要在不改变其他管脚连接模块的条件下设置该管脚连接GPIO,可以使用下面的语句:
PINSEL0=PINSEL0&
0xFFFFFFFC;
2、设置P0.0为TxD0功能
如果P0.0连接的是串口,那么在使用串口之前,就需要把管脚P0.0连接到TxD0功能上,经过查询PINSELx功能表格,可知要把P0.0连接到TxD0功能上,需要将PINSEL0的第一位和第零位设置成”01”才可以。
要在不改变其他管脚连接功能的基础上设置管脚P0.0连接到TxD0上,可以使用下面的语句:
PINSEL0=(PINSEL0&
0xFFFFFFFC)|0x01;
3、将P0.8、P0.9设置为TxD1、RxD1功能
要把P0.8和P0.9连接到RxD1和RxD1上,经过查表,可知要设置PINSEL0的第15位和第16位为”01”,第18位和第19位为”01”才可。
所以可以使用下面的语句:
PINSEL0=0x00050000;
(1)
或PINSEL0=0x05<
<
16;
(2)
程序
(1)和
(2)的作用是一样的,但是程序
(2)方法更直观简单。
但是以上两种方法都会改变其他管脚的连接模块,要想不改变其他管脚的连接情况,最好使用下面的程序:
PINSEL0=(PINSEL0&
0xFFF0FFFF)|(0x05<
16);
2.5寄存器描述
当管脚选择GPIO功能时,有4个对应的寄存器用于控制GPIO的使用,IOxDIR、IOxSET、IOxCLR和IOxPIN(注意:
本书中x为对应的组编号,比如P0组,则x=0,对应的寄存器则为IO0SET,IO0CLR,IO0PIN)。
IOxDIR用于控制GPIO的输入/输出方向选择;
IOxSET用于置1操作,读回IOSET则反映当前IO口设定状态;
而IOxCLR则用于清零操作;
IOxPIN则反映当前IO口的状态。
IOxPIN
GPIO引脚值寄存器,不管方向模式如何,引脚的当前状态都可以从该寄存器中读出
只读
NA
IOxSET
GPIO输出置位寄存器。
该寄存器控制引脚输出高电平
读/置位
IOxCLR
该寄存器控制引脚输出低电平
IOxDIR
GPIO方向控制寄存器。
该寄存器单独控制每个IO口的方向
表2-5GPIO的寄存器
1.2.1IOxPIN:
GPIO引脚值寄存器
IOxPIN寄存器反映的是GPIO引脚的实际电平值,它反映了外部环境对引脚的影响,但不能反映非GPIO配置引脚的活动,因此不能使用IOxPIN寄存器来监控非GPIO配置引脚,即如果当前引脚功能不是GPIO,则IOxPIN反映的并不是当前引脚的实际电平值。
GPIO引脚。
IOxPIN[0]对应于Px.0,IOxPIN[1]对应于Px.1……IOxPIN[31]对应于Px.31引脚
未定义
表2-6GPIO引脚值寄存器
1.2.2IOxSET:
GPIO输出置位寄存器
当管脚配置为GPIO输出模式时,可使用该寄存器从管脚输出高电平。
在对应的位写入1使对应管脚输出高电平,写入0无效,如在IO0SET的第1位写入1,即IO0SET=0x02,则将P0.1置为高电平。
输出置位。
IOxSET[0]对应于Px.0…IOxPIN[31]对应于Px.31引脚
表2-7GPIO置位寄存器
如果一个管脚被配置为输入或第二功能,写IOSET无效。
读IOSET寄存器返回GPIO输出寄存器中的值。
该值由前一次对IOSET和IOCLR(或IOPIN)的写操作决定,不反映任何外部环境对管脚的影响。
注意这种情况,假定当前P0.0=1,且IO0SET=0x01,现在要将P0.1也拉高,以下语句是等价的:
IO0SET=0x02;
或IO0SET=0x03;
或IO0SET|=0x02;
注意IO0SET=0x02虽然把第0位置零,但是并不会影响P0.0的电平,因为对IOxSET写入0是无效的,只有写入1才有影响。
其实这是一种普遍情况:
当往某个寄存器只有写入特定逻辑值才有效,而写入反逻辑的值无效时(如只有写入1有效而写入0无效,或者至于写入0有效而写入1无效),只操作其中某一位或者某些位时,可以不必关心其它位的状态,即不必读回原来的值,进行与或操作后进行回写。
一般情况下,有这种特性的寄存器,均会有置位和清零寄存器成对出现,如IOxSET和IOxCLR。
对于ARM系列处理器的其他寄存器的操作也有类似的情况,所以在理解一个寄存器的使用时,一定要弄清楚他的逻辑值的实际影响。
1.2.3IOxCLR:
GPIO输出清零寄存器
当管脚配置为GPIO输出模式时,可使用该寄存器从管脚输出低电平。
写入1使对应管脚输出低电平并清零IOSET寄存器中相应的位,写入0无效。
如在IO0CLR的第1位写入1,即IO0CLR=0x02,则将P0.1引脚设置为低电平,同时清除IO0SET的第一位。
如果一个管脚被配置为输入或第二功能,写IOCLR无效。
输出清零。
IOxCLR[0]对应于Px.0…IOxCLR[31]对应于Px.31引脚
表2-8GPIO清零寄存器
1.2.4IOxDIR:
GPIO方向寄存器
当管脚配置为GPIO模式时,可使用该寄存器控制管的方向,写入0,对应的管家方向为输入,写入1则为输出。
只有当管脚选择GPIO时,IODIR设置才有意义。
当GPIO用作输入时,可吸收最大10mA的电流;
当GPIO作为输出引脚时,可对外提供最大10mA的电流。
方向控制位。
IOxDIR[0]对应于Px.0…IOxDIR[31]对应于Px.31引脚
表2-9GPIO方向寄存器
1.3GPIO的应用
作为通用IO口,LPC213X的GPIO经常用于驱动LED或其它指示器、控制片外器件和检测数字输入。
具体来说可以分成两种,一种是电流型应用,吸收或者驱动电流,这类应用产生的电流较大,典型的是驱动LED;
另外一种是信号型应用,用于检测外部设备的状态或应用于设备间的通信,这类应用一般产生的电流极小,典型的应用是检测按键的状态。
1.3.1电流型应用
这类应用主要是驱动需要一定的电流才能产生动作的外设,比如LED。
电路如图2-3所示。
图2-3灌电流驱动LED
接在LED和端口P0.2之间的电阻R1称为限流电阻,用来防止电流过大而损坏LED或者LPC213X。
限流电阻阻值计算,需要结合LED的特性和LPC2131端口特性(参考各自数据手册的DC特性部分)。
当LED内流过10mA电流时,两端压降大约1.7V;
而LPC213X普通IO口推荐的输出/吸入电流为4mA。
由此,R的阻值可以这样计算:
为了保护LED和LPC213X,限流电阻的阻值取值比较保守,一般会1.5倍的计算值。
1.3.2信号型应用
这类应用主要作用是检测IO口的状态,典型应用是读取按键是否按下,电路如图2-4所示。
图2-4按键检测
这类应用不存在着电流驱动,检测的是电压信号,如果按键没有按下,因为上拉电阻R1的缘故,P0.2呈现高电平状态,读取回来的状态为1。
当按键按下时,由于P0.2直接接地,所以为低电平状态,读回来的状态为0。
信号型应用电阻R1与电流型应用中的电阻R1的作用是不同的,在电流型中,电阻起限流保护作用,而信号型用中,电阻起上拉作用,目的是给IO口一个稳定的状态。
此时,电阻的取值与工作环境有关,如果工作环境电噪声较大,则需要用小阻值的电阻,这种方法叫做强上拉;
如果工作环境电噪声较小,则可以使用阻值较小的电阻,叫做弱上拉。
作为上拉电阻,一般可以取典型值4~6K之间的阻值。
1.4使用方法
将管脚用作GPIO,需要先通过设置(PINSELx)将管脚连接到GPIO,然后再根据应用的实际使用方向设置(IOxDIR)为对应的输入/输出。
如果GPIO用作输出,则通过操作IOxSET和IOxCLR两个寄存器来进行置位和清零操作;
如果GPIO用过输入口,则通过读取IOxPIN的值来读取IO口的实际状态。
如图2-5所示。
图2-5GPIO的使用
例程1:
在P0.0输出低电平
PINSEL0=0x00000000;
//设置P0.0连接到GPIO模块
IO0DIR=0x00000001;
//设置P0.0为输出
IO0CLR=0x00000001;
//设置P0.0为低电平
例程2:
在P0.0输出高电平
IO0SET=0x00000001;
//设置P0.0为高电平
例程3:
读取P0.0的状态
unsignedintstate;
IO0DIR=0x00000000;
//设置P0.0为输入
State=IO0PIN&
0x00000001;
//通过IOxPIN读取P0.0的状态
从上面我们可以看出,通过写IOxSET/IOxCLR寄存器很容易使所选输出管脚的状态同时变为高/低电平。
只有IOxSET/IOxCLR中被写入1的位对应的管脚才能设置为高/低电平,写入0的位对应的管脚的状态不发生改变。
但是,仅通过写IOxSET或IOxCLR寄存器是不可能使一个GPIO口同时输出包含0和1的二进制数。
写IOxPIN寄存器使能并行GPIO输出所需的瞬时值。
写入IOxPIN寄存器的二进制数据将影响整个并行口的所有输出配置管脚:
IOxPIN的位为0时使管脚输出低电平,IOxPIN的位为1时使管脚输出高电平。
为了改变一组端口的某些管脚的输出而同时又要不影响另外一些管脚的电平,必须将IOxPIN读出的内容和一个值相与(该值使要改变的管脚对应的位用0来屏蔽,其它管脚对应的位为1)。
最后,再将相与的结果和期望得到的管脚输出对应的二进制数相或并将相或的结果存回IOxPIN寄存器。
例如:
假定P0[7:
0]初始状态为0xA5,现在欲将P0[7:
0]同时变为0x5A,通过IO0SET和IO0CLR必须通过2次进行,而且会出现意外的中间状态。
通过IO0PIN来进行操作可以消除这样的中间状态,仅需执行语句
IO0PIN=(IO0PIN&
0xFFFFFF00)|0x0000005A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式系统 第二章 GPIO 嵌入式 系统 第二
![提示](https://static.bingdoc.com/images/bang_tan.gif)