00. 目录
文章目录
01. 开发环境
- 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
- 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
- 平台:Ubuntu 20.04
02. 控制原理
试过了GPIO的输出功能,再来测试下GPIO的输入功能。开发板上有四个用户按键,使用这四个按键来控制四个LED的状态。
咱们的按键在底板上,所以需要看底板的原理图
打开底板原理图(Tiny4412SDK-1506-Schematic.pdf)
用户按键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
第二步:GPX3DAT数据寄存器,读取对应的位即可。
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