Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Tiny4412 裸機程式設計實戰:ARM 汇編實現 GPIO 控制 LED 跑馬燈效果

編輯:Linux 教學

前言

Tiny4412 開發板(核心板 Exynos 4412,底板 ADK 1312)提供 4 顆用戶 LED,對應 GPIO GPM4_0~GPM4_3。本文完整展示從原理圖分析、暫存器配置、ARM 汇編實作、連結腳本編寫到 Makefile 自動化建置的完整裸機開發流程。

一、硬體原理分析

  • LED 控制腳位:GPM4_0 ~ GPM4_3(GPIO Group M4, Pins 0-3)。
  • 電路極性:IO 輸出高電平 → LED 滅;輸出低電平 → LED 亮(共陽極接法)。
  • 相關暫存器(Exynos 4412 TRM):
    • GPM4CON (0x110002E0):功能選擇,每腳 4 bits。0x1 = Output。
    • GPM4DAT (0x110002E4):資料輸出,bit 0-3 對應 Pin 0-3。

Tiny4412 核心板

LED 原理圖 1

LED 原理圖 2

GPM4CON 位定義

二、ARM 汇編完整程式碼


/* 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 自動化建置


# 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 跑馬燈

六、關鍵知識點回顧

  1. bic (Bit Clear) 與 orr (OR Register) 組合實現「讀取-修改-寫入」暫存器操作。
  2. ldr r0, =addr 為偽指令,編譯器自動處理 32-bit 立即數載入(可能用常數池)。
  3. 連結腳本 ENTRY(_start) 指定進入點,. = 0x02023400 設定載入基址對應 BL2 執行位址。
  4. mkbl2 工具核心功能:計算二進位檔 checksum 並填入最後 4 Bytes,供 BL1 驗證。
  5. 延遲迴圈 0xFFFFFF 約數百毫秒(視核心頻率),實際專案應用 Timer 周期性中斷實現精確延遲。
Copyright © Windows教程網 All Rights Reserved