记录自己linux学习过程,让自己能够一直坚持下去
1、原理图分析:
nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭,
S3C2440芯片GPF4-GPF6对应nLED_1, nLED_2, nLED_4,
所以代码里面操作GPF4-GPF6就可以控制LED灯亮灭。
2、写代码前了解事项
第一步:将GPF0-GPF4配置为输出功能
第二步:控制GPF0-GPF4输出低电平
3、编写代码
1 .text 2 .global _start 3 _start: 4 ldr r0, =0x53000000 @ WATCHDOG寄存器地址 5 mov r1, #0x0 6 str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启 7 8 ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K 9 @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K 10 bl main @ 调用C程序中的main函数 11 halt_loop: 12 b halt_loop
参考韦东山视频模仿写的汇编部分,主要是为调用C语言程序,准备条件
1 #define GPFCON (*(volatile unsigned long *)0x56000050) 2 #define GPFDAT (*(volatile unsigned long *)0x56000054) 3 4 5 int main(void) 6 { 7 unsigned long i = 0; 8 9 GPFCON = 0x00001500; //将GPF4 GPF5 GPF6设置为输出 10 11 while(1) 12 { 13 14 GPFDAT = 0x00000060; //控制GPF4输出低电平,LED1亮 15 for(i=0; i<30000; i++); //延时 16 17 GPFDAT = 0x00000050; //控制GPF5输出低电平,LED2亮 18 for(i=0; i<30000; i++); 19 20 GPFDAT = 0x00000030; //控制GPF6输出低电平,LED4亮 21 for(i=0; i<30000; i++); 22 } 23 24 return 0; 25 }
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烧录到板子中,观察现象,按照预期流水灯走起来了!
时间: 2024-10-24 07:29:10