过年来的这一个月,都是在整着启动文件啊,SDRam初始化啊,Nor Flash初始化啊,还有程序在SDRAM中运行等一干事情。
今天就记录一下,我初始化SDRam过程中所学到的东西以及一些体会。本人还属于菜鸟,有什么讲得不好的地方,还希望指正指正哈。也是为了以后不会温习之用。
虽然手里有一些样例程序,但是真正理解起来还是很费劲。
开发板:LPC1788,SDRAM:HY57V561620,据说已经停产了~~~~ SDRAM大概都步骤都相同,只是有些芯片具体的参数需要查阅资料才能填写。
初始化SDRAM的基本步骤:
1. 初始化引脚,PCONP,EMCDLYCTL,EMCControl寄存器,以及一些与芯片相关的参数,还有EMCDynamicConfig0.
2. SDRAM上电后,等待100us或是200us,期间可以发送NOP命令。
3. 对所有banks预充电,PALL。
4. 执行8次预充电:给EMCDynamicRefresh赋值,然后延时一段时间,令其有8次self-refresh的时间。(自己的理解)
5. 延时完毕后,对EMCDynamicRefresh寄存器赋值。对刷新寄存器的赋值如下:
6. 设置模式寄存器Mode Register。以虚读的方式对其进行赋值。如下:
*(INT32U*) EMCDynamicControl = 0x00000083;
dummy = *((volatile INT32U*)( DynamicMemoryBaseAddr|(0x23 << 13)));
至今还没完全明白为什么0x23<<13?
7. 最后设置Normal 并延时一段时间。
这样就差不多大功告成了。
在验证SDRAM是否设置正确的过程遇到一些麻烦。
1. 引脚没有全部初始化完全。导致对SDRAM赋值的过程中,有一部分值不能被赋值上。
2. *(INT16U*)Addr++,这个过程中,如果Addr的初始值是0xA0000000的话,Addr就变成0xA0000002.
同理,*(INT32U*)Addr++,这个过程中,如果Addr的初始值是0xA0000000的话,Addr就变成0xA0000004.
3. 先是对SDRAM赋值0,然后再对其赋值。
for(i = 0; i < (SDRam_Size/4); i++)
{
*SDRamAdd8++ = 0x11;
*SDRamAdd8++ = 0x22;
*SDRamAdd8++ = 0x33;
*SDRamAdd8++ = 0x44;
}
for(i = 0; i < (SDRam_Size/4); i++)
{
SDRamAdd32--;
if( *(SDRamAdd32) != 0x44332211)
{
str = "Initialization of 8bits SDRam is wrong!";
putchars(str);
}
}
在对其进行16bits的赋值再次验证一下就可以了。
上一篇:coocox学习系列之CoX_GPIO篇
下一篇:中断向量表放在片内RAM中
推荐阅读最新更新时间:2024-03-16 13:50