实验四 ARM 的 I/O 接口实验 一 实验目的 1. 了解 S3C44B0X 的通用 I/O 接口 2. 掌握 I/0 功能的复用并熟练的配置, 进行编程实验二 实验设备 1. EL-ARM-830 教学实验箱,PentiumII 以上的 PC 机, 仿真器电缆 2. PC 操作系统 WIN98 或 WIN2000 或 WINXP,ARM SDT2.5 或 ADS1.2 集成开发环境, 仿真器驱动程序 3. 本实验使用实验教学系统的 CPU 板, 在进行本实验时,LCD 电源开关 音频的左右声道开关 AD 通道选择开关 触摸屏中断选择开关等均应处在关闭状态 三 实验原理 S3C44B0X CPU 共有 71 个多功能复用输入输出口, 分为七组端口 : 2 个 9 位的 I/O 端口 (PORT E 和 PORT F)(E 为三功能复用,F 为四功能复用 ) 2 个 8 位的 I/O 端口 (PORT D 和 PORT G)(D 为两功能复用,G 为三功能复用 ) 1 个 16 位的 I/O 端口 (PORT C)( 三功能复用 ) 1 个 10 位的 I/O 端口 (PORT A)( 两功能复用 ) 1 个 11 位的 I/O 端口 (PORT B)( 两功能复用 ) 这些通用的 GPI/O 接口, 是可配置的, PORTA 和 PORTB 除功能口外, 它们仅用作输出 使用, 剩下的 PORTC PORTD PORTE PORTF PORTG 均可作为输入输出口使用 配置这些端口, 是通过一些寄存器来实现的, 这些寄存器均有各自的地址, 位长 32 位 往该地址中写入相应的数据, 即可实现功能及数据配置 PCONA (0x1d20000) PDATA (0x1d20004) PCONB (0x1d20008) PDATB (0x1d2000c) PCONC (0x1d20010) PDATC (0x1d20014) PUPC (0x1d20018) PCOND (0x1d2001c) PDATD (0x1d20020) PUPD (0x1d20024) PCONE (0x1d20028) PDATE (0x1d2002c) PUPE (0x1d20030) PCONF (0x1d20034) PDATF (0x1d20038) PUPF (0x1d2003c) PCONG (0x1d20040)
PDATG (0x1d20044) PUPG (0x1d20048) 现用 B 口,C 口举例说明 对于 B 口如表 1 表 2 表 3 所示 表 1 寄存器 地址 读写类型 描述 复位值 PCONB 0x01d20008 R/W 配置 PORT B 0x7ff PDATB 0x01d2000C R/W 数据寄存器 未定义 表 2 PCONB 位 描述 PB10 [10] 0 = OUT 1 = NGCS5 PB9 [9] 0 = OUT 1 = NGCS4 PB8 [8] 0 = OUT 1 = NGCS3 PB7 [7] 0 = OUT 1 = NGCS2 PB6 [6] 0 = OUT 1 = NGCS1 PB5 [5] 0 = OUT 1 = nwbe3 PB4 [4] 0 = OUT 1 = nwbe2 PB3 [3] 0 = OUT 1 = ncas3 PB2 [2] 0 = OUT 1 = ncas2 PB1 [1] 0 = OUT 1 = SCLK PB0 [0] 0 = OUT 1 = SCKE 表 3 PDATB 位 描述 PB[10:0] [10:0] 当端口配置为输出时, 管脚状态和位状态一致 当配置为功能管脚时, 值未定义状态 也就是说, 在地址 0X01D20008 中, 给前十位的每一位赋值, 那么, 在 CPU 的管脚 上就定义了管脚的功能值 当 B 口某管脚配置成输出端口, 则在 PDATB 对应的地址中的 对应位上, 写入 1, 则该管脚输出为高电平, 写入 0, 则该管脚输出为低电平 若配置 为功能管脚, 则该管脚变成具体的功能脚 对于 C 口见表 4 表 5 表 6 表 7 所示 表 4 寄存器 地址 读写类型 描述 复位值 PCONC 0x01d20010 R/W 配置 PORT C 0xaaaaaaaa PDATC 0x01d20014 R/W 数据寄存器 未定义 PUPC 0x01d20018 R/W C 口上拉电阻配置 0
表 5 PCONC 位 描述 PC15 [31:30] 00 = Input 01 = Output 10 = DATA31 11 = ncts0 PC14 [29:28] 00 = Input 01 = Output 10 = DATA30 11 = nrts0 PC13 [27:26] 00 = Input 01 = Output 10 = DATA29 11 = RxD1 PC12 [25:24] 00 = Input 01 = Output 10 = DATA28 11 = TxD1 PC11 [23:22] 00 = Input 01 = Output 10 = DATA27 11 = ncts1 PC10 [21:20] 00 = Input 01 = Output 10 = DATA26 11 = nrts1 PC9 [19:18] 00 = Input 01 = Output 10 = DATA25 11 = nxdreq1 PC8 [17:16] 00 = Input 01 = Output 10 = DATA24 11 = nxdack1 PC7 [15:14] 00 = Input 01 = Output 10 = DATA23 11 = VD4 PC6 [13:12] 00 = Input 01 = Output 10 = DATA22 11 = VD5 PC5 [11:10] 00 = Input 01 = Output 10 = DATA21 11 = VD6 PC4 [9:8] 00 = Input 01 = Output 10 = DATA20 11 = VD7 PC3 [7:6] 00 = Input 01 = Output 10 = DATA19 11 = IISCLK PC2 [5:4] 00 = Input 01 = Output 10 = DATA18 11 = IISDI PC1 [3:2] 00 = Input 01 = Output 10 = DATA17 11 = IISDO PC0 [1:0] 00 = Input 01 = Output 10 = DATA16 11 = IISLRCK 表 6 PDATC 位 描述 PC[15:0] [15:0] 当端口配置为输入时, 管脚状态和位状态一致 当端口配置为输出时, 管脚状态和位状态一致 当配置为功能管脚时, 值未定义状态
表 7 PUPC 位 描述 PC[15:0] [15:0] 0: 对应管脚配置上拉电阻 1: 对应管脚不配置上拉电阻 也就是说, 在地址 0X01D20010 中, 给 32 位的每一位赋值, 那么, 在 CPU 的管脚上就定义了管脚的功能值 当 C 口某管脚配置成输入端口, 则在 PDATC 对应的地址中的对应位上, 得到 1, 则该管脚的输入为高电平, 得到 0, 则该管脚的输入为低电平 当 C 口某管脚配置成输出端口, 则在 PDATC 对应的地址中的对应位上, 写入 1, 则该管脚输出为高电平, 写入 0, 则该管脚输出为低电平 若配置为功能管脚, 则该管脚变成具体的功能脚 其他端口配置请参见 PDF 文挡 在程序中对 GPI/O 各寄存器的读写实现, 是通过给宏赋值实现的 这些宏在 44b.h 中定义 ; 具体如 : #define rpcona (*(volatile unsigned *)0x1d20000) #define rpdata (*(volatile unsigned *)0x1d20004) #define rpconb #define rpdatb (*(volatile unsigned *)0x1d20008) (*(volatile unsigned *)0x1d2000c) #define rpconc #define rpdatc #define rpupc (*(volatile unsigned *)0x1d20010) (*(volatile unsigned *)0x1d20014) (*(volatile unsigned *)0x1d20018) #define rpcond #define rpdatd #define rpupd (*(volatile unsigned *)0x1d2001c) (*(volatile unsigned *)0x1d20020) (*(volatile unsigned *)0x1d20024) #define rpcone #define rpdate #define rpupe (*(volatile unsigned *)0x1d20028) (*(volatile unsigned *)0x1d2002c) (*(volatile unsigned *)0x1d20030) #define rpconf #define rpdatf #define rpupf (*(volatile unsigned *)0x1d20034) (*(volatile unsigned *)0x1d20038) (*(volatile unsigned *)0x1d2003c) #define rpcong #define rpdatg #define rpupg (*(volatile unsigned *)0x1d20040) (*(volatile unsigned *)0x1d20044) (*(volatile unsigned *)0x1d20048) 因此, 配置端口 A, 在程序中也就是用如下语句即可 : rpcona = 0x3cf;// 配置第 4 第 5 位为输出管脚 rpdata = 0x3ef;// 配置第 4 位输出为低电平, 第 5 位输出高电平
其他的各功能寄存器在 44b.h 中也都有相应的定义, 参照该做法, 即可把 GPI/O 管脚配置成输入输出端口, 也可把管脚配置成所需的功能管脚 四 实验内容 1. 编写程序实现点亮 CPU 板上的 D7 D8 灯, 并轮流闪烁, 以及同时亮 同时灭 2. 分别实验汇编和 C 语言编写实现以上功能的程序, 在实验系统上验证程序