ARM笔记: 内存驱动实验
扫描二维码
随时随地手机看文章
1.1.8内存驱动实验
设置该工程加载时运行时地址为0x30000000,如图2-55所示:
图2-55设置加载时运行时地址
init.s:本程序文件主要实现了,关闭看门狗,初始化内存,拷贝ROM数据到内存中,然后跳往内存中执行xmain函数,从xmain函数返回之后,将全部led点亮,进入死循环。
;
;内存初始化实验
;
AREA Init, CODE, READONLY
ENTRY
start
; close watchdog
ldr r0, = 0x53000000;将看门狗控制寄存器地址放入r0
mov r1, #0
str r1, [r0];设置看门狗控制寄存器的值为0
bl initmem;跳转到initmem代码段,初始化内存
bl copyall;跳转到数据拷贝代码段,将ROM中数据拷贝到内存中
IMPORT xmain;引入main.c中的xmain函数
ldr sp, =0x34000000;调用C程序之前先初始化栈指针
ldr lr, =endxmain;设置xmain函数的返回地址
ldr pc, =xmain;跳转到C程序中的xmain函数的入口处执行
endxmain
ldr r0, =0x56000010; LED的GPIO接口配置寄存器
ldr r1, =0x00015400; GPIO配置数据
str r1, [r0];设置GPIO
ldr r0, =0x56000014; LED控制寄存器地址
ldr r1, =0x0;全部LED亮
str r1,[r0]
loop
b loop;死循环
copyall
IMPORT |Image
RO
Base|;引入编译器Image
RO
Base符号变量
IMPORT |Image
RW
Limit|;引入编译器Image
RW
Limit符号变量
ldr r0, = |Image$$RO$Base|;取得Image$$RO$Base域基址的值
ldr r1, = |Image
RW
Limit|;取得Image$$RW$Base域结束地址的值
ldr r2, =0x0;数据拷贝源地址
copyallloop
teq r0,r1;测试是否拷贝完成
beq quitcopyallloop;拷贝完成,跳往quitcopyallloop退出
ldr r3, [r2], #4;四字节加载
str r3, [r0], #4;四字节存储
b copyallloop;返回继续执行
quitcopyallloop
mov pc, lr;调用返回
initmem;内存初始化
ldr r0, =0x48000000;加载内存相关寄存器首地址r0
ldr r1, =0x48000034;加载内存相关寄存器尾地址到r1
adr r2, memdata;将寄存器配置数据地址段首地址加载到r2
initmemloop
ldr r3, [r2], #4;循环设置存寄存器
str r3, [r0], #4
teq r0, r1
bne initmemloop;循环到最后一个寄存器时退出函数
mov pc,lr
memdata
DCD0x22000000;BWSCON
DCD0x00000700;BANKCON0
DCD0x00000700;BANKCON1
DCD0x00000700;BANKCON2
DCD0x00000700;BANKCON3
DCD0x00000700;BANKCON4
DCD0x00000700