使用的開發板是 韋東山老師的 JZ2440V3
第一步就是找到燈的 IO
根據原理圖, 我們要想點亮 LED 需要給對應的 IO口 拉低
也就是說 需要拉低 GPF4 GPF5 GPF6
要設置一個 IO口的輸出 第一步就是 設置IO的控制寄存器
2440 是非常古老的芯片 IO的複用結構和 輸出控制非常的簡單(或者說是 單一 )
這是對應的datesheet裏面關於IO部分的 寄存器 我們暫時用到的就只有上面兩個寄存器
GPFCON 控制寄存器 (這裏可以類比於stm32 系列的mode 寄存器 就是控制io的 輸入輸出選擇的)
GPFDAT 數據寄存器
這個就是 輸出的時候作爲 輸出數據寄存器 如果是輸入的話 這個寄存器就是IO口當前的電平狀態
接下來就是設置值了
我們先來點亮一個 LED GPF4 對應於D10
控制寄存器的值 我們需要將 GPFCON[9:8] 設置爲01
簡化程序 我們直接寫入 0x10 到控制寄存器
爲了輸出低電平我們需要給 GPFDATA[4] 寄存器輸出 0
簡化程序 直接輸出0
接下來就是彙編代碼 我們只需要基本的寄存器寫指令就可以了
ldr r1, =0x56000054
ldr r0, =0 /* mov r0, #0 */
str r0, [r1]
大概是這三行 ldr 指令是寄存器裝載指令(load register)
https://www.jianshu.com/p/66d801c85ee9 這是LDR 指令的解釋 我就不去班門弄斧了
這裏的register應該是特指CPU中的 16個 特殊的寄存器 而爲了訪問內存中的數據我們需要進行寄存器間接尋址 通過上面的三行代碼 就可以實現一個 寄存器的寫。 所以我們的程序很容易就 做出來了
其實韋老師當時應該也提過 mov指令 和ldr 的僞指令 這裏就不做贅述了, 最簡單的能實現功能的代碼就行了....
最後加一個死循環
將文件發送到服務器
輸入命令 arm-linux-gcc -c -o led.o led.S 預編譯 輸出指定名爲led.o的文件
接下來是鏈接文件
arm-linux-ld -Ttext 0 led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
這是單步的指令 可以編寫Makefile文件來 替代人手工輸入
這樣我們就生成了 需要的一個bin 文件
使用 openjtag 下載到開發板上即可