检测按键

硬件说明

按键KEYINT3 练到s3c6410的GPN2脚,且键按下时,GPN2脚为低电平。

GPN配置寄存器GPNCON的地址为0x7F008830, 且[5:4] 位配置为00时,表示GPN2脚用于输入功能。

GPN数据寄存器GPNDAT的地址为0x7F008834,且读取[2]位就能得到GPN2脚的电平状态。

GPN上拉控制寄存器GPNPUD 的地址为0x7F008838。

代码文件key.S

.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启动,然后运行下面命令

# arm-none-linux-gnueabi-nm u-boot | grep printf
输出结果

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脚本模板

# arm-none-linux-gnueabi-ld --verbose > key.lds
修改为

OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
	      "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(main)
SECTIONS
{
	. = 0x50008000 ;
	.text :
	{
		*(.text) ;
	}
	.align = 4 ;
}

编译程序

# 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命令状态

$ tftp 0x50008000 key.bin
$ go 0x50008000


运行结果

按下按键,则打印

key pressed...                                                                                     
key pressed...                                                                                     
key pressed...                                                                                     
key pressed... 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值