lpcware

how to initialize the EMC for using off-chip SRAM in startup.s file

Discussion created by lpcware Employee on Jun 15, 2016
Content originally posted in LPCWare by wotes on Wed Oct 01 01:40:13 MST 2014
hello,

    My LPC1788 has 64K SRAM, but it is little. I want to using off-chip SRAM,2MB.But I don't known how to  initialize  the EMC in startup.s(keil) file.


the startup.s:
;/***********************************************************************
; * Project: LPC177x_8x startup code
; *
; * Description: LPC177x_8x startup code
; *
; * Copyright(C) 2011, NXP Semiconductor
; * All rights reserved.
; *
; ***********************************************************************
; * Software that is described herein is for illustrative purposes only
; * which provides customers with programming information regarding the
; * products. This software is supplied "AS IS" without any warranties.
; * NXP Semiconductors assumes no responsibility or liability for the
; * use of the software, conveys no license or title under any patent,
; * copyright, or mask work right to the product. NXP Semiconductors
; * reserves the right to make changes in the software without
; * notification. NXP Semiconductors also make no representation or
; * warranty that such application will be suitable for the specified
; * use without further testing or modification.
; **********************************************************************/

; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x00000800

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000100

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

                PRESERVE8
                THUMB

; Vector Table Mapped to Address 0 at Reset

                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors

Sign_ValueEQU0x5A5A5A5A

__Vectors       DCD     __initial_sp              ; 0 Top of Stack
                DCD     Reset_Handler             ; 1 Reset Handler
                DCD     NMI_Handler               ; 2 NMI Handler
                DCD     HardFault_Handler         ; 3 Hard Fault Handler
                DCD     MemManage_Handler         ; 4 MPU Fault Handler
                DCD     BusFault_Handler          ; 5 Bus Fault Handler
                DCD     UsageFault_Handler        ; 6 Usage Fault Handler
                DCD     Sign_Value                ; 7 Reserved
                DCD     UnHandled_Vector           ; 8 Reserved
                DCD     UnHandled_Vector           ; 9 Reserved
                DCD     UnHandled_Vector          ; 10 Reserved
                DCD     SVC_Handler               ; 11 SVCall Handler
                DCD     DebugMon_Handler          ; 12 Debug Monitor Handler
                DCD     UnHandled_Vector          ; 13 Reserved
                DCD     PendSV_Handler            ; 14 PendSV Handler
                DCD     SysTick_Handler           ; 15 SysTick Handler

                ; External Interrupts

DCDWDT_IRQHandler ; 16 Watchdog Timer
DCDTIMER0_IRQHandler; 17 Timer0
DCDTIMER1_IRQHandler    ; 18 Timer1
DCDTIMER2_IRQHandler; 19 Timer2
DCDTIMER3_IRQHandler    ; 20 Timer3
DCDUART0_IRQHandler; 21 UART0
DCDUART1_IRQHandler; 22 UART1
DCDUART2_IRQHandler; 23 UART2
DCDUART3_IRQHandler; 24 UART3
DCDPWM1_IRQHandler    ; 25 PWM1
DCDI2C0_IRQHandler; 26 I2C0
DCDI2C1_IRQHandler; 27 I2C1
DCDI2C2_IRQHandler    ; 28 I2C2
DCDUnHandled_Vector                   ; 29 Reserved
DCDSSP0_IRQHandler; 30 SSP0
DCDSSP1_IRQHandler; 31 SSP1
DCDPLL0_IRQHandler    ; 32 PLL0 Lock (Main PLL)
DCDRTC_IRQHandler; 33 RTC
DCDEINT0_IRQHandler; 34 External Interrupt 0
DCDEINT1_IRQHandler; 35 External Interrupt 1
DCDEINT2_IRQHandler; 36 External Interrupt 2
DCDEINT3_IRQHandler; 37 External Interrupt 3
DCDADC_IRQHandler; 38 A/D Converter
DCDBOD_IRQHandler; 39 Brown-Out Detect
DCDUSB_IRQHandler    ; 40 USB
DCDCAN_IRQHandler   ; 41 CAN
DCDDMA_IRQHandler    ; 42 General Purpose DMA
DCDI2S_IRQHandler    ; 43 I2S
DCDETH_IRQHandler; 44 Ethernet
DCDSDIO_IRQHandler; 45 SD/MMC card I/F
DCDMCPWM_IRQHandler; 46 Motor Control PWM
DCDQEI_IRQHandler    ; 47 QEI
DCDPLL1_IRQHandler    ; 48 PLL1 Lock (USB PLL)
DCDUSBActivity_IRQHandler; 49 USB Activity interrupt to wakeup
DCDCANActivity_IRQHandler; 50 CAN Activity interrupt to wakeup
DCDUART4_IRQHandler; 51 UART4
DCDSSP2_IRQHandler    ; 52 SSP2
DCDLCD_IRQHandler    ; 53 LCD
DCDGPIO_IRQHandler    ; 54 GPIO
DCDPWM0_IRQHandler; 55 PWM0
DCDEEPROM_IRQHandler; 56 EEPROM

;                IF      :LNOT::DEF:NO_CRP
;                AREA    |.ARM.__at_0x02FC|, CODE, READONLY
;CRP_Key         DCD     0xFFFFFFFF
;                ENDIF

                AREA    |.text|, CODE, READONLY

; Reset Handler

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
IMPORT  SystemInit
LDRR0, =SystemInit
BLXR0
                LDR     R0, =__main
                BX      R0
                ENDP

; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC
                EXPORT  NMI_Handler               [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler         [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler         [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler          [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler        [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler               [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler          [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler            [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler           [WEAK]
                B       .
                ENDP
UnHandled_VectorPROC
                EXPORT  UnHandled_Vector          [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  WDT_IRQHandler            [WEAK]
EXPORT  TIMER0_IRQHandler         [WEAK]
EXPORT  TIMER1_IRQHandler         [WEAK]
EXPORT  TIMER2_IRQHandler         [WEAK]
EXPORT  TIMER3_IRQHandler         [WEAK]
EXPORT  UART0_IRQHandler          [WEAK]
EXPORT  UART1_IRQHandler          [WEAK]
EXPORT  UART2_IRQHandler          [WEAK]
EXPORT  UART3_IRQHandler          [WEAK]
EXPORT  PWM1_IRQHandler           [WEAK]
EXPORT  I2C0_IRQHandler           [WEAK]
EXPORT  I2C1_IRQHandler           [WEAK]
EXPORT  I2C2_IRQHandler           [WEAK]
EXPORT  SPI_IRQHandler            [WEAK]
EXPORT  SSP0_IRQHandler           [WEAK]
EXPORT  SSP1_IRQHandler           [WEAK]
EXPORT  PLL0_IRQHandler           [WEAK]
EXPORT  RTC_IRQHandler            [WEAK]
EXPORT  EINT0_IRQHandler          [WEAK]
EXPORT  EINT1_IRQHandler          [WEAK]
EXPORT  EINT2_IRQHandler          [WEAK]
EXPORT  EINT3_IRQHandler          [WEAK]
EXPORT  ADC_IRQHandler            [WEAK]
EXPORT  BOD_IRQHandler            [WEAK]
EXPORT  USB_IRQHandler            [WEAK]
EXPORT  CAN_IRQHandler            [WEAK]
EXPORT  DMA_IRQHandler            [WEAK]
EXPORT  I2S_IRQHandler            [WEAK]
EXPORT  ETH_IRQHandler            [WEAK]
EXPORT  SDIO_IRQHandler            [WEAK]
EXPORT  MCPWM_IRQHandler          [WEAK]
EXPORT  QEI_IRQHandler            [WEAK]
EXPORT  PLL1_IRQHandler           [WEAK]
EXPORT  USBActivity_IRQHandler    [WEAK]
EXPORT  CANActivity_IRQHandler    [WEAK]
EXPORT  UART4_IRQHandler          [WEAK]
EXPORT  SSP2_IRQHandler           [WEAK]
EXPORT  LCD_IRQHandler            [WEAK]
EXPORT  GPIO_IRQHandler           [WEAK]
EXPORT  PWM0_IRQHandler           [WEAK]
EXPORT  EEPROM_IRQHandler         [WEAK]
WDT_IRQHandler
TIMER0_IRQHandler
TIMER1_IRQHandler
TIMER2_IRQHandler
TIMER3_IRQHandler
UART0_IRQHandler
UART1_IRQHandler
UART2_IRQHandler
UART3_IRQHandler
PWM1_IRQHandler
I2C0_IRQHandler
I2C1_IRQHandler
I2C2_IRQHandler
SPI_IRQHandler
SSP0_IRQHandler
SSP1_IRQHandler
PLL0_IRQHandler
RTC_IRQHandler
EINT0_IRQHandler
EINT1_IRQHandler
EINT2_IRQHandler
EINT3_IRQHandler
ADC_IRQHandler
BOD_IRQHandler
USB_IRQHandler
CAN_IRQHandler
DMA_IRQHandler
I2S_IRQHandler
ETH_IRQHandler
SDIO_IRQHandler       
MCPWM_IRQHandler
QEI_IRQHandler
PLL1_IRQHandler
USBActivity_IRQHandler
CANActivity_IRQHandler
UART4_IRQHandler
SSP2_IRQHandler
LCD_IRQHandler
GPIO_IRQHandler
PWM0_IRQHandler
EEPROM_IRQHandler

                B       .

                ENDP

                ALIGN

; User Initial Stack & Heap

                IF      :DEF:__MICROLIB

                EXPORT  __initial_sp
                EXPORT  __heap_base
                EXPORT  __heap_limit

                ELSE

                IMPORT  __use_two_region_memory
                EXPORT  __user_initial_stackheap
__user_initial_stackheap

                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + Stack_Size)
                LDR     R2, = (Heap_Mem +  Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR

                ALIGN

                ENDIF

END

the EMC_Init:
void EMC_GPIO_Init (void)
{
    LPC_IOCON->P3_0 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D0 @ P3.0 */
    LPC_IOCON->P3_1 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D1 @ P3.1 */
    LPC_IOCON->P3_2 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D2 @ P3.2 */
    LPC_IOCON->P3_3 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D3 @ P3.3 */

    LPC_IOCON->P3_4 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D4 @ P3.4 */
    LPC_IOCON->P3_5 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D5 @ P3.5 */
    LPC_IOCON->P3_6 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D6 @ P3.6 */
    LPC_IOCON->P3_7 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D7 @ P3.7 */

    LPC_IOCON->P3_8 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D8 @ P3.8 */
    LPC_IOCON->P3_9 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D9 @ P3.9 */
    LPC_IOCON->P3_10 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D10 @ P3.10 */
    LPC_IOCON->P3_11 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D11 @ P3.11 */

    LPC_IOCON->P3_12 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D12 @ P3.12 */
    LPC_IOCON->P3_13 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D13 @ P3.13 */
    LPC_IOCON->P3_14 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D14 @ P3.14 */
    LPC_IOCON->P3_15 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* D15 @ P3.15 */


//   LPC_IOCON->P4_0 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A0 @ P4.0 */
    LPC_IOCON->P4_1 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A1 @ P4.1 */
    LPC_IOCON->P4_2 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A2 @ P4.2 */
    LPC_IOCON->P4_3 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A3 @ P4.3 */

    LPC_IOCON->P4_4 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A4 @ P4.4 */
    LPC_IOCON->P4_5 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A5 @ P4.5 */
    LPC_IOCON->P4_6 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A6 @ P4.6 */
    LPC_IOCON->P4_7 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A7 @ P4.7 */

    LPC_IOCON->P4_8 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A8 @ P4.8 */
    LPC_IOCON->P4_9 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A9 @ P4.9 */
    LPC_IOCON->P4_10 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A10 @ P4.10 */
    LPC_IOCON->P4_11 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A11 @ P4.11 */

    LPC_IOCON->P4_12 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A12 @ P4.12 */
    LPC_IOCON->P4_13 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A13 @ P4.13 */
    LPC_IOCON->P4_14 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A14 @ P4.14 */
    LPC_IOCON->P4_15 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A15 @ P4.15 */

    LPC_IOCON->P4_16 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A16 @ P4.16 */
    LPC_IOCON->P4_17 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A17 @ P4.17 */
    LPC_IOCON->P4_18 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* A18 @ P4.18 */

    LPC_IOCON->P4_25 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* WEN @ P4.25 */

    LPC_IOCON->P4_24 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* OEN @ P4.24 */
    LPC_IOCON->P4_26 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* BLSN[0] @ P4.26 */
    LPC_IOCON->P4_27 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* BLSN[1] @ P4.27 */
    LPC_IOCON->P4_31 = (1<<0 | 0<<3 | 0<<5 | 1<<9); /* M_CS[1] @ P4.31 */

}
void SRAM_Init(void)
{
    LPC_SC->PCONP      |= 0x00000800;   /* Enable External Memory Controller power/clock */

    EMC_GPIO_Init(); 
    Delay_Ms(200);
    LPC_EMC->Control = 0x00000001;      /*EMC enable*/

    LPC_SC->EMCCLKSEL = 0x00000001;     /* The EMC uses a clock at half the rate of the CPU*/


    //LPC_SC->EMCCAL                   
    LPC_EMC->Config  = 0x00000000;      /*little endian mode*/


    Delay_Ms(200);    
    LPC_EMC->StaticConfig1 = 0x00000081;  /*  16bit */
    Delay_Ms(200);
}

I hope your help!
Thank You in advance...

Outcomes