-
-
[原创]mini2440简单的I/O操作
-
发表于: 2016-10-12 23:31 4233
-
mini2440是一块ARM9的开发板, 用了Samsung S3C2440作为处理器,而Samsung S3C2440是基于32位arm9内核的。所以想对mini2440的I/O,要熟悉32位的arm指令,和S3C2440的内部资源。
S3C2440共有130个I/O口,可以通过指令,来决定每个I/O的状态。
— Port A(GPA): 25-output port
— Port B(GPB): 11-input/out port
— Port C(GPC): 16-input/output port
— Port D(GPD): 16-input/output port
— Port E(GPE): 16-input/output port
— Port F(GPF): 8-input/output port
— Port G(GPG): 16-input/output port
— Port H(GPH): 9-input/output port
— Port J(GPJ): 13-input/output port
假如要控制某个I/O口输出高电平,没有现象很难看出我们的操作是否成功,所以在开发板上通常会为某些I/O口接上外围电路,比如led灯、蜂鸣器等等,供我们测试学习。
在mini2440开发板上的PortB的第1个口GPB0,外接的是一个蜂鸣器的电路,如图,当GPB0输出高电平时,三极管导通,蜂鸣器电路形成回路开始正常工作,反之输出低时不工作。所以我们可以通过指令使BPB0输出高,打开蜂鸣器。
GPB的每个I/O口都有输出/输入两个功能可以选,其中输出状态还可以选择是否上拉(就是默认是高)。我们要想使蜂鸣器工作,在这里要选择GPB的I/O口是输出状态,并且不上拉,即默认是输出低,通过指令控制输出高,使蜂鸣器工作。
看一下S3C2440的芯片手册,找到GPB0各个寄存器的地址。
GPBCON 0x56000010 R/W Configures the pins of port B 0x0
GPBUP 0x56000018 R/W Pull-up disable register for port B 0x0
GPBDAT 0x56000014 R/W The data register for port B Undef.
GPB0 [1:0] 00 = Input 01 = Output
10 = TOUT0 11 = reserved
GPB[10:0] 0: The pull up function attached to the corresponding port pin is enabled.
1: The pull up function is disabled
GPB[10:0] When the port is configured as output port, the pin state is the same
as the corresponding bit.
通过查找芯片手册最后确定了各个寄存器的值,接下来就是具体的汇编指令了。
AREA asm, CODE, READWRITE
ENTRY
;初始化变量
GPBCON EQU 0x56000010
GPBUP EQU 0x56000018
GPBDAT EQU 0x56000014
start
ldr r0, =GPBCON ;0x56000010 -> r0
ldr r1, [r0] ;0x56000010地址保存的值 -> r1
and r1, r1, #0xfc ;r1后两位清零 (GPB0的控制位)
orr r1, r1, #0x01 ;r1后两位赋1 (GPB0的控制位置1)
str r1, [r0] ;r1的值赋值到0x56000010的地址中 完成GBP0控制位的操作
;和上面类似,分被对GPB0UP,GPB0DAT进行赋值
ldr r0, =GPBUP
ldr r1, [r0]
and r1, r1, #0xfc
orr r1, r1, #0x01
str r1, [r0]
ldr r0, =GPBDAT
ldr r1, [r0]
and r1, r1, #0xfc
orr r1, r1, #0x01
str r1, [r0]
END
用ARM MDK 编译后用jlink连接开发板,调试运行,蜂鸣器开始响了。
玩裸机,I/O操作是基础,后面不管是串口、iic、spi等通信协议,还是操作一些传感器,都是在操作I/O的基础上进行的。
S3C2440共有130个I/O口,可以通过指令,来决定每个I/O的状态。
— Port A(GPA): 25-output port
— Port B(GPB): 11-input/out port
— Port C(GPC): 16-input/output port
— Port D(GPD): 16-input/output port
— Port E(GPE): 16-input/output port
— Port F(GPF): 8-input/output port
— Port G(GPG): 16-input/output port
— Port H(GPH): 9-input/output port
— Port J(GPJ): 13-input/output port
假如要控制某个I/O口输出高电平,没有现象很难看出我们的操作是否成功,所以在开发板上通常会为某些I/O口接上外围电路,比如led灯、蜂鸣器等等,供我们测试学习。
在mini2440开发板上的PortB的第1个口GPB0,外接的是一个蜂鸣器的电路,如图,当GPB0输出高电平时,三极管导通,蜂鸣器电路形成回路开始正常工作,反之输出低时不工作。所以我们可以通过指令使BPB0输出高,打开蜂鸣器。
GPB的每个I/O口都有输出/输入两个功能可以选,其中输出状态还可以选择是否上拉(就是默认是高)。我们要想使蜂鸣器工作,在这里要选择GPB的I/O口是输出状态,并且不上拉,即默认是输出低,通过指令控制输出高,使蜂鸣器工作。
看一下S3C2440的芯片手册,找到GPB0各个寄存器的地址。
GPBCON 0x56000010 R/W Configures the pins of port B 0x0
GPBUP 0x56000018 R/W Pull-up disable register for port B 0x0
GPBDAT 0x56000014 R/W The data register for port B Undef.
GPB0 [1:0] 00 = Input 01 = Output
10 = TOUT0 11 = reserved
GPB[10:0] 0: The pull up function attached to the corresponding port pin is enabled.
1: The pull up function is disabled
GPB[10:0] When the port is configured as output port, the pin state is the same
as the corresponding bit.
通过查找芯片手册最后确定了各个寄存器的值,接下来就是具体的汇编指令了。
AREA asm, CODE, READWRITE
ENTRY
;初始化变量
GPBCON EQU 0x56000010
GPBUP EQU 0x56000018
GPBDAT EQU 0x56000014
start
ldr r0, =GPBCON ;0x56000010 -> r0
ldr r1, [r0] ;0x56000010地址保存的值 -> r1
and r1, r1, #0xfc ;r1后两位清零 (GPB0的控制位)
orr r1, r1, #0x01 ;r1后两位赋1 (GPB0的控制位置1)
str r1, [r0] ;r1的值赋值到0x56000010的地址中 完成GBP0控制位的操作
;和上面类似,分被对GPB0UP,GPB0DAT进行赋值
ldr r0, =GPBUP
ldr r1, [r0]
and r1, r1, #0xfc
orr r1, r1, #0x01
str r1, [r0]
ldr r0, =GPBDAT
ldr r1, [r0]
and r1, r1, #0xfc
orr r1, r1, #0x01
str r1, [r0]
END
用ARM MDK 编译后用jlink连接开发板,调试运行,蜂鸣器开始响了。
玩裸机,I/O操作是基础,后面不管是串口、iic、spi等通信协议,还是操作一些传感器,都是在操作I/O的基础上进行的。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
谁下载
看原图
赞赏
雪币:
留言: