很多时候,芯片内部RAM空间不够的时候,需要用到SDRAM。正常情况下,CPU一上电,内部RAM就已经初始化好了,而对于外部的SDRAM,则需要先初始化RT105X的SDRAM控制器(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(); 这样,即使boot ROM code提前执行了错误的SDRAM初始化dcd码也没关系,因为在系统初始化结束时(SystemInit函数末尾),又一次执行了正确的SDRAM。 |
|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )
GMT+8, 2024-11-25 20:48
Powered by Discuz! X3.4
© 2001-2013 Comsenz Inc.