【说明】
首先我们要打开TINY6410的LED部分,弄清楚点灯的原理,查看到底是哪个引脚去控制LED的量和灭,再来写代码,由于点亮LED比较简单,所以原理和代码就放一篇博文里记录吧。
【原理】
1】LED原理图
显然,当引脚输出低电平时,由于VDD_IO的存在,LED将被点亮,反之熄灭
2】相连的引脚
在核心板的原理图上有标明
3】 如何控制引脚
在6410手册中搜索GPK,阅读后发现下面几个寄存器
寄存器的说明
显然GPKCON0是用来配置引脚功能的,上边截图是一部分,4位控制一个引脚,32位一共控制8个引脚,加上GPKCON1的8个刚好是16个,我们只要设置LED对应的那几个就可以了。
GPKDAT就是每一位控制一个引脚的输出,或者表示一个引脚的输入状态,显然我们要输出,直接往相应位清0就可以点亮LED了
【代码分析】
//汇编
.global _start
_start:
// 把外设的基地址告诉CPU
ldr r0, =0x70000000 //对于6410来说,内存(0x00000000~0x60000000),外设(0x70000000-0x7fffffff)
orr r0, r0, #0x13 //外设大小:256M
mcr p15,0,r0,c15,c2,4 //把r0的值(包括了外设基地址+外设大小)告诉cpu
// 关看门狗
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]
// 设置GPKCON0
ldr r1, =0x7F008800
ldr r0, =0x11110000
str r0, [r1]
mov r2, #0x1000
led_blink:
// 设置GPKDAT,使GPK_4/5/6/7引脚输出低电平,LED亮
ldr r1, =0x7F008808
mov r0, #0
str r0, [r1]
// 延时
bl delay
// 设置GPKDAT,使GPK_4/5/6/7引脚输出高电平,LED灭
ldr r1, =0x7F008808
mov r0, #0xf0
str r0, [r1]
// 延时
bl delay
sub r2, r2, #1
cmp r2,#0
bne led_blink
halt:
b halt
delay:
mov r0, #0x1000000
delay_loop:
cmp r0, #0
sub r0, r0, #1
bne delay_loop
mov pc, lr
【makefile】 #makefile
led.bin: start.o
#链接命令,虚拟地址从0开始
arm-linux-ld -Ttext 0 -o led.elf $^
#提出指令和数据部分
arm-linux-objcopy -O binary led.elf led.bin
#反汇编,便于调试
arm-linux-objdump -D led.elf > led_elf.dis
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis -rf
【烧写】
在工程下指令make命令生成led.bin文件以及led_elf.dis反汇编文件,还有led.elf文件,我们需要的是led.bin。以SD启动方式启动开发板,,当然,要先连接好串口,还有就是SD卡内部已经烧好了U-BOOT或者Superboot,在菜单中选择下载绝对地址应用程序,打开DNW工具,这个工具的使用方法很简单,下一个看几下教程就会了。用DNW发送文件,然后把开发板设置成NAND启动,重启
【实验现象】
LED闪烁