|
我有1个板子,硬件已经调试好,不用怀疑,用的Lpc2478主芯片,外挂2MB的SDRAM,options里勾上RAM1(ADDR=0xA0000000,SIZE=0x200000),在启动代码不初始化,在系统启动后开始初始化SDRAM接口,可以测试SDRAM通过。但是把初始化内容放在启动代码里设置就不行,请教如何设置?
#include <LPC24xx.H>
#define INT32U unsigned long
#define uint8_t unsigned char
// 硬件端口定义:
// BEEP: P0.0
#define BEEP (1<<0)
#define BeepOFF() FIO0SET |= BEEP
#define BeepON() FIO0CLR |= BEEP
void delay_Ns (int idly)
{
int i;
for(; idly > 0; idly--) {
for (i = 0; i < 5000; i++);
}
}
void sysDelayNS(INT32U uiDly)
{
INT32U i;
for(; uiDly > 0; uiDly--){
for(i = 0; i < 5000; i++);
}
}
void SDRAMInit( void )
{
volatile INT32U i, dummy ;
LCD_CTRL = 0x00;
sysDelayNS(10);
PCONP |= 1 << 11;
/*
* 使能SDRAM总线连接
*/
#if 0
PINSEL4 |= 0x50000000;//SRAM(CS2,CS3)
PINSEL5 |= 0x05010555;//SDRAM(CS0,CS1)
PINSEL6 |= 0x55555555;//D0~D15
PINSEL8 |= 0x15555555;//A0~A15
PINSEL9 |= 0x50550000;//A16~A23 , /OE , /WE , BLS0 , BLS1 , /CS0 , /CS1;
EMC_CTRL = 0x00000001; /* Disable Address mirror */
#else
//原程序
PINSEL4 |= 0x50000000;//SRAM(CS2,CS3)
PINSEL5 |= 0x05050555;//SDRAM(CS0,CS1)
PINSEL6 |= 0x55555555;//D0~D15
PINSEL8 |= 0x55555555;//A0~A15
PINSEL9 |= 0x50555555;//A16~A23 , /OE , /WE , BLS0 , BLS1 , /CS0 , /CS1;
EMC_CTRL = 0x00000001; /* Disable Address mirror */
#endif
/*
* 设置SDRAM访问时序.
*/
EMC_DYN_RP = 1;
EMC_DYN_RAS = 2;
EMC_DYN_SREX = 1;
EMC_DYN_APR = 1;
EMC_DYN_DAL = 5;
EMC_DYN_WR = 2;
EMC_DYN_RC = 3;
EMC_DYN_RFC = 3;
EMC_DYN_XSR = 5;
EMC_DYN_RRD = 1;
EMC_DYN_MRD = 2;
EMC_DYN_RD_CFG = 1; /* Command delayed strategy */
/*
* Default setting,
* RAS latency 3 CCLKs,
* CAS latenty 3 CCLKs.
*/
EMC_DYN_RASCAS0 = 0x00000303;
/*
* 64MB, 1Mx16,
* 4 banks, row=12,
* column=8
*/
EMC_DYN_CFG0 = 0x00000280;
for (i = 0; i < 0x80; i++) {
}
/*
* Mem clock enable,
* CLKOUT runs, send command:
* NOP
*/
EMC_DYN_CTRL = 0x00000183;
for (i = 0; i < 0x80; i++) {
}
/*
* Send command:
* PRECHARGE-ALL,
* shortest possible refresh period
*/
EMC_DYN_CTRL = 0x00000103;
for (i = 0; i < 0x80; i++) {
}
/*
* set 32 CCLKs
* between SDRAM refresh
* cycles
*/
EMC_DYN_RFSH = 0x00000004;
for (i = 0; i < 0x80; i++) { /* wait 128 AHB clock cycles */
}
/*
* set 45 x 16CCLKs=720CCLK=15us
* between SDRAM refresh
* cycles
*/
EMC_DYN_RFSH = 45;
/*
* To set mode register in SDRAM,
* enter mode by issue MODE command, after finishing,
* bailout and back to NORMAL mode.
* Mem clock enable, CLKOUT runs, send command: MODE
*/
EMC_DYN_CTRL = 0x00000083;
dummy = *((volatile int *)(0xA0019800));
EMC_DYN_CTRL = 0x00000000; /* Send command: NORMAL */
EMC_DYN_CFG0 = 0x00080280; /* Enable buffer */
for (i = 0; i < 0x80; i++) {
}
}
#define TEST_ADDR 0xA011FF00 /* 测试起始地址 */
#define SIZE 100 /* 测试100个SDRAM空间 */
int main(void)
{
INT32U i;
uint8_t * p_uint8_t = (uint8_t *)TEST_ADDR;
PINSEL0 = 0x00;
SCS |= 0x01;
FIO0DIR |= BEEP;
BeepON();
delay_Ns(100);
BeepOFF();
SDRAMInit(); // 启动代码里的设置和这里是一样的值。
// 测试SDRAM连接是否正常
p_uint8_t = (uint8_t *)TEST_ADDR;
for (i=0;i < SIZE;i++)
*p_uint8_t++ = (uint8_t)i;
p_uint8_t = (uint8_t *)TEST_ADDR;
for(i=0; i<SIZE; i++)
{
if( *p_uint8_t != (uint8_t)i )
{
while(1);
}
p_uint8_t++;
}
// end
while(1) {
BeepON();
delay_Ns(500);
BeepOFF();
delay_Ns(500);
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|