匯編點亮LED I.MX6U-ALPHA
硬體所使用的是正點原子的I.MX6U-ALPHA開發板
創建led.s檔案,將以下代碼寫入:
.global _start /* 全域標號 */
/*
* 描述: _start函式,程式從此函式開始執行此函式完成時鐘使能、
* GPIO初始化、最終控制GPIO輸出低電平來點亮LED燈,
*/
_start:
/* 例程代碼 */
/* 1、使能所有時鐘 */
ldr r0, =0X020C4068 /* CCGR0 */
ldr r1, =0XFFFFFFFF
str r1, [r0]
ldr r0, =0X020C406C /* CCGR1 */
str r1, [r0]
ldr r0, =0X020C4070 /* CCGR2 */
str r1, [r0]
ldr r0, =0X020C4074 /* CCGR3 */
str r1, [r0]
ldr r0, =0X020C4078 /* CCGR4 */
str r1, [r0]
ldr r0, =0X020C407C /* CCGR5 */
str r1, [r0]
ldr r0, =0X020C4080 /* CCGR6 */
str r1, [r0]
/* 2、設定GPIO1_IO03復用為GPIO1_IO03 */
ldr r0, =0X020E0068 /* 將暫存器SW_MUX_GPIO1_IO03_BASE加載到r0中 */
ldr r1, =0X5 /* 設定暫存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE為5 */
str r1,[r0]
/* 3、配置GPIO1_IO03的IO屬性
*bit 16:0 HYS關閉
*bit [15:14]: 00 默認下拉
*bit [13]: 0 kepper功能
*bit [12]: 1 pull/keeper使能
*bit [11]: 0 關閉開路輸出
*bit [7:6]: 10 速度100Mhz
*bit [5:3]: 110 R0/6驅動能力
*bit [0]: 0 低轉換率
*/
ldr r0, =0X020E02F4 /*暫存器SW_PAD_GPIO1_IO03_BASE */
ldr r1, =0X10B0
str r1,[r0]
/* 4、設定GPIO1_IO03為輸出 */
ldr r0, =0X0209C004 /*暫存器GPIO1_GDIR */
ldr r1, =0X0000008
str r1,[r0]
/* 5、打開LED0
* 設定GPIO1_IO03輸出低電平
*/
ldr r0, =0X0209C000 /*暫存器GPIO1_DR */
ldr r1, =0
str r1,[r0]
/*
* 描述: loop死回圈
*/
loop:
b loop
一、編譯代碼(arm-linux-gnueabihf 交叉編譯器的使用)
-
arm-linux-gnueabihf-gcc 編譯檔案
先將 led.s 編譯為對應的.o 檔案,在終端中輸入如下命令:
arm-linux-gnueabihf-gcc -g -c led.s -o led.o其中“-g”選項是產生除錯資訊,“-c”選項是編譯源檔案,但是不鏈接,
執行上述命令以后就會編譯生成一個 led.o 檔案,
-
arm-linux-gnueabihf-ld 鏈接檔案
arm-linux-gnueabihf-ld 用來將眾多的.o 檔案鏈接到一個指定的鏈接位置,
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf“-o”選項指定鏈接生成的 elf 檔案名,這里我們命名為 led.elf,上述命令執行完以后就會在工程目錄下多一個 led.elf 檔案,
我們要燒寫的.bin 檔案,因此還需要將 led.elf 檔案轉換為.bin 檔案,
-
arm-linux-gnueabihf-objcopy 格式轉換
我們需要用它將 led.elf 檔案轉換為led.bin 檔案,命令如下:
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin“-O”選項指定以什么格式輸出,后面的“binary”表示以二進制格式輸出,選項“-S”表示不要復制源檔案中的重定位資訊和符號資訊,“-g”表示不復制源檔案中的除錯資訊,上述命令執行完成以后,會產生一個led.bin檔案,
-
arm-linux-gnueabihf-objdump 反匯編
反匯編(Disassembly):把目標代碼轉為匯編代碼的程序,
一般可以將 elf 檔案反匯編,比如如下命令:
arm-linux-gnueabihf-objdump -D led.elf > led.dis“-D”選項表示反匯編所有的段,反匯編完成以后就會在當前目錄下出現一個名為 led.dis 檔案,
led.dis 里面是匯編代碼,而且還可以看到記憶體分配情況,
總結一下我們為了編譯 ARM 開發板上運行的 led.o 這個檔案使用了如下命令:
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis
如果我們修改了 led.s 檔案,那么就需要在重復一次上面的這些命令,太麻煩了,這個時候
我們就可以使用 Makefile 檔案了,
二、創建 Makefile 檔案
使用“touch”命令在工程根目錄下創建一個名為“Makefile”的檔案,
在 Makefile 中輸入如下內容:
led.bin:led.s
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:
rm -rf *.o led.bin led.elf led.dis
Makefile中的代碼前面的空格必須要用Tab,
創建好 Makefile 以后我們就只需要執行一次“make”命令即可完成編譯,如果我們要清理工程的話執行“make clean”即可,
三、代碼燒寫
imxdownload軟體
-
將 imxdownload 拷貝到工程根目錄下
我們要將 imxdownload 拷貝到工程根目錄下,也就是和 led.bin 處于同一個檔案夾下,
-
給予 imxdownload 可執行權限
我們直接將軟體 imxdownload 從 Windows 下復制到 Ubuntu 中以后,imxdownload 默認是沒有可執行權限的,我們需要給予 imxdownload 可執行權限,使用命令“chmod”,命令如下:
chmod 777 imxdownload當給予 imxdownload 可執行權限以后其名字變成了綠色的,如果沒有可執行權限的話其名字顏色是白色的,
-
確定要燒寫的SD卡
Ubuntu 下所有的設備檔案都在目錄“/dev”里面,所以插上 SD 卡以后也會出現在“/dev”里面,其中存盤設備都是以“/dev/sd”開頭的,

我的是/dev/sdb
-
向SD卡燒寫bin檔案
使用 imxdownload 向 SD 卡燒寫 led.bin 檔案,命令格式如下:
./imxdownload <.bin file>
其中.bin 就是要燒寫的.bin 檔案,SD Card 就是你要燒寫的 SD 卡,比如我的電腦使用如下
命令燒寫 led.bin 到/dev/sdb 中:
./imxdownload led.bin /dev/sdb//不能燒寫到/dev/sda 或 sda1 設備里面!那是系統磁盤 -
代碼驗證
然后設定撥碼開關為 SD 卡啟動,撥碼開關如圖所示:

之后DS0將會被點亮,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301115.html
標籤:其他
