检测按键
2012-11-27 20:40
113 查看
硬件说明
按键KEYINT3 练到s3c6410的GPN2脚,且键按下时,GPN2脚为低电平。
GPN配置寄存器GPNCON的地址为0x7F008830, 且[5:4] 位配置为00时,表示GPN2脚用于输入功能。
GPN数据寄存器GPNDAT的地址为0x7F008834,且读取[2]位就能得到GPN2脚的电平状态。
GPN上拉控制寄存器GPNPUD 的地址为0x7F008838。
代码文件key.S
[plain] view
plaincopy
.text
.global main
main:
stmfd sp!, {r0-r12, lr}
ldr r0, =0
ldr r1, GPNCON
str r0, [r1]
check:
ldr r1, GPNDAT
ldr r0, [r1]
and r0, r0, #(1 << 1)
cmp r0, #0
bne check
ldr r0, =mystr
mov lr, pc
ldr pc, printf
bl delay
b check
ldmfd sp!, {r0-r12, pc}
.global delay
delay:
stmfd sp!, {lr}
ldr r2, =0xffffff
dloop:
subs r2, r2, #1
bne dloop
ldmfd sp!, {pc}
GPNCON:
.word 0x7F008830
GPNDAT:
.word 0x7F008834
GPNPUD:
.word 0X7F008838
printf:
.word 0x57e11df8
mystr:
.string "key pressed...\n"
.align 4
把u-boot编译为nandflash启动,然后运行下面命令
[html] view
plaincopy
# arm-none-linux-gnueabi-nm u-boot | grep printf
输出结果
[plain] view
plaincopy
57e11d68 T fprintf
57e11df8 T printf
57e11fdc T serial_printf
57e1917c T sprintf
57e11dcc T vprintf
57e18d78 T vsprintf
可知道printf函数在nandflash的地址为0x57e11df8,我们可以通过汇编直接调用它。
连接脚本key.lds
获得lds脚本模板
[plain] view
plaincopy
# arm-none-linux-gnueabi-ld --verbose > key.lds
修改为
[plain] view
plaincopy
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
"elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(main)
SECTIONS
{
. = 0x50008000 ;
.text :
{
*(.text) ;
}
.align = 4 ;
}
编译程序
[plain] view
plaincopy
# arm-none-linux-gnueabi-gcc -c key.S -o key.o
# arm-none-linux-gnueabi-ld -T key.lds key.o -o key
# arm-none-linux-gnueabi-objcopy -O binary key /tftpboot/key.bin
运行程序
在u-boot命令状态
[html] view
plaincopy
$ tftp 0x50008000 key.bin
$ go 0x50008000
运行结果
按下按键,则打印
[plain] view
plaincopy
key pressed...
key pressed...
key pressed...
key pressed...
按键KEYINT3 练到s3c6410的GPN2脚,且键按下时,GPN2脚为低电平。
GPN配置寄存器GPNCON的地址为0x7F008830, 且[5:4] 位配置为00时,表示GPN2脚用于输入功能。
GPN数据寄存器GPNDAT的地址为0x7F008834,且读取[2]位就能得到GPN2脚的电平状态。
GPN上拉控制寄存器GPNPUD 的地址为0x7F008838。
代码文件key.S
[plain] view
plaincopy
.text
.global main
main:
stmfd sp!, {r0-r12, lr}
ldr r0, =0
ldr r1, GPNCON
str r0, [r1]
check:
ldr r1, GPNDAT
ldr r0, [r1]
and r0, r0, #(1 << 1)
cmp r0, #0
bne check
ldr r0, =mystr
mov lr, pc
ldr pc, printf
bl delay
b check
ldmfd sp!, {r0-r12, pc}
.global delay
delay:
stmfd sp!, {lr}
ldr r2, =0xffffff
dloop:
subs r2, r2, #1
bne dloop
ldmfd sp!, {pc}
GPNCON:
.word 0x7F008830
GPNDAT:
.word 0x7F008834
GPNPUD:
.word 0X7F008838
printf:
.word 0x57e11df8
mystr:
.string "key pressed...\n"
.align 4
把u-boot编译为nandflash启动,然后运行下面命令
[html] view
plaincopy
# arm-none-linux-gnueabi-nm u-boot | grep printf
输出结果
[plain] view
plaincopy
57e11d68 T fprintf
57e11df8 T printf
57e11fdc T serial_printf
57e1917c T sprintf
57e11dcc T vprintf
57e18d78 T vsprintf
可知道printf函数在nandflash的地址为0x57e11df8,我们可以通过汇编直接调用它。
连接脚本key.lds
获得lds脚本模板
[plain] view
plaincopy
# arm-none-linux-gnueabi-ld --verbose > key.lds
修改为
[plain] view
plaincopy
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
"elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(main)
SECTIONS
{
. = 0x50008000 ;
.text :
{
*(.text) ;
}
.align = 4 ;
}
编译程序
[plain] view
plaincopy
# arm-none-linux-gnueabi-gcc -c key.S -o key.o
# arm-none-linux-gnueabi-ld -T key.lds key.o -o key
# arm-none-linux-gnueabi-objcopy -O binary key /tftpboot/key.bin
运行程序
在u-boot命令状态
[html] view
plaincopy
$ tftp 0x50008000 key.bin
$ go 0x50008000
运行结果
按下按键,则打印
[plain] view
plaincopy
key pressed...
key pressed...
key pressed...
key pressed...
相关文章推荐
- atmega8 例程:按键输入检测
- Javascript 检测键盘按键信息及键码值对应介绍
- 第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列
- 高级流水灯(按键检测+中断定时)
- 第33章 TIM—电容按键检测—零死角玩转STM32-F429系列
- MSP430F149按键检测程序
- 发一个用状态机实现的按键检测是VERILOG代码
- ARM学习随笔(9)按键检测程序
- Android增加一个物理按键检测步骤
- 给初学者:用VB写外挂 ———— 检测到HP小于保护值怎么办:关于发送按键
- [笔记].菜农M0助学板之GPIO按键之边沿检测小练(寄存器操作方式)
- 一种基于中断的按键检测方法
- c#实现多个按键同时按下检测
- 多功能检测按键 单按 长按 多个按键 响应方式
- Javascript 检测键盘按键
- STM8S103 独立按键检测
- Android移动开发-检测点击按键事件的实现
- 基于位运算插值的,easyX多按键检测<类>
- SDL按键检测