ARM彙程式設計式設計學習筆記(五)
例子一,純彙編點亮一個LED燈
硬體平台:使用友善之臂mini2440平台。
軟體平台:keil
下面直接給出例子和注釋。關于使用keil的一些注意事項,以及調試的注意事項,放在本文末給出。
AREA led,CODE,READWRITE;聲明一個代碼段,可讀寫,名字為led
ENTRY ;标記下面的指令為入口點
INCLUDE RegisterMap.asmheader;包含RegisterMap.asmheader(見下文)檔案,INCLUDE僞指令的解釋詳見《ARM彙程式設計式設計學習筆記二》
start
ldr r0,=GPBCON; r0存放GPBCON的位址
ldr r1,[r0];将r0位址中的值讀入r1中
orr r1,r1,#(0x01<<10);将r1或(0x01<<10),并将結果放入r1中
str r1,[r0];将r1中值放入r0所指的位置
;;;上面一段,用于配置GPBCON寄存器
ldr r0, =GPBUP
mov r1,#0xff;
str r1,[r0]
;;;上面一段,用于配置GPBUP寄存器
led_loop
ldr r0,=GPBDAT
mov r1,#0x00
str r1,[r0]
b led_loop;跳轉到led_loop标簽所指的位址,即開始循環
END;源程式結尾
<RegisterMap.asmheader>
;;定義為本程式需要用到的三個寄存器
GPBCON EQU 0x56000010
GPBDAT * 0x56000014
GPBUP * 0x56000018
例子二,彙編加c,點亮一個LED燈
同樣,為了友善的使用寄存器,我們單獨定義了一個檔案,叫做RegisterMap.asmheader,它較之上一個程式多了一個看門狗的寄存器定義,如下:
;本檔案為寄存器到位址的映射檔案檔案
GPBCON EQU 0x56000010
GPBDAT * 0x56000014
GPBUP * 0x56000018
WTCON * 0x53000000
因為我們需要使用c語言,是以,我們需要定義一個c語言的入口,按照慣例,我們将其叫做main,但是為了展現是我們手動定義的,将其命名為smain。
c語言裡面的函數,需要用到堆棧,此時我們還需要設定堆棧指針,用于指向内部4k的頂部。
為了讓其具備一定的移植性,将上面的功能單獨成一個StartUP.s檔案,如下
;本檔案為2440的啟動檔案
PRESERVE8;注意:這裡應該是需要深究的,但是因為我的開發環境已經在上傳這篇文章時被損壞,沒有細看。如果沒有記錯的話,如果去掉這句,會導緻單步調試出現問題。
AREA startup,CODE,READONLY,ALIGN=3
ENTRY
INCLUDE RegisterMap.asmheader ;包含頭檔案
start
; ldr r0,=WTCON
; mov r1,#0x00
;str r1,[r0];關閉看門狗
ldr sp,=1024*4;設定sp為内部4k的頂部
bl smain ;跳轉到main程式
smain
IMPORT asm_main
;str lr,[sp,#-4]!;将傳回位址壓入棧中
;;處理參數
bl asm_main
add sp,sp,#4; 将棧指針指向存放傳回位址的地方
ldr pc,[sp],#4;pc為sp的值加4
END
那麼對應的c檔案如下
#include "RegisterMap_c.h"
int asm_main(){
GPBCON = 0x01<<10;
GPBUP = 0xff;
GPBDAT = 0x00;
while(1);
return 0;
}
同樣的,我們便于c語言使用寄存器,也将寄存器單獨在了一個頭檔案中,如下:
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
#define GPBUP (*(volatile unsigned long *)0x56000018)
我在使用mini2440過程中的一些注意事項
因為并不經常使用mini2440,每次都是幾個月才匆忙用一次,是以常常犯一些常識性問題,現将其記錄如下
- 單步調試,需要将開關撥動到nand flash一側,否則無法進行調試。
- memory的映射一定要正确,一般從0開始,讀寫從0x30000000開始
- mini2440将二進制燒寫到nand flash時,可以使用MiniTools工具,該工具需要nor flash燒寫對應的軟體版本。
- jflash在燒寫是需要撥動到nor flash
- 序列槽工具,在調試之前需要安裝序列槽驅動,官方CD光牒中的驅動檔案,在win10中,運作不太好,需要重新在網上找
- minitool 工具,需要android的adb驅動