Tiny4412 開發板(核心板 Exynos 4412,底板 ADK 1312)提供 4 顆用戶 LED,對應 GPIO GPM4_0~GPM4_3。本文完整展示從原理圖分析、暫存器配置、ARM 汇編實作、連結腳本編寫到 Makefile 自動化建置的完整裸機開發流程。
GPM4CON (0x110002E0):功能選擇,每腳 4 bits。0x1 = Output。GPM4DAT (0x110002E4):資料輸出,bit 0-3 對應 Pin 0-3。



/* led.S */
.text
.globl _start
_start:
/* ===== 1. 設定 GPM4_0~3 為輸出功能 ===== */
ldr r0, =0x110002E0 @ GPM4CON 位址
ldr r1, [r0] @ 讀取原值
bic r1, r1, #0xFF00 @ 清除 bit[15:8] (Pin 2,3)
bic r1, r1, #0xFF @ 清除 bit[7:0] (Pin 0,1)
orr r1, r1, #0x1100 @ 設定 bit[15:8] = 0b0001_0001 (Pin 2,3 Output)
orr r1, r1, #0x11 @ 設定 bit[7:0] = 0b0001_0001 (Pin 0,1 Output)
str r1, [r0] @ 寫回 GPM4CON
/* ===== 2. 控制 GPM4DAT 產生跑馬燈 ===== */
ldr r0, =0x110002E4 @ GPM4DAT 位址
ldr r1, [r0] @ 讀取原值
leds_loop:
bic r1, r1, #0xF @ 全部低電平 → 4 顆全亮
str r1, [r0]
ldr r2, =0xFFFFFF
bl delay
orr r1, r1, #0xE @ bit0=0, bit1-3=1 → LED0 亮
str r1, [r0]
ldr r2, =0xFFFFFF
bl delay
bic r1, r1, #0x3 @ bit1=0
orr r1, r1, #0x1
str r1, [r0]
ldr r2, =0xFFFFFF
bl delay
bic r1, r1, #0x6 @ bit2=0
orr r1, r1, #0x2
str r1, [r0]
ldr r2, =0xFFFFFF
bl delay
bic r1, r1, #0xC @ bit3=0
orr r1, r1, #0x4
str r1, [r0]
ldr r2, =0xFFFFFF
bl delay
orr r1, r1, #0xF @ 全部高電平 → 4 顆全滅
str r1, [r0]
ldr r2, =0xFFFFFF
bl delay
b leds_loop @ 無限迴圈
halt_loop:
b halt_loop @ 理論不會到達
/* ===== 簡易延遲副程式 ===== */
delay:
subs r2, r2, #1 @ r2-- 並更新旗標
bne delay @ 不為零則繼續迴圈
mov pc, lr @ 返回 (lr 保存呼叫下一條指令位址)
/* led.lds */
ENTRY(_start)
SECTIONS
{
. = 0x02023400; @ BL2 載入位址 (iRAM)
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
# Makefile
led.bin : led.S
arm-linux-gcc -c -o led.o led.S
arm-linux-ld -T led.lds -N led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
arm-linux-objdump -D -m arm led.elf > led.dis
clean:
rm -f *.dis *.bin *.elf *.o
# 1. 製作 BL2(含 checksum)
./mkbl2 led.bin bl2.bin 14336
# 2. 燒錄 SD 卡 (假設 /dev/sdb)
sudo dd if=bl1.bin of=/dev/sdb bs=512 seek=1 conv=notrunc
sudo dd if=bl2.bin of=/dev/sdb bs=512 seek=17 conv=notrunc
# 3. 設定 OM 腳為 SD 啟動 (001),上電觀察 LED 跑馬燈
bic (Bit Clear) 與 orr (OR Register) 組合實現「讀取-修改-寫入」暫存器操作。ldr r0, =addr 為偽指令,編譯器自動處理 32-bit 立即數載入(可能用常數池)。ENTRY(_start) 指定進入點,. = 0x02023400 設定載入基址對應 BL2 執行位址。mkbl2 工具核心功能:計算二進位檔 checksum 並填入最後 4 Bytes,供 BL1 驗證。0xFFFFFF 約數百毫秒(視核心頻率),實際專案應用 Timer 周期性中斷實現精確延遲。