/* SDRAM regisers */
#define MEM_CTL_BASE 0x48000000 // BWSCON的地址
#define SDRAM_BASE 0x30000000 // SDRAM的起始地址
/* SDRAM 13个寄存器的值 */
/* 定义了一个数组,把13个寄存器的设置值存到一个数组里面 */
unsigned long const mem_cfg_val[]={ // 注意unsigned long const 的含义…
0x22111110, //BWSCON
0x00000700, //BANKCON0
0x00000700, //BANKCON1
0x00000700, //BANKCON2
0x00000700, //BANKCON3
0x00000700, //BANKCON4
0x00000700, //BANKCON5
0x00018005, //BANKCON6
0x00018005, //BANKCON7
0x008e07a3, //REFRESH
0x000000b2, //BANKSIZE
0x00000030, //MRSRB6
0x00000030, //MRSRB7
};
/* 设置控制SDRAM的13个寄存器 */
/* for循环总共13次,刚好对13个寄存器赋值完毕 */
void memsetup()
{
int i = 0;
unsigned long *p = (unsigned long *)MEM_CTL_BASE;
for(; i < 13; i++)
p[i] = mem_cfg_val[i];
}
用ARM 汇编语言设置SDRAM的惯用方法
@******************************************************************************
@ File:head.s
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@******************************************************************************
.equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000
.text
.global _start
_start:
bl disable_watch_dog
bl memsetup
bl copy_steppingstone_to_sdram
ldr pc, =set_sp @跳到SDRAM中继续执行
halt_loop:
b halt_loop
memsetup:
@ initialize the static memory
@ set memory control registers
mov r1, #MEM_CTL_BASE
adrl r2, mem_cfg_val @ adrl用于搬运地址
mov r3, #0x0 @ 给r3清零(自己加上的一条指令)
add r3, r1, #52 @ 52 == 4*13
1:
ldr r4, [r2], #4
str r4, [r1], #4
cmp r1, r3
bne 1b @每次递增4个字节,共循环13次(设置13个寄存器)
mov pc, lr
上一篇:单片机程序中为什么要禁止看门狗
下一篇:一条进程的栈区、堆区、数据区和代码区在内存中的映射
推荐阅读最新更新时间:2024-03-16 15:01