天天看點

ARM彙程式設計式設計學習筆記(五)ARM彙程式設計式設計學習筆記(五)

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,每次都是幾個月才匆忙用一次,是以常常犯一些常識性問題,現将其記錄如下

  1. 單步調試,需要将開關撥動到nand flash一側,否則無法進行調試。
  2. memory的映射一定要正确,一般從0開始,讀寫從0x30000000開始
  3. mini2440将二進制燒寫到nand flash時,可以使用MiniTools工具,該工具需要nor flash燒寫對應的軟體版本。
  4. jflash在燒寫是需要撥動到nor flash
  5. 序列槽工具,在調試之前需要安裝序列槽驅動,官方CD光牒中的驅動檔案,在win10中,運作不太好,需要重新在網上找
  6. minitool 工具,需要android的adb驅動

繼續閱讀