`

DDR学习笔记

 
阅读更多

DDR

15条地址线32k

128M*2(20)=2(27)

 

 

 

查看6410芯片手册;

5.4.3DDR/MOBILEDDRSDRAMINITIALIZATIONSEQUENCE

Programmem_cmdindirect_cmdto2b10,whichmakesDRAMControllerissueNOPmemorycommand.

Programmem_cmdindirect_cmdto2b00,whichmakesDRAMControllerissuePrechargeallmemory

command.

Programmem_cmdindirect_cmdto2b11,whichmakesDRAMControllerissueAutorefreshmemory

command.

Programmem_cmdindirect_cmdto2b11,whichmakesDRAMControllerissueAutorefreshmemory

command.

Programmem_cmdto2b10indirect_cmd,whichmakesDRAMControllerissueMRSmemorycommand

BankaddressforEMRSmustbeset.

Programmem_cmdto2b10indirect_cmd,whichmakesDRAMControllerissueMRSmemorycommand.

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笔记本内存条的原理图

    DDR2全称为Double Data Rate Second Generation SDRAM(双倍速率第二代同步动态随机存取内存),相较于第一代DDR,它在传输速率和能效方面有显著提升。以下是关于DDR2笔记本内存条工作原理及关键特性的详细解析。 1...

    小梅哥FPGA学习笔记之Quartus II 15.0中仿真DDR2 IP核.pdf

    ### 小梅哥FPGA学习笔记之Quartus II 15.0中仿真DDR2 IP核 #### 关键知识点: 1. **Quartus II 15.0简介** - Quartus II 15.0是Altera公司推出的FPGA/CPLD设计软件,支持从设计输入、综合、布局布线到仿真的全...

    DDR4内存条PCB.rar

    在“DDR4内存条PCB.rar”压缩包中,我们可以找到关于DDR4内存条PCB的电路图和设计资料,这对于学习DDR4内存的内部构造和布线规则极具价值。电路图展示了各个组件之间的连接关系,而PCB设计则反映了信号路由和电源...

    韦东山视频学习笔记

    韦东山视频学习笔记 - U-boot 学习笔记 韦东山老师的 Linux 视频学习笔记,涵盖了 U-boot 的学习笔记,本节笔记将详细介绍 U-boot 的生成、配置、编译和烧写过程。 U-boot 生成 U-boot 是一个开源的 Bootloader ...

    电脑DDR4内存条电路设计资料 包含原理图及PCB

    通过分析提供的DDR4内存条电路设计资料,学习者可以深入理解内存条的内部工作机制,提升自己的硬件设计技能。无论是为了改进现有设计,还是为了研发新的内存解决方案,这些资料都将提供宝贵的参考。

    S5PV210(TQ210)学习笔记——内存配置(DDR2)

    S5PV210(TQ210)学习笔记——内存配置(DDR2) S5PV210是三星电子生产的一款基于ARM Cortex-A8内核的处理器,主要应用于智能电子设备等领域。TQ210开发板则是搭载S5PV210处理器的一款开发平台。本文重点介绍的是关于...

    ARM2440学习笔记

    这份“ARM2440学习笔记”无疑是为那些想要深入理解ARM体系结构和具体应用的初学者提供了一份宝贵的资源。下面,我们将根据标题和描述,结合可能涵盖的知识点进行详细的讲解。 1. **ARM9架构**:ARM9是ARM公司设计的...

    STM8L探索套件学习笔记.pdf

    1. STM8L探索套件的学习笔记大致包含19个章节,涉及不同的开发主题。 2. 在学习STM8L探索套件之前,需要准备开发环境。文档提及了两种开发环境:IAR for STM8和官方的ST Visual Develop (STVD)。其中IAR for STM8的...

    S5PV210学习笔记.pdf

    S5PV210学习笔记.pdf 本学习笔记主要介绍了S5PV210嵌入式系统的学习笔记,涵盖了嵌入式系统的基础知识、ARM架构、Linux系统、bootloader等方面的内容。 一、零碎的前提知识 1.1 IO 与内存统一编址和独立编址 在...

    DDR3相关资源,包括DDR3L. JESD79-3

    学习DDR3和DDR3L,不仅需要理解其基本原理,还要熟悉JESD79-3标准,这样才能确保设计出符合标准的内存系统。通过阅读和研究提供的PDF文档,你将能够深入理解DDR3和DDR3L的内部工作机制,包括如何优化信号完整性、...

    主板学习笔记

    这篇“主板学习笔记”显然是一份详细解释主板相关知识的文档,非常适合那些想要深入理解主板工作原理、故障排查以及维修技巧的人。 在计算机科学中,主板(也称为母板或系统板)是一个集成度极高的电路板,它为其他...

    uboot学习笔记—s5pv210

    Uboot 学习笔记—s5pv210 Uboot 是一个开源的引导加载程序,广泛应用于嵌入式系统中。下面是 Uboot 的学习笔记,涵盖了 Uboot 的基本概念、配置、启动过程、环境变量、Makefile 等方面的知识点。 一、Uboot 的基本...

    DDR2内存应用技巧指南

    DDR2内存,全称为Double Data Rate Second Generation SDRAM(第二代双倍数据速率同步动态随机存取内存),是计算机硬件中的...通过学习DDR2内存应用技巧指南,你可以更加熟练地操作和调整内存,让电脑发挥出最佳性能。

    Zynq学习笔记(基本设计流程)

    Zynq学习笔记(基本设计流程) Zynq学习笔记是学习Zynq的基本设计流程的笔记,涵盖了Zynq的基本设计流程和相关的知识点。本笔记将指导读者如何使用Vivado2013.2设计工具来创建一个Zynq项目,包括创建一个新的项目、...

    DDR3 SDRAM Standard(DDR3设计规范)

    ### DDR3 SDRAM标准解析 #### 一、概述 ...通过深入学习该标准,可以帮助工程师和技术人员更好地理解DDR3 SDRAM的核心原理,并在实际项目中合理选择和配置DDR3内存,从而提升系统的整体性能和用户体验。

    计算机基础学习笔记.pdf

    计算机基础学习笔记中涵盖了计算机科学领域内的多个核心知识点。从处理器的发展历史到计算机硬件组件,再到操作系统与网络协议,本笔记对计算机科学的基础内容进行了广泛的涉及。 首先,笔记中提到了从ENIAC到...

    zynq fsbl 学习笔记

    ### Zynq FSBL学习笔记 #### 一、Zynq FSBL简介 FSBL(First Stage Boot Loader),即第一阶段引导加载程序,是Xilinx Zynq SoC(System on Chip)启动过程中非常关键的一个环节。FSBL的主要职责是在系统上电后,...

    DDR4 SODIMM条参考设计文件(with-ECC)

    DDR4 SODIMM条是现代计算机系统中广泛使用的内存模块类型,特别是在笔记本电脑和小型设备中。...通过深入研究这些文件,工程师可以学习如何实现高速、可靠的内存解决方案,同时确保数据的完整性和系统的稳定性。

    DDR3 SODIMM 204脚 mentor 封装

    DDR3 SODIMM,全称为Double Data Rate Third Generation Small Outline ...而"mentor_sodimm"这个压缩包文件很可能包含了关于这种封装技术的详细设计资料,对于学习和研究DDR3 SODIMM的硬件设计者来说是宝贵的资源。

Global site tag (gtag.js) - Google Analytics