一、前言
最近在學韋東山的JZ2440開發板,於是記錄下學習過程中的筆記。一般學程序寫的第一個例子是打印“Hello World”,而學單片機的第一個例子一般都是點亮LED,學ARM的話如果從裸機開始學,也跟玩單片機差不多,從點亮LED開始。
二、實驗步驟
1、目標
點亮開發板上的3個LED燈。
2、硬件連線
點亮LED需要S3C2440芯片的IO引腳GPF4、GPF5、GPF6輸出低電平即可。
3、寄存器配置
和玩單片機一個套路,配置IO模式(GPFCON寄存器)和要輸出的電平(GPFDAT)就行了。即GPFCON寄存器給0x00001500把GPF4、5、6配置成輸出模式,GPFDAT給0x00000000讓三個IO輸出低電平。
4、編寫代碼
這裏比較乾脆,教程裏從彙編講起,所以用匯編語言寫的代碼。
led_turnOn.S
@******************************************************************************
@ 功能:LED點燈程序,點亮LED1、2、4
@ 對應IO爲GPF4、GPF5、GPF6
@******************************************************************************
.text
.global _start
_start:
LDR R0,=0x56000050 @ R0放入GPFCON寄存器的地址
MOV R1,#0x00001500 @ R1放入GPFCON想要設置的值
@ 將GPF4、GPF5、GPF6設置爲輸出模式
STR R1,[R0] @ 將R1值放入R0指向的地址,輸出模式配置完成
LDR R0,=0x56000054 @ R0放入GPFDAT寄存器的地址
MOV R1,#0x00000000 @ R1放入GPFDAT想要設置的值
@ 將GPF4、GPF5、GPF6設置爲輸出低電平
STR R1,[R0] @ 將R1值放入R0指向的地址,輸出電平配置完成
@ 還有個GPFUP寄存器可以配置IO上下拉的,這裏不配置也行
MAIN_LOOP:
B MAIN_LOOP @ 程序原地死循環跳轉
MakeFile
led_turnOn.bin : led_turnOn.S
#根據led_turnOn.S生成目標文件led_turnOn.o,
#-g加入調試信息,-c編譯不鏈接,-o目標文件
arm-linux-gcc -g -c -o led_turnOn.o led_turnOn.S
#Ttext指定代碼段的鏈接地址
arm-linux-ld -Ttext 0x0000000 -g led_turnOn.o -o led_turnOn_elf
#根據led_turnOn_elf生成二進制文件,-O binary輸出二進制
arm-linux-objcopy -O binary -S led_turnOn_elf led_turnOn.bin
clean:
#刪除bin和中間文件
rm -f led_turnOn.bin led_turnOn_elf *.o
將這兩個文件使用FTP工具拷貝到Linux下,執行make命令生成二進制文件led_turnOn.bin,將該文件用FTP工具拷貝回Windows下,可以燒寫到開發板上運行了。
5、燒寫代碼到開發板
有很多種方式燒寫代碼,如openJTAG或者DNW,這裏使用openJTAG。打開Windows命令行CMD工具,進入到led_turnOn.bin所在目錄,輸入oflash [文件名]。
選擇0,使用的燒寫工具爲openJTAG:
CPU選擇1,S3C2440:
選擇燒寫到NandFlash中去:
燒寫到NandFlash的塊0:
爲什麼把bin文件燒寫到NandFlash中去而且還是塊0呢,因爲S3C2440不像單片機一樣把程序燒到內部的ROM,它的程序放在外部存儲器中,上電之後再到外部存儲器中去讀取出來運行。在這裏,S3C2440內部有一個4KB大小的片內SRAM,沒有片內ROM供我們使用,上電之後有個默認操作,就是S3C2440在設置爲Nand啓動之後,會將NandFlash塊0的前4KB內容拷貝到內部的4KB片內SRAM內,然後PC指針指向SRAM的開始地址,從SRAM中讀取內容作爲程序指令然後運行。所以bin文件是燒寫到NandFlash中去的。
最後拔掉openJTAG和開發板的連線,撥碼開關選擇Nand啓動,開發板重新上電運行,三個LED燈就點亮了。