<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>LPC Microcontrollers中的主题 SDRAM fails after initialization from startup</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/SDRAM-fails-after-initialization-from-startup/m-p/584965#M21147</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Alastair on Mon Nov 23 02:22:57 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I am using IS42S16400J(@102MHz) as my external RAM with LPC4357(@204MHz).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I need to initialization my external RAM within startup code as one of my libraries has data area within it. Also the initialization of many library variables is done in the same data space.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am using the following code to boot my RAM from startup&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;/***********************************************************************
#include "SDRAM.h"
#include "lpc43xx_cgu.h"
#include "lpc43xx_scu.h"
#include "lpc43xx_gpio.h"
#include "lpc43xx_timer.h"

/************************** PRIVATE DEFINITIONS *************************/
/* SDRAM Address Base for DYCS0*/
#define SDRAM_ADDR_BASE0x28000000

/* SDRAM refresh time to 16 clock num */
#define EMC_SDRAM_REFRESH(freq,time)&amp;nbsp; \
&amp;nbsp; (((uint64_t)((uint64_t)time * freq)/16000000000ull)+1)

/*-------------------------PRIVATE FUNCTIONS------------------------------*/
/*********************************************************************
 * @briefCalculate EMC Clock from nano second
 * @param[in]freq - frequency of EMC Clk
 * @param[in]time - nano second
 * @return None
 **********************************************************************/
uint32_t NS2CLK(uint32_t freq,uint32_t time){
 return (((uint64_t)time*freq/1000000000));
}

#define CLK0_DELAY 7
/*********************************************************************
 * @briefInit the EMC Controller to connect ex SDRAM
 * @param[in]None
 * @return None
 **********************************************************************/
void SDRAM_Init1(void) 
{
uint32_t pclk, temp;
uint64_t tmpclk;
TIM_TIMERCFG_Type TIM_ConfigStruct;

/* Set up EMC pin */
{
scu_pinmux(1,0,MD_PLN_FAST,2);//A5
scu_pinmux(1,1,MD_PLN_FAST,2);//A6
scu_pinmux(1,2,MD_PLN_FAST,2);//A7
//scu_pinmux(1,3,MD_PLN_FAST,3);//OE
//scu_pinmux(1,4,MD_PLN_FAST,3);//BLS0
//scu_pinmux(1,5,MD_PLN_FAST,3);//CS0
scu_pinmux(1,6,MD_PLN_FAST,3);//WE
scu_pinmux(1,7,MD_PLN_FAST,3);//D0
scu_pinmux(1,8,MD_PLN_FAST,3);//D1
scu_pinmux(1,9,MD_PLN_FAST,3);//D2
scu_pinmux(1,10,MD_PLN_FAST,3);//D3
scu_pinmux(1,11,MD_PLN_FAST,3);//D4
scu_pinmux(1,12,MD_PLN_FAST,3);//D5
scu_pinmux(1,13,MD_PLN_FAST,3);//D6
scu_pinmux(1,14,MD_PLN_FAST,3);//D7
scu_pinmux(2,0,MD_PLN_FAST,2);//A13
scu_pinmux(2,1,MD_PLN_FAST,2);//A12
scu_pinmux(2,2,MD_PLN_FAST,2);//A11
scu_pinmux(2,6,MD_PLN_FAST,2);//A10
scu_pinmux(2,7,MD_PLN_FAST,3);//A9
scu_pinmux(2,8,MD_PLN_FAST,3);//A8
scu_pinmux(2,9,MD_PLN_FAST,3);//A0
scu_pinmux(2,10,MD_PLN_FAST,3);//A1
scu_pinmux(2,11,MD_PLN_FAST,3);//A2
scu_pinmux(2,12,MD_PLN_FAST,3);//A3
scu_pinmux(2,13,MD_PLN_FAST,3);//A4
scu_pinmux(5,0,MD_PLN_FAST,2);//D12
scu_pinmux(5,1,MD_PLN_FAST,2);//D13
scu_pinmux(5,2,MD_PLN_FAST,2);//D14
scu_pinmux(5,3,MD_PLN_FAST,2);//D15
scu_pinmux(5,4,MD_PLN_FAST,2);//D8
scu_pinmux(5,5,MD_PLN_FAST,2);//D9
scu_pinmux(5,6,MD_PLN_FAST,2);//D10
scu_pinmux(5,7,MD_PLN_FAST,2);//D11
//scu_pinmux(6,3,MD_PLN_FAST,3);//CS1
scu_pinmux(6,4,MD_PLN_FAST,3);//CAS
scu_pinmux(6,5,MD_PLN_FAST,3);//RAS
//scu_pinmux(6,6,MD_PLN_FAST,1);//A15
scu_pinmux(6,7,MD_PLN_FAST,1);//A15
scu_pinmux(6,8,MD_PLN_FAST,1);//A14
scu_pinmux(6,9,MD_PLN_FAST,3);//DYCS0
scu_pinmux(6,10,MD_PLN_FAST,3);//DQMOUT1
scu_pinmux(6,11,MD_PLN_FAST,3);//CKEOUT0
scu_pinmux(6,12,MD_PLN_FAST,3);//DQMOUT0
//scu_pinmux(10,4,MD_PLN_FAST,3);
//scu_pinmux(13,0,MD_PLN_FAST,2);
//scu_pinmux(13,2,MD_PLN_FAST,2);
//scu_pinmux(13,3,MD_PLN_FAST,2);
//scu_pinmux(13,4,MD_PLN_FAST,2);
//scu_pinmux(13,5,MD_PLN_FAST,2);
//scu_pinmux(13,6,MD_PLN_FAST,2);
//scu_pinmux(13,7,MD_PLN_FAST,2);
//scu_pinmux(13,8,MD_PLN_FAST,2);
//scu_pinmux(13,9,MD_PLN_FAST,2);
//scu_pinmux(13,10,MD_PLN_FAST,2);
//scu_pinmux(13,12,MD_PLN_FAST,2);
//scu_pinmux(13,13,MD_PLN_FAST,2);
//scu_pinmux(13,15,MD_PLN_FAST,2);
//scu_pinmux(13,16,MD_PLN_FAST,2);
//scu_pinmux(14,0,MD_PLN_FAST,3);
//scu_pinmux(14,1,MD_PLN_FAST,3);
//scu_pinmux(14,2,MD_PLN_FAST,3);
//scu_pinmux(14,3,MD_PLN_FAST,3);
//scu_pinmux(14,4,MD_PLN_FAST,3);
//scu_pinmux(14,5,MD_PLN_FAST,3);
//scu_pinmux(14,6,MD_PLN_FAST,3);
//scu_pinmux(14,7,MD_PLN_FAST,3);
//scu_pinmux(14,8,MD_PLN_FAST,3);
//scu_pinmux(14,9,MD_PLN_FAST,3);
//scu_pinmux(14,10,MD_PLN_FAST,3);
//scu_pinmux(14,11,MD_PLN_FAST,3);
//scu_pinmux(14,12,MD_PLN_FAST,3);
//scu_pinmux(14,13,MD_PLN_FAST,3);
}

// Setup EMC delays 
&amp;nbsp; LPC_SCU-&amp;gt;EMCDELAYCLK = ((CLK0_DELAY) | (CLK0_DELAY &amp;lt;&amp;lt; 4) | (CLK0_DELAY &amp;lt;&amp;lt; 8) | (CLK0_DELAY &amp;lt;&amp;lt; 12));

&amp;nbsp; // EMC clock is half of CGU_BASE_M4 if CGU_BASE_M4 is &amp;gt;104 MHz 
&amp;nbsp; if (SystemCoreClock &amp;gt; 104000000)
&amp;nbsp; {
LPC_CCU1-&amp;gt;CLK_M4_EMCDIV_CFG = ( (1&amp;lt;&amp;lt;0) | (1&amp;lt;&amp;lt;1) | (1&amp;lt;&amp;lt;2) | (1&amp;lt;&amp;lt;5) );
LPC_CREG-&amp;gt;CREG6 |= (1&amp;lt;&amp;lt;16);
&amp;nbsp; }
&amp;nbsp; else
&amp;nbsp; {
LPC_CCU1-&amp;gt;CLK_M4_EMCDIV_CFG = ( (1&amp;lt;&amp;lt;0) | (1&amp;lt;&amp;lt;1) | (1&amp;lt;&amp;lt;2) | (0&amp;lt;&amp;lt;5) );
LPC_CREG-&amp;gt;CREG6 &amp;amp;= ~(1&amp;lt;&amp;lt;16);
&amp;nbsp; }

/* Select EMC clock-out */
LPC_SCU-&amp;gt;SFSCLK_0 = MD_PLN_FAST;
LPC_SCU-&amp;gt;SFSCLK_1 = MD_PLN_FAST;
LPC_SCU-&amp;gt;SFSCLK_2 = MD_PLN_FAST;
LPC_SCU-&amp;gt;SFSCLK_3 = MD_PLN_FAST;

TIM_ConfigStruct.PrescaleOption = TIM_PRESCALE_USVAL;
TIM_ConfigStruct.PrescaleValue= 1;

// Set configuration for Tim_config and Tim_MatchConfig
TIM_Init(LPC_TIMER0, TIM_TIMER_MODE,&amp;amp;TIM_ConfigStruct);

LPC_EMC-&amp;gt;CONTROL = 0x00000001;
LPC_EMC-&amp;gt;CONFIG&amp;nbsp; = 0x00000000;
LPC_EMC-&amp;gt;DYNAMICCONFIG0&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0&amp;lt;&amp;lt;14 | 1&amp;lt;&amp;lt;9 | 1&amp;lt;&amp;lt;7; /* 64Mb, 4Mx16, 4 banks, row=12, column=8 */

pclk = CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE);

LPC_EMC-&amp;gt;DYNAMICRASCAS0&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000303; /* 1 RAS, 3 CAS latency */
LPC_EMC-&amp;gt;DYNAMICREADCONFIG = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */

LPC_EMC-&amp;gt;DYNAMICRP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 20);
LPC_EMC-&amp;gt;DYNAMICRAS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 42);
LPC_EMC-&amp;gt;DYNAMICSREX&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 63);
LPC_EMC-&amp;gt;DYNAMICAPR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000005;
LPC_EMC-&amp;gt;DYNAMICDAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000005;
LPC_EMC-&amp;gt;DYNAMICWR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2;
LPC_EMC-&amp;gt;DYNAMICRC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 63);
LPC_EMC-&amp;gt;DYNAMICRFC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 63);
LPC_EMC-&amp;gt;DYNAMICXSR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 63);
LPC_EMC-&amp;gt;DYNAMICRRD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 14);
LPC_EMC-&amp;gt;DYNAMICMRD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000002;

TIM_Waitus(100);&amp;nbsp;&amp;nbsp; /* wait 100ms */
LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000183; /* Issue NOP command */

TIM_Waitus(200);&amp;nbsp;&amp;nbsp; /* wait 200ms */
LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000103; /* Issue PALL command */

LPC_EMC-&amp;gt;DYNAMICREFRESH&amp;nbsp;&amp;nbsp;&amp;nbsp; = EMC_SDRAM_REFRESH(pclk,70); /* ( n * 16 ) -&amp;gt; 32 clock cycles */

//for(i = 0; i &amp;lt; 0x80; i++);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wait 128 AHB clock cycles */
TIM_Waitus(200);&amp;nbsp;&amp;nbsp; /* wait 200ms */

tmpclk = (uint64_t)15625*(uint64_t)pclk/1000000000/16;
LPC_EMC-&amp;gt;DYNAMICREFRESH&amp;nbsp;&amp;nbsp;&amp;nbsp; = tmpclk; /* ( n * 16 ) -&amp;gt; 736 clock cycles -&amp;gt; 15.330uS at 48MHz &amp;lt;= 15.625uS ( 64ms / 4096 row ) */

LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000083; /* Issue MODE command */

//Timing for 48/60/72MHZ Bus
temp = *((volatile uint32_t *)(SDRAM_ADDR_BASE | (3&amp;lt;&amp;lt;4| 3)&amp;lt;&amp;lt;11)); /* 4 burst, 3 CAS latency */
temp = temp;
LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000000; /* Issue NORMAL command */

//[re]enable buffers
LPC_EMC-&amp;gt;DYNAMICCONFIG0&amp;nbsp;&amp;nbsp;&amp;nbsp; |= 1&amp;lt;&amp;lt;19;

}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;***********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When I am test running the following test app, Code abruptly reaches Hardfault handler without even reaching the DelayMs function.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;that time u32BankWordCounter is 0x00100000&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if pExtDataPtr is unsigned short (16 bit) u32BankWordCounter is 0x00080000&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if pExtDataPtr is unsigned int (32 bit) u32BankWordCounter is 0x00040000&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;/***********************************************************************
#define SDRAM_START_ADDRESS0x28000000
#define SDRAM_SIZE_BYTES(1024*1024*8)

unsigned char *pExtDataPtr = (unsigned char *)SDRAM_START_ADDRESS;

int main(void)
{
unsigned int u32BankWordCounter;
unsigned char FlagCorrupt;

DEBUGInit();
pExtDataPtr = (unsigned char*)SDRAM_START_ADDRESS;
{
for(u32BankWordCounter = 0; u32BankWordCounter &amp;lt; SDRAM_SIZE_BYTES; u32BankWordCounter++)
{
*(pExtDataPtr++) = (unsigned char)u32BankWordCounter;
}
}
DEBUG("\r\nWaiting...");
DelayMs(5000);
DEBUG("\r\nVerifing...");
FlagCorrupt = 0;
pExtDataPtr = (unsigned char*)SDRAM_START_ADDRESS;
for(u32BankWordCounter = 0; u32BankWordCounter &amp;lt; SDRAM_SIZE_BYTES; u32BankWordCounter++)
{
if(*(pExtDataPtr++) != (unsigned char)u32BankWordCounter)
{
FlagCorrupt = 1;
break;
}
}
while(1)
{

}
}
***********************************************************************/&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does any one has Idea why this is happening?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Please suggest any ideas to get this issue resolved&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Alastair&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 19:10:16 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T19:10:16Z</dc:date>
    <item>
      <title>SDRAM fails after initialization from startup</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/SDRAM-fails-after-initialization-from-startup/m-p/584965#M21147</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Alastair on Mon Nov 23 02:22:57 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I am using IS42S16400J(@102MHz) as my external RAM with LPC4357(@204MHz).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I need to initialization my external RAM within startup code as one of my libraries has data area within it. Also the initialization of many library variables is done in the same data space.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am using the following code to boot my RAM from startup&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;/***********************************************************************
#include "SDRAM.h"
#include "lpc43xx_cgu.h"
#include "lpc43xx_scu.h"
#include "lpc43xx_gpio.h"
#include "lpc43xx_timer.h"

/************************** PRIVATE DEFINITIONS *************************/
/* SDRAM Address Base for DYCS0*/
#define SDRAM_ADDR_BASE0x28000000

/* SDRAM refresh time to 16 clock num */
#define EMC_SDRAM_REFRESH(freq,time)&amp;nbsp; \
&amp;nbsp; (((uint64_t)((uint64_t)time * freq)/16000000000ull)+1)

/*-------------------------PRIVATE FUNCTIONS------------------------------*/
/*********************************************************************
 * @briefCalculate EMC Clock from nano second
 * @param[in]freq - frequency of EMC Clk
 * @param[in]time - nano second
 * @return None
 **********************************************************************/
uint32_t NS2CLK(uint32_t freq,uint32_t time){
 return (((uint64_t)time*freq/1000000000));
}

#define CLK0_DELAY 7
/*********************************************************************
 * @briefInit the EMC Controller to connect ex SDRAM
 * @param[in]None
 * @return None
 **********************************************************************/
void SDRAM_Init1(void) 
{
uint32_t pclk, temp;
uint64_t tmpclk;
TIM_TIMERCFG_Type TIM_ConfigStruct;

/* Set up EMC pin */
{
scu_pinmux(1,0,MD_PLN_FAST,2);//A5
scu_pinmux(1,1,MD_PLN_FAST,2);//A6
scu_pinmux(1,2,MD_PLN_FAST,2);//A7
//scu_pinmux(1,3,MD_PLN_FAST,3);//OE
//scu_pinmux(1,4,MD_PLN_FAST,3);//BLS0
//scu_pinmux(1,5,MD_PLN_FAST,3);//CS0
scu_pinmux(1,6,MD_PLN_FAST,3);//WE
scu_pinmux(1,7,MD_PLN_FAST,3);//D0
scu_pinmux(1,8,MD_PLN_FAST,3);//D1
scu_pinmux(1,9,MD_PLN_FAST,3);//D2
scu_pinmux(1,10,MD_PLN_FAST,3);//D3
scu_pinmux(1,11,MD_PLN_FAST,3);//D4
scu_pinmux(1,12,MD_PLN_FAST,3);//D5
scu_pinmux(1,13,MD_PLN_FAST,3);//D6
scu_pinmux(1,14,MD_PLN_FAST,3);//D7
scu_pinmux(2,0,MD_PLN_FAST,2);//A13
scu_pinmux(2,1,MD_PLN_FAST,2);//A12
scu_pinmux(2,2,MD_PLN_FAST,2);//A11
scu_pinmux(2,6,MD_PLN_FAST,2);//A10
scu_pinmux(2,7,MD_PLN_FAST,3);//A9
scu_pinmux(2,8,MD_PLN_FAST,3);//A8
scu_pinmux(2,9,MD_PLN_FAST,3);//A0
scu_pinmux(2,10,MD_PLN_FAST,3);//A1
scu_pinmux(2,11,MD_PLN_FAST,3);//A2
scu_pinmux(2,12,MD_PLN_FAST,3);//A3
scu_pinmux(2,13,MD_PLN_FAST,3);//A4
scu_pinmux(5,0,MD_PLN_FAST,2);//D12
scu_pinmux(5,1,MD_PLN_FAST,2);//D13
scu_pinmux(5,2,MD_PLN_FAST,2);//D14
scu_pinmux(5,3,MD_PLN_FAST,2);//D15
scu_pinmux(5,4,MD_PLN_FAST,2);//D8
scu_pinmux(5,5,MD_PLN_FAST,2);//D9
scu_pinmux(5,6,MD_PLN_FAST,2);//D10
scu_pinmux(5,7,MD_PLN_FAST,2);//D11
//scu_pinmux(6,3,MD_PLN_FAST,3);//CS1
scu_pinmux(6,4,MD_PLN_FAST,3);//CAS
scu_pinmux(6,5,MD_PLN_FAST,3);//RAS
//scu_pinmux(6,6,MD_PLN_FAST,1);//A15
scu_pinmux(6,7,MD_PLN_FAST,1);//A15
scu_pinmux(6,8,MD_PLN_FAST,1);//A14
scu_pinmux(6,9,MD_PLN_FAST,3);//DYCS0
scu_pinmux(6,10,MD_PLN_FAST,3);//DQMOUT1
scu_pinmux(6,11,MD_PLN_FAST,3);//CKEOUT0
scu_pinmux(6,12,MD_PLN_FAST,3);//DQMOUT0
//scu_pinmux(10,4,MD_PLN_FAST,3);
//scu_pinmux(13,0,MD_PLN_FAST,2);
//scu_pinmux(13,2,MD_PLN_FAST,2);
//scu_pinmux(13,3,MD_PLN_FAST,2);
//scu_pinmux(13,4,MD_PLN_FAST,2);
//scu_pinmux(13,5,MD_PLN_FAST,2);
//scu_pinmux(13,6,MD_PLN_FAST,2);
//scu_pinmux(13,7,MD_PLN_FAST,2);
//scu_pinmux(13,8,MD_PLN_FAST,2);
//scu_pinmux(13,9,MD_PLN_FAST,2);
//scu_pinmux(13,10,MD_PLN_FAST,2);
//scu_pinmux(13,12,MD_PLN_FAST,2);
//scu_pinmux(13,13,MD_PLN_FAST,2);
//scu_pinmux(13,15,MD_PLN_FAST,2);
//scu_pinmux(13,16,MD_PLN_FAST,2);
//scu_pinmux(14,0,MD_PLN_FAST,3);
//scu_pinmux(14,1,MD_PLN_FAST,3);
//scu_pinmux(14,2,MD_PLN_FAST,3);
//scu_pinmux(14,3,MD_PLN_FAST,3);
//scu_pinmux(14,4,MD_PLN_FAST,3);
//scu_pinmux(14,5,MD_PLN_FAST,3);
//scu_pinmux(14,6,MD_PLN_FAST,3);
//scu_pinmux(14,7,MD_PLN_FAST,3);
//scu_pinmux(14,8,MD_PLN_FAST,3);
//scu_pinmux(14,9,MD_PLN_FAST,3);
//scu_pinmux(14,10,MD_PLN_FAST,3);
//scu_pinmux(14,11,MD_PLN_FAST,3);
//scu_pinmux(14,12,MD_PLN_FAST,3);
//scu_pinmux(14,13,MD_PLN_FAST,3);
}

// Setup EMC delays 
&amp;nbsp; LPC_SCU-&amp;gt;EMCDELAYCLK = ((CLK0_DELAY) | (CLK0_DELAY &amp;lt;&amp;lt; 4) | (CLK0_DELAY &amp;lt;&amp;lt; 8) | (CLK0_DELAY &amp;lt;&amp;lt; 12));

&amp;nbsp; // EMC clock is half of CGU_BASE_M4 if CGU_BASE_M4 is &amp;gt;104 MHz 
&amp;nbsp; if (SystemCoreClock &amp;gt; 104000000)
&amp;nbsp; {
LPC_CCU1-&amp;gt;CLK_M4_EMCDIV_CFG = ( (1&amp;lt;&amp;lt;0) | (1&amp;lt;&amp;lt;1) | (1&amp;lt;&amp;lt;2) | (1&amp;lt;&amp;lt;5) );
LPC_CREG-&amp;gt;CREG6 |= (1&amp;lt;&amp;lt;16);
&amp;nbsp; }
&amp;nbsp; else
&amp;nbsp; {
LPC_CCU1-&amp;gt;CLK_M4_EMCDIV_CFG = ( (1&amp;lt;&amp;lt;0) | (1&amp;lt;&amp;lt;1) | (1&amp;lt;&amp;lt;2) | (0&amp;lt;&amp;lt;5) );
LPC_CREG-&amp;gt;CREG6 &amp;amp;= ~(1&amp;lt;&amp;lt;16);
&amp;nbsp; }

/* Select EMC clock-out */
LPC_SCU-&amp;gt;SFSCLK_0 = MD_PLN_FAST;
LPC_SCU-&amp;gt;SFSCLK_1 = MD_PLN_FAST;
LPC_SCU-&amp;gt;SFSCLK_2 = MD_PLN_FAST;
LPC_SCU-&amp;gt;SFSCLK_3 = MD_PLN_FAST;

TIM_ConfigStruct.PrescaleOption = TIM_PRESCALE_USVAL;
TIM_ConfigStruct.PrescaleValue= 1;

// Set configuration for Tim_config and Tim_MatchConfig
TIM_Init(LPC_TIMER0, TIM_TIMER_MODE,&amp;amp;TIM_ConfigStruct);

LPC_EMC-&amp;gt;CONTROL = 0x00000001;
LPC_EMC-&amp;gt;CONFIG&amp;nbsp; = 0x00000000;
LPC_EMC-&amp;gt;DYNAMICCONFIG0&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0&amp;lt;&amp;lt;14 | 1&amp;lt;&amp;lt;9 | 1&amp;lt;&amp;lt;7; /* 64Mb, 4Mx16, 4 banks, row=12, column=8 */

pclk = CGU_GetPCLKFrequency(CGU_PERIPHERAL_M4CORE);

LPC_EMC-&amp;gt;DYNAMICRASCAS0&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000303; /* 1 RAS, 3 CAS latency */
LPC_EMC-&amp;gt;DYNAMICREADCONFIG = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */

LPC_EMC-&amp;gt;DYNAMICRP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 20);
LPC_EMC-&amp;gt;DYNAMICRAS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 42);
LPC_EMC-&amp;gt;DYNAMICSREX&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 63);
LPC_EMC-&amp;gt;DYNAMICAPR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000005;
LPC_EMC-&amp;gt;DYNAMICDAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000005;
LPC_EMC-&amp;gt;DYNAMICWR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 2;
LPC_EMC-&amp;gt;DYNAMICRC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 63);
LPC_EMC-&amp;gt;DYNAMICRFC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 63);
LPC_EMC-&amp;gt;DYNAMICXSR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 63);
LPC_EMC-&amp;gt;DYNAMICRRD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NS2CLK(pclk, 14);
LPC_EMC-&amp;gt;DYNAMICMRD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000002;

TIM_Waitus(100);&amp;nbsp;&amp;nbsp; /* wait 100ms */
LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000183; /* Issue NOP command */

TIM_Waitus(200);&amp;nbsp;&amp;nbsp; /* wait 200ms */
LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000103; /* Issue PALL command */

LPC_EMC-&amp;gt;DYNAMICREFRESH&amp;nbsp;&amp;nbsp;&amp;nbsp; = EMC_SDRAM_REFRESH(pclk,70); /* ( n * 16 ) -&amp;gt; 32 clock cycles */

//for(i = 0; i &amp;lt; 0x80; i++);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wait 128 AHB clock cycles */
TIM_Waitus(200);&amp;nbsp;&amp;nbsp; /* wait 200ms */

tmpclk = (uint64_t)15625*(uint64_t)pclk/1000000000/16;
LPC_EMC-&amp;gt;DYNAMICREFRESH&amp;nbsp;&amp;nbsp;&amp;nbsp; = tmpclk; /* ( n * 16 ) -&amp;gt; 736 clock cycles -&amp;gt; 15.330uS at 48MHz &amp;lt;= 15.625uS ( 64ms / 4096 row ) */

LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000083; /* Issue MODE command */

//Timing for 48/60/72MHZ Bus
temp = *((volatile uint32_t *)(SDRAM_ADDR_BASE | (3&amp;lt;&amp;lt;4| 3)&amp;lt;&amp;lt;11)); /* 4 burst, 3 CAS latency */
temp = temp;
LPC_EMC-&amp;gt;DYNAMICCONTROL&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000000; /* Issue NORMAL command */

//[re]enable buffers
LPC_EMC-&amp;gt;DYNAMICCONFIG0&amp;nbsp;&amp;nbsp;&amp;nbsp; |= 1&amp;lt;&amp;lt;19;

}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;***********************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;When I am test running the following test app, Code abruptly reaches Hardfault handler without even reaching the DelayMs function.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;that time u32BankWordCounter is 0x00100000&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if pExtDataPtr is unsigned short (16 bit) u32BankWordCounter is 0x00080000&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if pExtDataPtr is unsigned int (32 bit) u32BankWordCounter is 0x00040000&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;/***********************************************************************
#define SDRAM_START_ADDRESS0x28000000
#define SDRAM_SIZE_BYTES(1024*1024*8)

unsigned char *pExtDataPtr = (unsigned char *)SDRAM_START_ADDRESS;

int main(void)
{
unsigned int u32BankWordCounter;
unsigned char FlagCorrupt;

DEBUGInit();
pExtDataPtr = (unsigned char*)SDRAM_START_ADDRESS;
{
for(u32BankWordCounter = 0; u32BankWordCounter &amp;lt; SDRAM_SIZE_BYTES; u32BankWordCounter++)
{
*(pExtDataPtr++) = (unsigned char)u32BankWordCounter;
}
}
DEBUG("\r\nWaiting...");
DelayMs(5000);
DEBUG("\r\nVerifing...");
FlagCorrupt = 0;
pExtDataPtr = (unsigned char*)SDRAM_START_ADDRESS;
for(u32BankWordCounter = 0; u32BankWordCounter &amp;lt; SDRAM_SIZE_BYTES; u32BankWordCounter++)
{
if(*(pExtDataPtr++) != (unsigned char)u32BankWordCounter)
{
FlagCorrupt = 1;
break;
}
}
while(1)
{

}
}
***********************************************************************/&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does any one has Idea why this is happening?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Please suggest any ideas to get this issue resolved&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Alastair&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:10:16 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/SDRAM-fails-after-initialization-from-startup/m-p/584965#M21147</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:10:16Z</dc:date>
    </item>
    <item>
      <title>Re: SDRAM fails after initialization from startup</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/SDRAM-fails-after-initialization-from-startup/m-p/584966#M21148</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by bavarian on Tue Nov 24 06:18:40 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi Alastair,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;try it with the following instruction for the MODE word:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//Timing for 48/60/72MHZ Bus&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;temp =&amp;nbsp; *((volatile uint32_t *)(SDRAM_BASE | ((3 | (3 &amp;lt;&amp;lt; 4)) &amp;lt;&amp;lt; (8 + 1))));&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;NXP Support Team&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:10:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/SDRAM-fails-after-initialization-from-startup/m-p/584966#M21148</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:10:17Z</dc:date>
    </item>
    <item>
      <title>Re: SDRAM fails after initialization from startup</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/SDRAM-fails-after-initialization-from-startup/m-p/584967#M21149</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Alastair on Wed Nov 25 06:36:27 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi Bavarian&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The suggested code does not work, although it does not cause a hardfault but it does corrupt the data in SDRAM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Few more observations&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if base clock is set to 144Mhz and without dividing the EMC clock i.e. using &lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;LPC_CCU1-&amp;gt;CLK_M4_EMCDIV_CFG = ( (1&amp;lt;&amp;lt;0) | (1&amp;lt;&amp;lt;1) | (1&amp;lt;&amp;lt;2) | (0&amp;lt;&amp;lt;5) );
LPC_CREG-&amp;gt;CREG6 &amp;amp;= ~(1&amp;lt;&amp;lt;16);&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;the ram works perfectly fine&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I cannot try faster clock as maximum clock supported by SDRAM is 166MHz&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In case EMC clock is divided using&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;LPC_CCU1-&amp;gt;CLK_M4_EMCDIV_CFG = ( (1&amp;lt;&amp;lt;0) | (1&amp;lt;&amp;lt;1) | (1&amp;lt;&amp;lt;2) | (1&amp;lt;&amp;lt;5) );
LPC_CREG-&amp;gt;CREG6 |= (1&amp;lt;&amp;lt;16);&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;SDRAM works till base frequency is 144MHz i.e. SDRAM clock is 72MHz&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Beyond this if the base frequency is increased, few words are written in memory but later CPU hangs giving error "Could not stop Cortex-M Device! Please check the JTAG cable"&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Am I setting the divider correctly or am i missing some other thing.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:10:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/SDRAM-fails-after-initialization-from-startup/m-p/584967#M21149</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:10:17Z</dc:date>
    </item>
  </channel>
</rss>

