LED跑马灯

 LED跑马灯

 

 

这里简单的总结了一下,主要是通过跑马灯程序来了解嵌入式编程的基本步骤和思路。

 

1) LED工作远了原理:

 

   LED又称发光二接管,二节管是及其有用的半导体设备,它能在一个方向上通过电流,而在另一个方向上截止电流。二节管可用来允许电流从一个部件流到另一个部件,而禁止电流“倒流”的现象。所有的二接管工作是都会产生少量的光(由于二接管的外表封装通常看不到),而LED非常善于利用这种光。通过LED的电流量有个限制,超越这一限制就可能损害LED。因此,使用时,LED一般与限流电阻串联(分流),如下(图一)所示。但是有些限流电阻是集成在LED内部。

  图一

 

 

                                                                

图一:

2)通过I/O pin控制LED:

 

   假如处理器的工作电压为5v,此时处理器I/O pin输出低电压为0.6v。电源电压VCC3.3v,那么VCCLED阴极间的电压为2.7v,而LED的正向电压降(阀值电压)为1.6v,故有效的设定限流电阻就可以让LED导通。这里可通过调整限流电阻的大小来控制通过LED的电流,从而改变LED亮度。当I/O线由过高电压驱动时,处理器的I/O pin的输出电压至少为4.3v,此时VCCLED阴极间的电压降只能是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)编辑源代码:

    

@******************************************************************************
@ File:led_on.s
@ 分别通过对引脚GPF4、GPF5、GPF6、GPF7输出逻辑低电平来使其发光
@******************************************************************************

 

 

 @@代码部分:  

       .text
       .global _start
     _start:
        mov r3, #4              @记数器,用以循环点亮四个灯
        ldr r0, =0x56000050     @设置 R0 为GPFCON寄存器                                              
        mov r1, #0x1
        mov r2, r1, LSL#8
     _loop:
        ldr r4, =200000
        str r2, [r0]
      
        ldr r5, =0x56000054     @设置 R5 为GPFDAT寄存器                        
        mov r1, #0x0
        str r1, [r5]
       
     _delay:
        nop
        subs r4, r4, #1
        bne _delay
      
        mov r2, r2, LSL#2 
        subs r3, r3, #1
        bne _loop
        b _start

 

 

5)编辑Makefile:

led_on:led_on.s

     arm-linux-gcc -g -c -Wall -o led_on.o led_on.s
     arm-linux-ld -Ttext 0x30200000 -g led_on.o -o led_on_tmp.o
     arm-linux-objcopy -O binary -S led_on_tmp.o led_on
clean:
     rm -f   led_on
     rm -f   led_on.o
     rm -f   led_on_tmp.o

 

 

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
@function: just for jump to main

@************************

 .text
 .global _start
_start:
 bl main
 
halt_loop: 
 b  halt_loop


/*

  filename: led_on.c

  function: turn on led at order D1-D4

 **/

#define GPFCON  (*(volatile unsigned *)0x56000050)
#define GPFDAT  (*(volatile unsigned *)0x56000054)
#define GPFUP   (*(volatile unsigned *)0x56000058)     
#define WTCON   (*(volatile unsigned *)0x53000000)    
void delay(int times);
int main(void)
{
    GPFCON = (GPFCON|0xFF00)&0x55FF;
    GPFUP|=0xF0;
    WTCON = 0x0;     // disable the watchdog

  while(1){

    GPFDAT=(GPFDAT&0x0F)|0xE0;
    delay(400000);

    GPFDAT=(GPFDAT&0x0F)|0xD0;
    delay(400000);

    GPFDAT =(GPFDAT&0x0F)|0xB0;
    delay(400000);

    GPFDAT=(GPFDAT&0x0F)|0x70;
    delay(400000);
  }
  return (0);
}

void delay(int times){

  int i;
  for(i=times;i>0;i--)
      ;
}

 #########################
 #filename: led.lds
 #########################

SECTIONS{

 . = 0x30200000;
 .text : {
  *(.text)
  *(.rodata)
 }

 .data ALIGN(4) : {
  *(.data)
 }

 .bss ALIGN(4) : {
  *(.bss)  
 }
}


 #########################
 #filename: Makefile
 #########################

CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding -c
led_on : start.s led_on.c
 arm-linux-gcc $(CFLAGS) -o start.o start.s
 arm-linux-gcc $(CFLAGS) -o led_on.o led_on.c
 arm-linux-ld -Tled.lds start.o led_on.o -o led_temp.o
 arm-linux-objcopy -O binary -S led_temp.o led_on

clean:
 rm -f start.o
 rm -f led_on.o
 rm -f led_temp.o
 rm -f led_on

 


 

 注意:Makefile中的命令要缩进一个TAB字符.

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值