1. 程式人生 > >關於LED點亮

關於LED點亮

關看門狗
[初始化時鐘]
[初始化SRAM]


設定棧和返回地址
呼叫main
清理工作




@啟動檔案start.S
.text
.global _start
_start:
ldr r0,=0x56000010 @ WATCHDOG暫存器地址
mov r1,#0x0
str r1,[r0] @ 寫入0,禁止WATCHDOG,否則CPU會不斷重啟


ldr sp,=1024*4 @ 設定堆疊,注意:不能大於4k,因為現在可用的記憶體只有4k
@ nand flash中的程式碼在復位後會移動到內部ram中,此ram只有4k
bl main @ 呼叫C程式中的main函式,並且把返回地址放在lr暫存器中
halt_loop:
b halt_loop




//main.c檔案
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)


int main()
{
GPFCON = 0x00000100; // 設定GPF4為輸出口,位[9:8]=0b01
GPFDAT = 0x00000000; // GPF4輸出0,LED1點亮
return 0;
}




//makefile檔案
led_on_c.bin:start.S main.c
arm-linux-gcc -g -c -o start.o start.S #編譯不連線,生成start.o
arm-linux-gcc -g -c -o main.o main.c #編譯不連線,生成main.o
arm-linux-ld -Ttext 0x00000000 -g start.o main.o -o led_elf #連線並且其實地址為0x00000000,第一個為start.o,第二個為main.o,生成led_elf
arm-linux-objcopy -O binary -S led_elf led.bin #生成led.bin二進位制執行檔案
arm-linux-objdump -D -m arm  led_elf > led.dis
#反彙編arm架構的指令程式碼
clean:
rm -f led.dis led.bin led_elf *.o #可以執行make clean清理




//常用delay函式
void  delay(volatile unsigned long dly)
{
for(; dly > 0; dly--);
}


delay(30000); // 一般使用30000延遲,不到1秒