LED跑马灯
这里简单的总结了一下,主要是通过跑马灯程序来了解嵌入式编程的基本步骤和思路。
1) LED工作远了原理:
LED又称发光二接管,二节管是及其有用的半导体设备,它能在一个方向上通过电流,而在另一个方向上截止电流。二节管可用来允许电流从一个部件流到另一个部件,而禁止电流“倒流”的现象。所有的二接管工作是都会产生少量的光(由于二接管的外表封装通常看不到),而LED非常善于利用这种光。通过LED的电流量有个限制,超越这一限制就可能损害LED。因此,使用时,LED一般与限流电阻串联(分流),如下(图一)所示。但是有些限流电阻是集成在LED内部。
|
图一:
2)通过I/O pin控制LED:
假如处理器的工作电压为5v,此时处理器I/O pin输出低电压为0.6v。电源电压VCC为3.3v,那么VCC与LED阴极间的电压为2.7v,而LED的正向电压降(阀值电压)为1.6v,故有效的设定限流电阻就可以让LED导通。这里可通过调整限流电阻的大小来控制通过LED的电流,从而改变LED亮度。当I/O线由过高电压驱动时,处理器的I/O pin的输出电压至少为4.3v,此时VCC与LED阴极间的电压降只能是0.7v。而LED的正向电压降(阀值电压)为1.6v,故没有足够的电压使其导通。(可参考上图,此处例举的数据只是为了更好的说明,实际要以具体设备而定)
3)建立交叉编译环境:
下载arm-linux-gcc-3.4.1.tar.bz2
参考网址:http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
解压:tar xjvf arm-linux-gcc-3.4.1.tar.bz2 -C /
添加环境变量:通过修改 /etc/profile文件,将arm-linu工具路径/usr/local/arm/3.4.1/bin添加到环境变量PATH,重新载入profile文件内容,命令:$ source /etc/profile
通过命令:$ which arm-linux-gcc 来检查设置是否生效.
4)编辑源代码:
@******************************************************************************
@@代码部分: .text
|
5)编辑Makefile:
led_on:led_on.s arm-linux-gcc -g -c -Wall -o led_on.o led_on.s
|
6) 编译程序:
执行命令: $ make
如果顺利的话,在当前目录下可发现 led_on可执行文件生成.
注意:Makefile中命令前要缩进一个TAB字符.
这里再简单的介绍所涉及到的各个选项:
rm-linux-gcc 编译选项,–c:指定编译成obj文件,-o:输出文件名.
arm-linux-ld 链接选项,-Ttext:设置代码段的起始地址,-g:为兼容其它工具,可不用管它,-o: 输出文件名.
arm-linux-objcopy ,-S:移除所有的标志及重定位信息,-O binary:由一个文件生成另一个文件.
如:-O binary xyb xyb.bin 表示由xyb生成二进制文件xyb.bin
7)下载程序,运行:
这里是在vivi下,通过以下命令将led_on下载到目标板,然后运行.
在minicom下,通过xmodem串口下载到指定地址:
vivi> load ram addr size z
从指定地址开始运行:
vivi> call addr
注:ram 为下载的目标存储器,这里为SDRAM
addr 为将要下载的目标地址
size 为要下载的文件的大小,该数值应该不小于实际文件大小
call 从指定的地址开始执行代码
也可以通过Jflash将它下载到nandflash,然后reset键重启开发板,可发现四个LED交替闪烁。
下面贴出通过C语言和汇编语言共同执行的代码,该代码主要包括了4个文件,分别为start.s、led_on.c、led.lds、Makefile。汇编源文件start.s主要起到跳转到led_on.c中main函数的作用。led.lds链接脚本供连接器使用,用于将objectfile文件中的各个输入段链接到输出段中,得到.elf的可执行文件,最后通过arm-linux-objdump来去除链接符号和调试信息,形成最终能烧写到flash执行的映像文件。
@************************ @filename: start.s @************************ .text /* filename: led_on.c function: turn on led at order D1-D4 **/ #define GPFCON (*(volatile unsigned *)0x56000050) while(1){ GPFDAT=(GPFDAT&0x0F)|0xE0; GPFDAT=(GPFDAT&0x0F)|0xD0; GPFDAT =(GPFDAT&0x0F)|0xB0; GPFDAT=(GPFDAT&0x0F)|0x70; void delay(int times){ int i;
######################### SECTIONS{ . = 0x30200000; .data ALIGN(4) : { .bss ALIGN(4) : { ######################### CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding -c clean:
|
注意:Makefile中的命令要缩进一个TAB字符.