检测按键

硬件说明

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

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

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

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

代码文件key.S

[plain]  view plain copy
  1. .text  
  2. .global main  
  3. main:  
  4.     stmfd   sp!, {r0-r12, lr}  
  5.   
  6.     ldr r0, =0  
  7.     ldr r1, GPNCON  
  8.     str r0, [r1]  
  9.   
  10. check:  
  11.     ldr r1, GPNDAT  
  12.     ldr r0, [r1]  
  13.     and r0, r0, #(1 << 1)  
  14.     cmp r0, #0  
  15.     bne check  
  16.   
  17.     ldr r0, =mystr  
  18.     mov lr, pc  
  19.     ldr pc, printf  
  20.   
  21.     bl  delay  
  22.     b   check  
  23.   
  24.     ldmfd   sp!, {r0-r12, pc}  
  25.   
  26. .global delay  
  27. delay:  
  28.     stmfd   sp!, {lr}  
  29.     ldr r2, =0xffffff  
  30. dloop:  
  31.     subs    r2, r2, #1  
  32.     bne dloop  
  33.     ldmfd   sp!, {pc}  
  34.   
  35. GPNCON:  
  36.     .word   0x7F008830  
  37. GPNDAT:  
  38.     .word   0x7F008834  
  39. GPNPUD:  
  40.     .word   0X7F008838  
  41. printf:  
  42.     .word   0x57e11df8  
  43. mystr:  
  44.     .string "key pressed...\n"  
  45.     .align 4  

把u-boot编译为nandflash启动,然后运行下面命令

[html]  view plain copy
  1. # arm-none-linux-gnueabi-nm u-boot | grep printf  
输出结果

[plain]  view plain copy
  1. 57e11d68 T fprintf  
  2. 57e11df8 T printf  
  3. 57e11fdc T serial_printf  
  4. 57e1917c T sprintf  
  5. 57e11dcc T vprintf  
  6. 57e18d78 T vsprintf  
可知道printf函数在nandflash的地址为0x57e11df8,我们可以通过汇编直接调用它。

连接脚本key.lds

获得lds脚本模板

[plain]  view plain copy
  1. # arm-none-linux-gnueabi-ld --verbose > key.lds  
修改为

[plain]  view plain copy
  1. OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",  
  2.           "elf32-littlearm")  
  3. OUTPUT_ARCH(arm)  
  4. ENTRY(main)  
  5. SECTIONS  
  6. {  
  7.     . = 0x50008000 ;  
  8.     .text :  
  9.     {  
  10.         *(.text) ;  
  11.     }  
  12.     .align = 4 ;  
  13. }  

编译程序

[plain]  view plain copy
  1. # arm-none-linux-gnueabi-gcc -c key.S -o key.o  
  2. # arm-none-linux-gnueabi-ld -T key.lds key.o -o key  
  3. # arm-none-linux-gnueabi-objcopy -O binary key /tftpboot/key.bin  

运行程序

在u-boot命令状态

[html]  view plain copy
  1. $ tftp 0x50008000 key.bin  
  2. $ go 0x50008000  


运行结果

按下按键,则打印

[plain]  view plain copy
  1. key pressed...                                                                                       
  2. key pressed...                                                                                       
  3. key pressed...                                                                                       
  4. key pressed...   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值