/* 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
设计资源 培训 开发板 精华推荐
- PC产业驶入创新超车道,英特尔蓉城撬动AI新引擎
- 与产业聚力共赢,英特尔举行新质生产力技术生态大会
- “新”享5G-A万兆网络前沿体验 高通携手产业伙伴亮相第二届链博会
- 英飞凌推出符合ASIL-D标准的新型汽车制动系统和电动助力转向系统三相栅极驱动器 IC
- 南芯科技推出80V升降压转换器,持续深耕工业储能市场
- 法雷奥与罗姆联合开发新一代功率电子领域
- 贸泽电子开售能为电动汽车牵引逆变器提供可扩展性能的 英飞凌HybridPACK Drive G2模块
- 德州仪器新型 MCU 可实现边缘 AI 和先进的实时控制, 提高系统效率、安全性和可持续性
- 瑞萨推出高性能四核应用处理器, 增强工业以太网与多轴电机控制解决方案阵容
- 研华全新模块化电脑SOM-6833助力5G路测设备升级