【篇三】SDRM-内存学习和总结

本章总结三点

  1. 看门狗
  2. 汇编初始化C语言环境-栈
  3. SDRM的引入和初始化

   看门狗:

  说明:是一个硬件,内部的定时器,类似于闹钟,
    特点:每隔一定的周期,需要系统软件去喂狗,没有的话,就会强制自动复位系统,是Soc内部的一个外设
   原理图:


     

   看门狗关闭:设置 寄存器 WTCON 0xE270_0000位为0


        
       

汇编调用C语言
     1:汇编设置栈,因为c语言运行时需要一定的条件:栈,这个需要由汇编来提供和设置,然后c语言才能运行
     2:  CPU模式和各模式下的栈
         * 在ARM37各寄存器中,每个模式下都有自己独立的SP寄存器(r13),为什么这么设计?
         * 如果每个模式都用同一个sp,那就意味着真个程序(操作系统,应用程序)都是一个栈,这样程序栈溢出,导致系统崩              溃
         * 系统在复位后或者启动后,默认是SVC模式,我们只需要设置或进入SVC模式下,操作SP,并设置栈即可
     3:设置SVC栈
         * 必须是当前可以访问的一段内存,当CPU刚复位,外部的DRRAM尚未初始化,,目前可用的内存只有内部的SRAM(因为它不需要初始化即可使用)
         * 栈有四种:满减栈,满增栈,空减栈,空增栈、ATPCS规定使用满减栈 
         * 原理图如下可知,三星推荐的地址是 0xD003_7D80


         * 代码  ldr sp = 0xD0037D80 ,从这之后调用c程序了

 

SDRAM的引入
    * SDRAM: Syncronized Dynamic Ramdam Access Memory 同步动态随机存储器
    *  DDR:  DDR SDRAM 是SDRAM的升级版,
    * 特点:容量大,价格低,需要运行一段初始代码后才能使用,不想SRAM上电就可以直接使用
    * K4T1G164QE
        K:表示三星产品     4:DRAM   T: 产品代码     1G: 容量
        16: 单芯片是16位宽的      4:4bank

SDRAM初始化
    * 接线图 如下,

       可知两个内存端口,分别是
        DRAM0(对应引脚 Xm1_xxxx) 
        DRAM1(对应引脚 Xm2_xxxx)
        有三类总线构成:地址总线(Xmn_ADDR0 ~ Xmn_ADDR13),命令总线、和数据总线(Xm2DATA0 ~ Xm2DATA31)
    * 对应的寄存器文档地址 05_memory, 关键寄存器 
        MemControl   
        MemConfig   参数设置寄存器 
        DirectCmd    命令寄存器,通过像寄存器写值,像DDR芯片发送命令(通过命令总线),这些命令都是配置DDR芯片工作参数

    * S5pv210 如图: 


        可知:内存映射地址为  
         DRAM0: 0x2000_0000 至  0x3FFF_FFFF 
         DRAM1: 0x4000_0000 至  0x7FFF_FFFF
    * SDRM结构框图  


        可知:128Mb * 8bank(块) 组成
        每个bank通过 row Address(14位) 和 clomun Address(10位)寻址, 一共能寻址范围 2的14次方 + 2的10次方 = 2的24次方,对应16MB(128Mbit)
    * 结论 
        真个210设计的最多内存为1.5G, 我们开发板实际只有512MB内存,我们可以在DRAM0和 DRAM1个配置256MB
        合法地址即是:0x2000_0000 ~ 0x2FFF_FFFF (256MB)
                   0x4000_0000 ~ 0x4FFF_FFFF(256MB)
    * 代码: 使用原厂提供的已经初始化的    

ldr	r1, =0x0FFF2010				@ConControl auto refresh off
	str	r1, [r0, #DMC_CONCONTROL]

	ldr	r1, =DMC0_MEMCONTROL			@MemControl BL=4, 1 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off
	str	r1, [r0, #DMC_MEMCONTROL]
	
	ldr	r1, =DMC0_MEMCONFIG_0			@MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
	str	r1, [r0, #DMC_MEMCONFIG0]

	ldr	r1, =DMC0_MEMCONFIG_1			@MemConfig1
	str	r1, [r0, #DMC_MEMCONFIG1]

	ldr	r1, =0xFF000000				@PrechConfig
	str	r1, [r0, #DMC_PRECHCONFIG]
	
	ldr	r1, =DMC0_TIMINGA_REF			@TimingAref	7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4E)
	str	r1, [r0, #DMC_TIMINGAREF]
	
	ldr	r1, =DMC0_TIMING_ROW			@TimingRow	for @200MHz
	str	r1, [r0, #DMC_TIMINGROW]

	ldr	r1, =DMC0_TIMING_DATA			@TimingData	CL=3
	str	r1, [r0, #DMC_TIMINGDATA]
	
	ldr	r1, =DMC0_TIMING_PWR			@TimingPower
	str	r1, [r0, #DMC_TIMINGPOWER]

	ldr	r1, =0x07000000				@DirectCmd	chip0 Deselect
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x01000000				@DirectCmd	chip0 PALL
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x00020000				@DirectCmd	chip0 EMRS2
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x00030000				@DirectCmd	chip0 EMRS3
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x00010400				@DirectCmd	chip0 EMRS1 (MEM DLL on, DQS# disable)
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x00000542				@DirectCmd	chip0 MRS (MEM DLL reset) CL=4, BL=4
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x01000000				@DirectCmd	chip0 PALL
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x05000000				@DirectCmd	chip0 REFA
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x05000000				@DirectCmd	chip0 REFA
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x00000442				@DirectCmd	chip0 MRS (MEM DLL unreset)
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x00010780				@DirectCmd	chip0 EMRS1 (OCD default)
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x00010400				@DirectCmd	chip0 EMRS1 (OCD exit)
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x07100000				@DirectCmd	chip1 Deselect
	str	r1, [r0, #DMC_DIRECTCMD]

	ldr	r1, =0x01100000				@DirectCmd	chip1 PALL
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x00120000				@DirectCmd	chip1 EMRS2
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x00130000				@DirectCmd	chip1 EMRS3
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x00110400				@DirectCmd	chip1 EMRS1 (MEM DLL on, DQS# disable)
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x00100542				@DirectCmd	chip1 MRS (MEM DLL reset) CL=4, BL=4
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x01100000				@DirectCmd	chip1 PALL
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x05100000				@DirectCmd	chip1 REFA
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x05100000				@DirectCmd	chip1 REFA
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x00100442				@DirectCmd	chip1 MRS (MEM DLL unreset)
	str	r1, [r0, #DMC_DIRECTCMD]
	
	ldr	r1, =0x00110780				@DirectCmd	chip1 EMRS1 (OCD default)
	str	r1, [r0, #DMC_DIRECTCMD]
		
	ldr	r1, =0x00110400				@DirectCmd	chip1 EMRS1 (OCD exit)
	str	r1, [r0, #DMC_DIRECTCMD]
		
	ldr	r1, =0x0FF02030				@ConControl	auto refresh on
	str	r1, [r0, #DMC_CONCONTROL]
		
	ldr	r1, =0xFFFF00FF				@PwrdnConfig
	str	r1, [r0, #DMC_PWRDNCONFIG]
		
	ldr	r1, =0x00202400				@MemControl	BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off
	str	r1, [r0, #DMC_MEMCONTROL]


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源14

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值