【ARM】Tiny4412裸板编程之按键

00. 目录

01. 开发环境

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

02. 控制原理

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

我们的按键在底板上,因此须要看底板的原理图
在这里插入图片描述web

打开底板原理图(Tiny4412SDK-1506-Schematic.pdf)
在这里插入图片描述svg

用户按键KEY一、KEY二、KEY三、KEY4分别对应了GPX3_二、GPX3_三、GPX3_四、GPX3_5,而且按键引脚日常是高电平,按键被按下变为低电平。工具

03. 配置寄存器

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

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

  • Base Address: 0x1100_0000xml

  • Address = Base Address + 0x0C60, Reset Value = 0x0000_0000
    在这里插入图片描述blog

第二步: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