韦东山嵌入式Linux学习笔记04--点亮开发板的一个LED灯

搜索开发板原理图LED的走线

         

LED8是网线接口的指示灯.

在这里我们尝试用汇编代码控制D10, 也就是LED1,它连接到EINT4/GPF4,读取芯片手册

 有原理图可知,如果需要点亮LED1,需要控制s3c2440的GPF4引脚输出低电平.

GPFCON = 0x56000050

GPFDAT = 0x56000054

GPFUP = 0x56000058

=========================

直接set 0x56000050 = 0x100  设置GPF4为引脚为输出模式

set 0x56000054 0x00 设置GPF4输出电平为0

set 0x56000058 0x10 不使能GPF4内部拉高

这样就可以控制改灯常亮,汇编应该怎么写?

1. 通过汇编点亮一个LED

代码:

 .text
.global _start
_start:     
            LDR     R0,=0x56000050      @  这是个内存操作命令, 先将寄存器的地址装入R0中
                                        @ 
                                        @ 
            MOV     R1,#0x00000100      @ 将0x00赋值给R1
            STR     R1,[R0]             @ 内存的反向操作, 将R1的值存到R0地址处. 括号代表类似于取指针
            
            LDR     R0,=0x56000054      @ 同样操作
                                        @ 
            MOV     R1,#0x00000000      @ 
                                        @ 
            STR     R1,[R0]             @ 
MAIN_LOOP:                              @ 死循环
            B       MAIN_LOOP

Makefile

led_on.bin : led_on.S  # 编译的顺序  -- 预处理, 编译, 汇编, 链接
	arm-linux-gcc -g -c -o led_on.o led_on.S # 汇编
	arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf #链接并指定运行地址
	arm-linux-objcopy -O binary -S led_on_elf led_on.bin #将ELF格式的可执行文件转换成二进制文件
clean:
	rm -f   led_on.bin led_on_elf *.o

上电,通过tftp下载, tftp 0x3000000 led_on.bin

go 0x3000000, 可以看到有一个led点亮了.测试成功.

 2. 通过c点亮一个LED

要通过汇编来调用c函数

crt0.S

.text
.global _start  @系统起来会先从_start开始跑
_start:
            ldr     r0, =0x53000000     @ 这个寄存器是WATCHDOG控制寄存器, 需要写0来关闭看门狗,不然会一直重启,为什么全汇编的时候不需要做硬件初始化?
            mov     r1, #0x0                     
            str     r1, [r0]            @ 
            
            ldr     sp, =1024*4         @ 因为s3c2440有4k大的内部RAM,将栈的位置设在这里
                                        @ 
            bl      main                @ 跳到main函数然后返回,往下执行halt_loop
halt_loop:
       b halt_loop

c文件

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

int main()
{
    GPFCON = 0x00001000;    // 
    GPFDAT = 0x00000000;    // 

    return 0;
}

Makefile

led_on_c.bin : crt0.S  led_on_c.c #编译的目标为 led_on_c.bin 需要依赖 crt0.S  led_on_c.c 这两个文件
    arm-linux-gcc -g -c -o crt0.o crt0.S
    arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
    arm-linux-ld -Ttext 0x0000000 -g  crt0.o led_on_c.o -o led_on_c_elf
    arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
    arm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis
clean:
    rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o

tftp 30000000 led_on_c.bin

nand erase bootloader

nand write 0x30000000 bootloader

选择从nand启动, 重启开发板

 

原文地址:https://www.cnblogs.com/cheyihaosky/p/11863764.html