本章总结三点
- 看门狗
- 汇编初始化C语言环境-栈
- 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:4bankSDRAM初始化
* 接线图 如下,
可知两个内存端口,分别是
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]