tiny6410裸机实验第2章--------------点亮LED灯(原理和代码分析)
2014-02-23 21:51
344 查看
【说明】
首先我们要打开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闪烁
首先我们要打开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闪烁
相关文章推荐
- tiny6410裸机实验第2章--------------点亮LED灯(外设基地址和关闭看门狗)
- tiny6410裸机实验第8章--------------中断(原理及代码)
- tiny6410裸机实验第10章--------------PWM定时器(原理及代码)
- 数据压缩原理实验5_JPEG编解码原理及代码分析
- 裸板点亮LED流水灯源代码分析(含启动代码和C文件)
- tiny6410裸机实验第4章--------------UART(原理分析)
- Java NIO原理图文分析及代码实现
- Java NIO原理图文分析及代码实现
- 编译原理实验,实现一个代码解析程序
- 恶意代码分析实战(7-01实验学习笔记)
- S3C2440裸机学习[2] - LCD驱动原理及代码分析[一]
- word2vec原理推导与代码分析
- CC2430——Timer 2基础实验(代码分析)
- 编译原理-LL(1)预测分析实验 c源代码
- 谱聚类原理简述(含实验代码)
- Java NIO原理图文分析及代码实现
- 编译原理 实验3 递归下降语法分析程序设计
- SVM通俗原理与OpenCV应用例子代码分析
- Java NIO原理图文分析及代码实现
- nio原理分析与代码实现