DDR
15条地址线32k
128M*2(20)=2(27)
查看6410芯片手册;
5.4.3DDR/MOBILEDDRSDRAMINITIALIZATIONSEQUENCE
•Programmem_cmdindirect_cmdto‘2’b10’,whichmakesDRAMControllerissue‘NOP’memorycommand.
•Programmem_cmdindirect_cmdto‘2’b00’,whichmakesDRAMControllerissue‘Prechargeall’memory
command.
•Programmem_cmdindirect_cmdto‘2’b11’,whichmakesDRAMControllerissue‘Autorefresh’memory
command.
•Programmem_cmdindirect_cmdto‘2’b11’,whichmakesDRAMControllerissue‘Autorefresh’memory
command.
•Programmem_cmdto‘2’b10’indirect_cmd,whichmakesDRAMControllerissue‘MRS’memorycommand
−BankaddressforEMRSmustbeset.
•Programmem_cmdto‘2’b10’indirect_cmd,whichmakesDRAMControllerissue‘MRS’memorycommand.
−BankaddressforMRSmustbeset.
0x500000000x5FFFFFFF-----DRAMCtrl1
示例代码如下:
sratr.S文件
.globl_start
_start:
/*硬件相关设置*/
ldrr0,=0x70000000
orrr0,r0,#0x13
mcrp15,0,r0,c15,c2,4
/*关看门狗*/
ldrr0,=0x7E00400
movr1,#0
strr1,[r0]
/*初始化时钟*/
blclock_init
/*为C函数准备环境*/
ldrsp,=8*1024
blsdram_init
/*重定位代码*/
adrr0,_start/*取得_start指令当前所在位置*/
ldrr1,=_start/*_start的链接地址*/
ldrr2,=bss_start/*bss段的起始地址*/
cmpr0,r1/*比较两寄存器的值*/
beqclean_bss/*如果两个值相同,跳转到clean_bss*/
copy_loop:
ldrr3,[r0],#4
strr3,[r1],#4
cmpr1,r2
bnecopy_loop
/*清除bss段*/
clean_bss:
ldrr0,=bss_start
ldrr1,=bss_end
movr3,#0
cmpr0,r1
beqon_ddr
clean_loop:
strr3,[r0],#4
cmpr0,r1
bneclean_loop
/*调用C函数*/
on_ddr:
ldrpc,=main/*pc等于main的链接地址*/
clock.S文件
#defineAPLL_CLOCK0x7e00f000
#defineMPLL_CLOCK0x7e00f004
#defineEPLL_CLOCK0x7e00f008
#defineLOCK_TIME0xffff
#defineOTHERS0x7e00f900
#defineCLK_DIV00x7e00f020
#defineCLK_SRC0x7e00f01c
.text
.globalclock_init
clock_init:
/*设置lock_time*/
ldrr0,=APLL_CLOCK
ldrr1,=LOCK_TIME
strr1,[r0]/*APLL_LOCK*/
strr1,[r0,#4]/*MPLL_LOCK*/
strr1,[r0,#8]/*EPLL_LOCK*/
/*当cpu时钟!=HCLK时,设置为异步模式*/
ldrr0,=OTHERS
ldrr1,[r0]
bicr1,#0xc0
strr1,[r0]
loop1:
ldrr0,=OTHERS
ldrr1,[r0]
andr1,#0xf00
cmpr1,#0
bneloop1
#defineARM_RATIO0
#defineHCLKX2_RATIO1
#defineHCLK_RATIO1
#definePCLK_RATIO3
#defineMPLL_RATIO0
ldrr0,=CLK_DIV0
ldrr1,=(ARM_RATIO)|(MPLL_RATIO<<4)|(HCLK_RATIO<<8)|(HCLKX2_RATIO<<9)|(PCLK_RATIO<<12)
strr1,[r0]
/*配置时钟apllmpllepll*/
#defineSDIV1
#definePDIV3
#defineMDIV266
#definePLL_ENABLE(1<<31)
#defineAPLL_VAL((SDIV<<0)|(PDIV<<8)|(MDIV<<16)|(PLL_ENABLE))
#defineMPLL_VALAPLL_VAL
#defineEPLL0_VAL((2<<0)|(1<<8)|(32<<16)|PLL_ENABLE)
#defineEPLL1_VAL(0)
#defineAPLL_CON 0x7e00f00c
#defineMPLL_CON 0x7e00f010
#defineEPLL_CON0 0x7e00f014
#defineEPLL_CON1 0x7e00f018
ldrr0,=APLL_CON
ldrr1,=APLL_VAL
strr1,[r0]
ldrr0,=MPLL_CON
ldrr1,=MPLL_VAL
strr1,[r0]
ldrr0,=EPLL_CON0
ldrr1,=EPLL0_VAL
strr1,[r0]
ldrr0,=EPLL_CON1
ldrr1,=EPLL1_VAL
strr1,[r0]
/*选择PLL的输出作为时钟源*/
ldrr0,=CLK_SRC
movr1,#7
strr1,[r0]
movpc,lr
Common.h文件
#ifndef__COMMON_H
#define__COMMON_H
#definevi*(volatileunsignedint*)
#defineset_zero(addr,bit)((viaddr)&=(~(1<<(bit))))
#defineset_one(addr,bit)((viaddr)|=(1<<(bit)))
#defineset_bit(addr,bit,val)((viaddr)=((viaddr)&=(~(1<<(bit))))|((val)<<(bit)))
#defineset_2bit(addr,bit,val)((viaddr)=((viaddr)&(~(3<<(bit))))|((val)<<(bit)))
#defineset_nbit(addr,bit,len,val)\
((viaddr)=(((viaddr)&(~((((1<<(len))-1))<<(bit))))|((val)<<(bit))))
#defineget_bit(addr,bit)(((viaddr)&(1<<(bit)))>0)
#defineget_val(addr,val)((val)=viaddr)
#defineread_val(addr)(vi(addr))
#defineset_val(addr,val)((viaddr)=(val))
#defineor_val(addr,val)((viaddr)|=(val))
/**********************************************/
typedefunsignedcharu8;
typedefunsignedshortu16;
typedefunsignedintu32;
//functiondeclare
intdelay(int);
#endif/*__COMMON_H*/
Sdram.c文件
#include"common.h"
#defineMEMCCMD 0x7e001004
#defineP1REFRESH 0x7e001010
#defineP1CASLAT 0x7e001014
#defineMEM_SYS_CFG 0x7e00f120
#defineP1MEMCFG 0x7e00100c
#defineP1T_DQSS 0x7e001018
#defineP1T_MRD 0x7e00101c
#defineP1T_RAS 0x7e001020
#defineP1T_RC 0x7e001024
#defineP1T_RCD 0x7e001028
#defineP1T_RFC 0x7e00102c
#defineP1T_RP 0x7e001030
#defineP1T_RRD 0x7e001034
#defineP1T_WR 0x7e001038
#defineP1T_WTR 0x7e00103c
#defineP1T_XP 0x7e001040
#defineP1T_XSR 0x7e001044
#defineP1T_ESR 0x7e001048
#defineP1MEMCFG2 0X7e00104c
#defineP1_chip_0_cfg 0x7e001200
#defineP1MEMSTAT 0x7e001000
#defineP1MEMCCMD 0x7e001004
#defineP1DIRECTCMD 0x7e001008
#defineHCLK 133000000
#definenstoclk(ns) (ns/(1000000000/HCLK)+1)
intsdram_init(void)
{
//telldramctoconfigure
set_val(MEMCCMD,0x4);
//设置refreshperiod
set_val(P1REFRESH,nstoclk(7800));
//设置时序
set_val(P1CASLAT,(3<<1));
set_val(P1T_DQSS,0x1); //0.75-1.25
set_val(P1T_MRD,0x2);
set_val(P1T_RAS,nstoclk(45));
set_val(P1T_RC,nstoclk(68));
u32trcd=nstoclk(23);
set_val(P1T_RCD,trcd|((trcd-3)<<3));
u32trfc=nstoclk(80);
set_val(P1T_RFC,trfc|((trfc-3)<<5));
u32trp=nstoclk(23);
set_val(P1T_RP,trp|((trp-3)<<3));
set_val(P1T_RRD,nstoclk(15));
set_val(P1T_WR,nstoclk(15));
set_val(P1T_WTR,0x7);
set_val(P1T_XP,0x2);
set_val(P1T_XSR,nstoclk(120));
set_val(P1T_ESR,nstoclk(120));
//设置memcfg
set_nbit(P1MEMCFG,0,3,0x2);/*10columnaddress*/
/*set_nbit:把从第bit位开始的一共len位消零,然后把这几位设为val*/
set_nbit(P1MEMCFG,3,3,0x2);/*13rowaddress*/
set_zero(P1MEMCFG,6); /*A10/AP*/
set_nbit(P1MEMCFG,15,3,0x2);/*Burst4*/
set_nbit(P1MEMCFG2,0,4,0x5);
set_2bit(P1MEMCFG2,6,0x1); /*32bit*/
set_nbit(P1MEMCFG2,8,3,0x3); /*MobileDDRSDRAM*/
set_2bit(P1MEMCFG2,11,0x1);
set_one(P1_chip_0_cfg,16); /*Bank-Row-Columnorganization*/
//memoryinit
set_val(P1DIRECTCMD,0xc0000);//NOP
set_val(P1DIRECTCMD,0x000); //precharge
set_val(P1DIRECTCMD,0x40000);//autorefresh
set_val(P1DIRECTCMD,0x40000);//autorefresh
set_val(P1DIRECTCMD,0xa0000);//EMRS
set_val(P1DIRECTCMD,0x80032);//MRS
set_val(MEM_SYS_CFG,0x0);
//设置内存控制器(dramc)状态为go
set_val(P1MEMCCMD,0x000);
//准备就绪
while(!((read_val(P1MEMSTAT)&0x3)==0x1));
}
Led.c
voiddelay(){
volatileinti=0x10000000;
while(i--);
}
intmain(){
inti=0;
volatileunsignedlong*gpkcon=(volatileunsignedlong*)0x7F008800;
volatileunsignedlong*gpkdat=(volatileunsignedlong*)0x7F008808;
*gpkcon=0x11110000;
while(1){
*gpkdat=i;
i++;
if(i==16)
i=0;
delay();
}
return0;
}
Led.lds文件
SECTIONS
{
.=0x50000000;
.text:
{
start.o
*(.text)
}
.=ALIGN(4);
.rodata:
{
*(.rodata)
}
.=ALIGN(4);
.data:
{
*(.data)
}
.=ALIGN(4);
bss_start=.;/*0x50000450*/
.bss:
{
*(.bss)/*i*/
*(.common)
}
bss_end=.;/*0x50000450*/
}
Makefile文件
led.bin:start.oclock.osdram.oled.o
arm-linux-ld-Tled.lds-oled.elf$^
arm-linux-objcopy-Obinaryled.elfled.bin
arm-linux-objdump-Dled.elf>led.dis
%.o:%.S
arm-linux-gcc-g-c-O2-o$@$^
%.o:%.c
arm-linux-gcc-g-c-O2-o$@$^
clean:
rm-f*.o*.bin*.elf*.dis
相关推荐
DDR2全称为Double Data Rate Second Generation SDRAM(双倍速率第二代同步动态随机存取内存),相较于第一代DDR,它在传输速率和能效方面有显著提升。以下是关于DDR2笔记本内存条工作原理及关键特性的详细解析。 1...
### 小梅哥FPGA学习笔记之Quartus II 15.0中仿真DDR2 IP核 #### 关键知识点: 1. **Quartus II 15.0简介** - Quartus II 15.0是Altera公司推出的FPGA/CPLD设计软件,支持从设计输入、综合、布局布线到仿真的全...
韦东山视频学习笔记 - U-boot 学习笔记 韦东山老师的 Linux 视频学习笔记,涵盖了 U-boot 的学习笔记,本节笔记将详细介绍 U-boot 的生成、配置、编译和烧写过程。 U-boot 生成 U-boot 是一个开源的 Bootloader ...
通过分析提供的DDR4内存条电路设计资料,学习者可以深入理解内存条的内部工作机制,提升自己的硬件设计技能。无论是为了改进现有设计,还是为了研发新的内存解决方案,这些资料都将提供宝贵的参考。
S5PV210(TQ210)学习笔记——内存配置(DDR2) S5PV210是三星电子生产的一款基于ARM Cortex-A8内核的处理器,主要应用于智能电子设备等领域。TQ210开发板则是搭载S5PV210处理器的一款开发平台。本文重点介绍的是关于...
这份“ARM2440学习笔记”无疑是为那些想要深入理解ARM体系结构和具体应用的初学者提供了一份宝贵的资源。下面,我们将根据标题和描述,结合可能涵盖的知识点进行详细的讲解。 1. **ARM9架构**:ARM9是ARM公司设计的...
在“DDR4内存条PCB.rar”压缩包中,我们可以找到关于DDR4内存条PCB的电路图和设计资料,这对于学习DDR4内存的内部构造和布线规则极具价值。电路图展示了各个组件之间的连接关系,而PCB设计则反映了信号路由和电源...
1. STM8L探索套件的学习笔记大致包含19个章节,涉及不同的开发主题。 2. 在学习STM8L探索套件之前,需要准备开发环境。文档提及了两种开发环境:IAR for STM8和官方的ST Visual Develop (STVD)。其中IAR for STM8的...
S5PV210学习笔记.pdf 本学习笔记主要介绍了S5PV210嵌入式系统的学习笔记,涵盖了嵌入式系统的基础知识、ARM架构、Linux系统、bootloader等方面的内容。 一、零碎的前提知识 1.1 IO 与内存统一编址和独立编址 在...
学习DDR3和DDR3L,不仅需要理解其基本原理,还要熟悉JESD79-3标准,这样才能确保设计出符合标准的内存系统。通过阅读和研究提供的PDF文档,你将能够深入理解DDR3和DDR3L的内部工作机制,包括如何优化信号完整性、...
这篇“主板学习笔记”显然是一份详细解释主板相关知识的文档,非常适合那些想要深入理解主板工作原理、故障排查以及维修技巧的人。 在计算机科学中,主板(也称为母板或系统板)是一个集成度极高的电路板,它为其他...
Uboot 学习笔记—s5pv210 Uboot 是一个开源的引导加载程序,广泛应用于嵌入式系统中。下面是 Uboot 的学习笔记,涵盖了 Uboot 的基本概念、配置、启动过程、环境变量、Makefile 等方面的知识点。 一、Uboot 的基本...
DDR2内存,全称为Double Data Rate Second Generation SDRAM(第二代双倍数据速率同步动态随机存取内存),是计算机硬件中的...通过学习DDR2内存应用技巧指南,你可以更加熟练地操作和调整内存,让电脑发挥出最佳性能。
Zynq学习笔记(基本设计流程) Zynq学习笔记是学习Zynq的基本设计流程的笔记,涵盖了Zynq的基本设计流程和相关的知识点。本笔记将指导读者如何使用Vivado2013.2设计工具来创建一个Zynq项目,包括创建一个新的项目、...
### DDR3 SDRAM标准解析 #### 一、概述 ...通过深入学习该标准,可以帮助工程师和技术人员更好地理解DDR3 SDRAM的核心原理,并在实际项目中合理选择和配置DDR3内存,从而提升系统的整体性能和用户体验。
计算机基础学习笔记中涵盖了计算机科学领域内的多个核心知识点。从处理器的发展历史到计算机硬件组件,再到操作系统与网络协议,本笔记对计算机科学的基础内容进行了广泛的涉及。 首先,笔记中提到了从ENIAC到...
### Zynq FSBL学习笔记 #### 一、Zynq FSBL简介 FSBL(First Stage Boot Loader),即第一阶段引导加载程序,是Xilinx Zynq SoC(System on Chip)启动过程中非常关键的一个环节。FSBL的主要职责是在系统上电后,...
本资料主要涵盖了DDR3内存的学习与调试中的关键参数,包括容量、封装和信号时序等方面。下面将详细阐述这些知识点。 1. **容量**:内存容量是指DDR3内存条能够存储的数据量,通常以MB或GB为单位。它由内存条上的...
DDR4 SODIMM条是现代计算机系统中广泛使用的内存模块类型,特别是在笔记本电脑和小型设备中。...通过深入研究这些文件,工程师可以学习如何实现高速、可靠的内存解决方案,同时确保数据的完整性和系统的稳定性。