资源描述
图I/OI/O端口是嵌入式系统硬件平台的重要组成部端口是嵌入式系统硬件平台的重要组成部分,通过分,通过I/OI/O端口可以连接各种类型的外部输端口可以连接各种类型的外部输入入/输出设备,如:键盘、输出设备,如:键盘、LCDLCD显示器等。显示器等。S3C2410S3C2410有有117117个个I/OI/O端口,共分为端口,共分为A-HA-H其其8 8组:组:GPAGPA、GPBGPB、GPHGPH。S3C2440S3C2440有有130130个个I/OI/O端口,端口,分为分为A-JA-J共共9 9组:组:GPAGPA、GPBGPB、GPJGPJ。可以通。可以通过设置寄存器来确定某个引脚用干输入、输出过设置寄存器来确定某个引脚用干输入、输出还是其他特殊功能。比如可以设置还是其他特殊功能。比如可以设置GPH6GPH6作为般作为般的输入、输出引脚,或者用于串口。的输入、输出引脚,或者用于串口。5.25.2.1 S3C2410.1 S3C2410的I/OI/O接口S3C2410芯片共有117个输入/输出引脚,分属于8个I/O端口:端口A(GPA):有23条输出引脚的端口。端口B(GPB):有11条输入/输出引脚的端口。端口C(GPC):有16条输入/输出引脚的端口。端口D(GPD):有16条输入/输出引脚的端口。端口E(GPE):有16条输入/输出引脚的端口。端口F(GPF):有8条输入/输出引脚的端口。端口G(GPG):有16条输入/输出引脚的端口。端口H(GPH):有11条输入/输出引脚的端口。端口功能定义S3C2410芯片的每个I/O端口均是多功能的 上述8个I/O端口根据系统配置和设计的不同需求,设计者可以选择这些I/O端口的功能。若选定某个I/O端口的功能,设计者应在主程序运行之前编程设置对应的控制寄存器,从而选定所需I/O端口的功能。如果某个I/O引脚不用于特定功能的话,那么该引脚就可以设置为普通的输入/输出引脚。对于这几组GPIO引脚,它们的寄存器是相似的:GPxCON用于选择引脚功能,GPxDAT用于读/写引脚数据;另外,GPxUP用于确定是否使用内部上拉电阻。x为A、B、H/J,没有GPAUP寄存器。1.GPxCON寄存器从寄存器的名字即可看出,它用于配置(Configure)/选择引脚的功能。PORTA与PORT BPORT H/J在功能选择方面有所不同,GPACON中每一位对应一根引脚(共23根引脚)。当某位被设为0时,相应引脚为输出引脚,此时我们可以在GPADAT中相应位写入0或1让此引脚输出低电平或高电平:当某位被设为l时,相应引脚为地址线或用于地址控制,此时GPADAT无用。一般而言GPACON通常被设为全l,以便访问外部存储器件。PORT B PORT H/J在寄存器操作方面完全相同。GPxCON中每两位控制一根引脚:00表示输入、01表示输出、10表示特殊功能、11保留不用。5.2.2 GPxDAT寄存器 GPxDAT用于读/写引脚;当引脚被设为输入时,读此寄存器可知相应引脚的电平状态是高还是低;当引脚被设为输出时,写此寄存器相应位可以令此引脚输出高电平或是低电平5.2.3 GPxUP寄存器 GPxUP:某位为1时,相应引脚无内部上拉电阻;为0时,相应引脚使用内部上拉电阻。上拉电阻的作用在于:当GPIO引脚处于第三态(即不是输出高电平,也不是输出低电平,而是呈高阻态,即相当于没接芯片)时,它的电平状态由上拉电阻、下拉电阻确定。1.2 访问硬件1.2.1 访问单个引脚 单个引脚的操作无外乎3种:输出高低电平、检测引脚状态、中断。对某个引脚的操作一般通过读、写寄存器来完成。访问这些寄存器是通过软件来读写它们的地址。比如:S3C2410和S3C2440的GPBCON、GPBDAT寄存器地址都是0 x56000010、0 x56000014,可以通过如下的指令让GPB5输出低电平。#define GPBCON(*volatile unsigned long*)0 x56000010)/long=int 4字节;char 1字节;short 2字节#define GPBDAT(*volatile unsigned long*)0 x56000014)#define GPB5_out(1(5*2)GPBCON=GPB5_out;GPBDAT&=(15);1.2.2 以总线方式访问硬件 并非只能通过寄存器才能发出硬件信号,实际上通过访问总线的方式控制硬件更为常见。如下图所示S3C2410/S3C2440与NOR Flash的连线图,读写操作都是16位为单位。图中缓冲器的作用是以提搞驱动能力、隔离前后级信号。NOR Flash(AM29LV800BB)的片选信号使用nGCS0信号,当CPU发出的地址信号处于0 x000000000 x07FFFFFF之间 时,nGCS0信号有效(为低电平),于是NOR Flash被选中。这时,CPU发出的地址信号传到NOR Flash;进行写操作时,nWE信号为低,数据信号从CPU发给NOR Flash;进行读操作时,nWE信号为高,数据信号从NOR Flash发给CPU。软件如何发起写操作呢,下面有几个例子的代码进行讲解。1)地址对齐的16位读操作unsigned short*pwAddr=(unsigned short*)0 x2;unsigned short uwVal;uwVal=*pwAddr;上述代码会向NOR Flash发起读操作:CPU发出的读地址为0 x2,则地址总线ADDR1ADDR20、A0A19的信号都是1、0.、0(CPU的ADDR0 为0,不过ADDR0没有接到NOR Flash上)。NOR Flash的地址就是0 x1,NOR Flash在稍后的时间里将地址上的16位数据取出,并通过数据总线D0D15发给CPU。2)地址位不对齐的16位读操作unsigned short*pwAddr=(unsigned short*)0 x1;unsigned short uwVal;uwVal=*pwAddr;由于地址是0 x1,不是2对齐的,但是BANK0的位宽被设为16,这将导致异常。我们可以设置异常处理函数来处理这种情况。在异常处理函数中,使用 0 x0、0 x2发起两次读操作,然后将两个结果组合起来:使用地址0 x0的两字节数据D0、D1;再使用地址0 x02读到D2、D3;最后,D1、D2组 合成一个16位的数字返回给wVal。如果没有地址不对齐的异常处理函数,那么上述代码将会出错。如果某个BANK的位宽被设为n,访问此BANK时,在 总线上永远只会看到地址对齐的n位操作。3)8位读操作unsigned char*pwAddr=(unsigned char*)0 x6;unsigned char ucVal;ucVal=*pwAddr;CPU首先使用地址0 x6对NOR Flsh发起16位的读操作,得到两个字节的数据,假设为D0、D1;然后将D0取出赋值给变量ucVal。在读操作期间,地址总线 ADDR1ADDR20、A0A19的信号都是1、1、0、.、0(CPU的ADDR0为0,不过ADDR0没有接到NOR Flash上)。CPU会自动丢弃D1。4)32位读操作unsigned int*pwAddr=(unsigned int*)0 x6;unsigned int udwVal;udwVal=*pwAddr;CPU首先使用地址0 x6对NOR Flsh发起16位的读操作,得到两个字节的数据,假设为D0、D1;再使用地址0 x8发起读操作,得到两字节的数据,假设为D2、D3;最后将这4个数据组合后赋给变量udwVal。5)16位写操作unsigned short*pwAddr=(unsigned short*)0 x6;*pwAddr=0 x1234;由于NOR Flash的特性,使得NOR Flash的写操作比较复杂比如要先发出特定的地址信号通知NOR Flash准备接收数据,然后才发出数据等。不过,其总线上的电信号与软件指令的关系与读操作类似,只是数据的传输方向相反。
展开阅读全文