嵌入式爱好者

嵌入式爱好者 门户 知识库 查看内容

i.MX RT105X如何使用外部SDRAM

2018-5-31 17:44| 发布者: zzzppp| 查看: 742| 评论: 0

类目:  >  知识库     文档编号: 193

很多时候,芯片内部RAM空间不够的时候,需要用到SDRAM正常情况下,CPU一上电,内部RAM就已经初始化好了,而对于外部的SDRAM则需要先初始化RT105XSDRAM控制器(SEMC),才能向SDRAM可寻址空间copy数据。

1、一般情况下,SDRAM初始化代码存储在dcd_sdram[]数组中,boot ROM code在进入_main之前已经调用了dcd码,即已经初始化了sdram。问题就出在这个dcd码上,不同型号的sdram芯片,初始化过程也是不同的,dcd码当然也就不同,所以,为了适配自己的板子,需要更改官方板子对应sdram初始化dcd码,即将自己板子上的sdram型号对应的dcd码替换原来dcd码。前面已经说了,所谓的dcd码不过是由sdram初始化代码转化成的一堆16进制数据组成的数组。所以,我们要想完成dcd码覆盖工作,就需要先将sdram初始化代码转化为dcd码数组,使用工具dcdgen.exe即可完成转化。

2、如果没有dcdgen.exe工具,还有另一种简单的方法达到初始化SDRAM的目的。

打开系统工程中startup_MIMXRT1052.s文件,找到如下代码:

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  SystemInit
                IMPORT  __main
                CPSID   I               ; Mask interrupts
                LDR     R0, =0xE000ED08
                LDR     R1, =__Vectors
                STR     R1, [R0]
                LDR     R2, [R1]
                MSR     MSP, R2
                LDR     R0, =SystemInit
                BLX     R0
                CPSIE   i               ; Unmask interrupts
                LDR     R0, =__main
                BX      R0
                ENDP

由此可以看到,在进入_main之前,有个SystemInit函数,我们只需将初始化SDRAM的代码,放进SystemInit函数末尾,让boot ROM code进入_main之前,进行sdram初始化。这个SystemInit函数存在于startup_MIMXRT1052.c文件中。

如下在SystemInit末尾添加SDRAM_Init()函数


  SystemInitHook();
 /////////////////////////add by zzzppp//////////////////////////// 
  #ifdef SDRAM_INIT
   SDRAM_Init();
   #endif
  /////////////////////////////////////////////////////////////////
}

这样,即使boot ROM code提前执行了错误的SDRAM初始化dcd码也没关系,因为在系统初始化结束时(SystemInit函数末尾),又一次执行了正确的SDRAM。


已解决

未解决

只是看看

最新评论

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-11-25 20:48

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

返回顶部