ARM筆記: 內(nèi)存驅(qū)動(dòng)實(shí)驗(yàn)
1.1.8內(nèi)存驅(qū)動(dòng)實(shí)驗(yàn)
設(shè)置該工程加載時(shí)運(yùn)行時(shí)地址為0x30000000,如圖2-55所示:
圖2-55設(shè)置加載時(shí)運(yùn)行時(shí)地址
init.s:本程序文件主要實(shí)現(xiàn)了,關(guān)閉看門(mén)狗,初始化內(nèi)存,拷貝ROM數(shù)據(jù)到內(nèi)存中,然后跳往內(nèi)存中執(zhí)行xmain函數(shù),從xmain函數(shù)返回之后,將全部led點(diǎn)亮,進(jìn)入死循環(huán)。
;
;內(nèi)存初始化實(shí)驗(yàn)
;
AREA Init, CODE, READONLY
ENTRY
start
; close watchdog
ldr r0, = 0x53000000;將看門(mén)狗控制寄存器地址放入r0
mov r1, #0
str r1, [r0];設(shè)置看門(mén)狗控制寄存器的值為0
bl initmem;跳轉(zhuǎn)到initmem代碼段,初始化內(nèi)存
bl copyall;跳轉(zhuǎn)到數(shù)據(jù)拷貝代碼段,將ROM中數(shù)據(jù)拷貝到內(nèi)存中
IMPORT xmain;引入main.c中的xmain函數(shù)
ldr sp, =0x34000000;調(diào)用C程序之前先初始化棧指針
ldr lr, =endxmain;設(shè)置xmain函數(shù)的返回地址
ldr pc, =xmain;跳轉(zhuǎn)到C程序中的xmain函數(shù)的入口處執(zhí)行
endxmain
ldr r0, =0x56000010; LED的GPIO接口配置寄存器
ldr r1, =0x00015400; GPIO配置數(shù)據(jù)
str r1, [r0];設(shè)置GPIO
ldr r0, =0x56000014; LED控制寄存器地址
ldr r1, =0x0;全部LED亮
str r1,[r0]
loop
b loop;死循環(huán)
copyall
IMPORT |Image
RO
Base|;引入編譯器Image
RO
Base符號(hào)變量
IMPORT |Image
RW
Limit|;引入編譯器Image
RW
Limit符號(hào)變量
ldr r0, = |Image$$RO$Base|;取得Image$$RO$Base域基址的值
ldr r1, = |Image
RW
Limit|;取得Image$$RW$Base域結(jié)束地址的值
ldr r2, =0x0;數(shù)據(jù)拷貝源地址
copyallloop
teq r0,r1;測(cè)試是否拷貝完成
beq quitcopyallloop;拷貝完成,跳往quitcopyallloop退出
ldr r3, [r2], #4;四字節(jié)加載
str r3, [r0], #4;四字節(jié)存儲(chǔ)
b copyallloop;返回繼續(xù)執(zhí)行
quitcopyallloop
mov pc, lr;調(diào)用返回
initmem;內(nèi)存初始化
ldr r0, =0x48000000;加載內(nèi)存相關(guān)寄存器首地址r0
ldr r1, =0x48000034;加載內(nèi)存相關(guān)寄存器尾地址到r1
adr r2, memdata;將寄存器配置數(shù)據(jù)地址段首地址加載到r2
initmemloop
ldr r3, [r2], #4;循環(huán)設(shè)置存寄存器
str r3, [r0], #4
teq r0, r1
bne initmemloop;循環(huán)到最后一個(gè)寄存器時(shí)退出函數(shù)
mov pc,lr
memdata
DCD0x22000000;BWSCON
DCD0x00000700;BANKCON0
DCD0x00000700;BANKCON1
DCD0x00000700;BANKCON2
DCD0x00000700;BANKCON3
DCD0x00000700;BANKCON4
DCD0x00000700