嵌入式linux學習筆記-20200220-JZ2440 裸機001 彙編代碼點燈程序

使用的開發板是 韋東山老師的 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 下載到開發板上即可

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章