嵌入式Linux学习入门:控制LED灯

时间:2022-03-02 13:34:11

记录自己linux学习过程,让自己能够一直坚持下去

1、原理图分析:

嵌入式Linux学习入门:控制LED灯

nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭,

嵌入式Linux学习入门:控制LED灯

S3C2440芯片GPF4-GPF6对应nLED_1, nLED_2, nLED_4,

所以代码里面操作GPF4-GPF6就可以控制LED灯亮灭。

2、写代码前了解事项

嵌入式Linux学习入门:控制LED灯

第一步:将GPF0-GPF4配置为输出功能

第二步:控制GPF0-GPF4输出低电平

3、编写代码

 .text
.global _start
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启 ldr sp, =* @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop

参考韦东山视频模仿写的汇编部分,主要是为调用C语言程序,准备条件

 #define    GPFCON        (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054) int main(void)
{
unsigned long i = ; GPFCON = 0x00001500; //将GPF4 GPF5 GPF6设置为输出 while()
{ GPFDAT = 0x00000060; //控制GPF4输出低电平,LED1亮
for(i=; i<; i++); //延时 GPFDAT = 0x00000050; //控制GPF5输出低电平,LED2亮
for(i=; i<; i++); GPFDAT = 0x00000030; //控制GPF6输出低电平,LED4亮
for(i=; i<; i++);
} return ;
}

4、编译代码,烧录执行

在linux环境下使用GCC编译,同样跟着视频学习写了Makefile

led_test:main.c start.S
  arm-linux-gcc -c start.S -o start.o
  arm-linux-gcc -c main.c -o main.o
  arm-linux-ld -Ttext 0x0000000 start.o main.o -o LED_TEST_ELF
  arm-linux-objcopy -O binary -S LED_TEST_ELF led_test.bin
  arm-linux-objdump -D -m arm LED_TEST_ELF > LED_TEST.dis
clean:
  rm -f *.o led_test.bin LED_TEST_ELF LED_TEST.dis

将生成的led_test.bin烧录到板子中,观察现象,按照预期流水灯走起来了!