[笔记]:Tiny6410裸机点亮led灯

折腾了一上午终于能在Tiny6410上点亮4个led灯。第一次在嵌入式设备上写程序,遇到了很多问题。下面记录下所遇到的问题和解决方法。

 

1. 首先遇到的问题是,使用的Tiny6410板子的Nand Flash上已经被烧写了一个Linux操作系统。为了将Nand Flash清空(格式化),使Tiny6410板子成为一个方便学习的裸机。那么如何格式化Nand Flash呢?

方法:首先在SD卡上烧写super boot(参照Tiny6410的刷机手册)。烧写好super boot之后,一定不要在SD卡上拷贝任何东西,否则无法在SD-BOOT方式下进入bios(血的教训,整了一上午才发现这个问题,一直都不能利用super boot进入bios,因此也无法在裸机上运行程序(.bin文件))。
将板子设置为SD-BOOT启动模式,连接好串口线(电脑端连接COM-1,板子端连接COM-0,波特率为115200,去掉流控选项)、USB线(安装好USB驱动程序)。打开板子的开关,在超级终端上能通过串口看到提示信息,并且成功的进入bios(有很多的功能选项)。输入f,选择格式化Nand Flash,然后就可以清空Nand Flash,让板子完全成为一个裸机。

注意:我宿主机的系统为Win7系统,没有自带的超级终端,secureCRT可以用来代替超级终端。

 

2. 如何搭建嵌入式程序的编译环境呢?

方法:在进行嵌入式程序开发时,一般采用交叉编译的方式。我在Linux系统下编写代码(Ubuntu系统,虚拟机的形式)。为了能在Linux系统下编译写的嵌入式程序,首先要搭建编译环境。在Linux系统下,解压arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz(光盘资料中自带的,应该可以下载获得)。我将这个压缩包解压到了/opt/Arm/tiny6410/4.5.1/下,然后在用户的/home目录下的.bashrc文件最后添加环境变量(export PATH=$PATH://opt/Arm/tiny6410/4.5.1/bin)。重新打开一个终端,输入命令:arm-linux-gcc -v。如果能看见一堆输出,并且没有错误提示,表明编译环境搭建好了。

 

3. 点亮led灯的汇编代码如何写?

方法;根据网上搜到的资料和Tiny6410的硬件资料可以知道,Led1~4等对应的寄存器是GPK4~7。首先将GPKCON0(内存地址为0x7f008800)对应于GPK4~7的位设置为0001(注意:是4个位控制一个引脚),表示为输出(由CPU向引脚上输出电平),即将0x7f008800地址对应的值设为0x11110000。
然后,将GPKDAT(内存地址为0x7f008808)对应GPK4~7的位设置为0(注意:是1个位控制一个引脚,与上面不同),表示为输出低电平,led灯亮,即将0x7f008808地址对应的值设为0x00000000。
汇编代码如下所示:

.text
.global _start
_start:
 ldr r0, =0x7f008800
 ldr r1, =0x11110000  @不能使用mov,编译时会出错。可能是立即数超出了表示的范围。使用ldr命令代替
 str r1, [r0]

 ldr r0, =0x7f008808
 ldr r1, =0x00000000  @同上
 str r1,[r0]

main_loop:
 b main_loop

 

4. 写好了汇编程序,接下来如何进行编译,并最终得到.bin可执行文件呢?

方法:搭建好编译环境之后,编写Makefile文件。文件内容如下:
led_on.bin:led_on.S
 arm-linux-gcc -g -c -o led_on.o led_on.S
 arm-linux-ld -Ttext 0x00000000 -g led_on.o -o led_on_elf
 arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
 rm -f led_on.bin led_on_elf *.o

在命令行中输入:make就可以进行编译了。编译之后,得到了led_on.bin可执行文件。接下来将.bin文件拷贝到宿主机(我的是Win7系统)上,然后再下载到板子上就可以看到效果了。 

 

5. 如何将.bin文件下载到Tiny6410的裸机上呢?

方法:根据问题1中的方法,进入bios中。选择[d]选项,通过dnw下载.bin文件到板子上运行。我的宿主机的系统是Win7,虽然不能使用dnw的串口连接功能,但是仍然可以使用dnw的下载功能(比较幸运的发现这个功能)。点击dnw中USB Port选择Transmit/Restore功能,然后选择led_on.bin文件就可以了。最后观察一下4个led灯是否全亮了。

 

虽然裸机点亮Led灯的程序比较简单,但是成功的实现点亮Led灯功能多多少少还是有点成就感的。让我了解了嵌入式程序的编译、下载和运行的过程。虽然嵌入式很难,我相信只要努力的坚持,最后一定会有收获的~~
 


【本文由“黄小蛙的修炼账号”发布,2017年06月28日】

 

你可能感兴趣的:(嵌入式编程)