記錄自己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燒錄到板子中,觀察現象,按照預期流水燈走起來了!