00. 目录


文章目录


00. 目录01. 开发环境02. 控制原理03. 配置寄存器04. 程序示例一05. 程序示例二06. 附录


01. 开发环境


  • 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
  • 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
  • 平台:Ubuntu 20.04

02. 控制原理

试过了GPIO的输出功能,再来测试下GPIO的输入功能。开发板上有四个用户按键,使用这四个按键来控制四个LED的状态。

咱们的按键在底板上,所以需要看底板的原理图

【ARM】Tiny4412裸板编程之按键_tiny4412

打开底板原理图(Tiny4412SDK-1506-Schematic.pdf)

【ARM】Tiny4412裸板编程之按键_汇编程序_02

用户按键KEY1、KEY2、KEY3、KEY4分别对应了GPX3_2、GPX3_3、GPX3_4、GPX3_5,并且按键引脚平常是高电平,按键被按下变为低电平。

03. 配置寄存器

由原理图可知,程序只进行了两步操作。

第一步​:GPX3CON功能配置寄存器,地址为0x11000000+0x00000C60=0x11000C60,每四位控制一个引脚,0输入,1输出等等,这里我们用到的是输入功能。



Base Address: 0x1100_0000



Address = Base Address + 0x0C60, Reset Value = 0x0000_0000【ARM】Tiny4412裸板编程之按键_arm裸机_03



第二步​:GPX3DAT数据寄存器,读取对应的位即可。

【ARM】Tiny4412裸板编程之按键_arm裸机_04

04. 程序示例一

Key控制对应的LED

led.s文件内容如下

.section .text
.align 2
.global led_init
led_init:
@配置为输出
ldr r0, =0x110002E0
ldr r1, [r0]
ldr r2, =0xffff
bic r1, r1, r2

ldr r2, =0x1111
orr r1, r1, r2
str r1, [r0]
mov pc, lr

.align 2
.global led_allon
led_allon:
ldr r0, =0x110002E4
ldr r1, [r0]
bic r1, r1, #0xf
str r1, [r0]
mov pc, lr

.align 2
.global led_alloff
led_alloff:
ldr r0, =0x110002E4
ldr r1, [r0]
orr r1, r1, #0xf
str r1, [r0]
mov pc, lr

.align 2
.global led_on
led_on:
ldr r1, =0x110002E4
ldr r2, [r1]
mov r3, #1
bic r2, r2, r3, LSL r0
str r2, [r1]

mov pc, lr


.align 2
.global led_off
led_off:
ldr r1, =0x110002E4
ldr r2, [r1]
mov r3, #1
orr r2, r2, r3, LSL r0
str r2, [r1]

mov pc, lr


.align 2
.global led_set
led_set:
ldr r1, =0x110002E4
ldr r2, [r1]
orr r2, r2, #0xf
and r2, r2, r0
str r2, [r1]
mov pc, lr

key.s内容如下

.section .text
.align 2
.global key_init
key_init:
ldr r0, =0x11000C60
ldr r1, [r0]
ldr r2, =0xffff00
bic r1, r1, r2
str r1, [r0]
mov pc, lr


.align 2
.global key_get
key_get:
ldr r1, =0x11000C64
ldr r0, [r1]
lsr r0, #2
mov pc, lr

test.s文件内容如下

.section .text
.align 2
.global _start
_start:
stmfd sp!, {lr}


bl key_init
bl led_init

1:
bl key_get
bl led_set

b 1b


ldmfd sp!, {pc}

05. 程序示例二

led控制蜂鸣器 key1控制蜂鸣器开,key2控制蜂鸣器关

bell.s文件内容如下

.section .text
.align 2
.global bell_init
bell_init:
@GPD0_0
ldr r0, =0x114000A0
ldr r1, [r0]
bic r1, r1, #0xf
orr r1, r1, #0x1
str r1, [r0]
mov pc, lr


.align 2
.global bell_on
bell_on:
ldr r0, =0x114000A4
ldr r1, [r0]
orr r1, r1, #0x1
str r1, [r0]
mov pc, lr


.align 2
.global bell_off
bell_off:
ldr r0, =0x114000A4
ldr r1, [r0]
bic r1, r1, #0x1
str r1, [r0]
mov pc, lr

key.s文件内容如下:

.section .text
.align 2
.global key_init
key_init:
ldr r0, =0x11000C60
ldr r1, [r0]
ldr r2, =0xffff00
bic r1, r1, r2
str r1, [r0]
mov pc, lr


.align 2
.global key_get
key_get:
ldr r1, =0x11000C64
ldr r0, [r1]
lsr r0, #2
mov pc, lr

test.s文件内容如下:

.section .text
.align 2
.global _start
_start:
stmfd sp!, {lr}


bl key_init
bl bell_init

1:
bl key_get

mov r4, r0
tst r4, #1
bleq bell_on

tst r4, #0b10
bleq bell_off


b 1b


ldmfd sp!, {pc}

06. 附录

Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf