LPCXpresso54608 Frame Buffer on SDRAM

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

LPCXpresso54608 Frame Buffer on SDRAM

Jump to solution
2,104 Views
victorpecanins
Contributor II

I am interested on drawing in the LCD screen using direct writes in the framebuffer (no emWin, TouchGFX libraries whatsoever, just using MCUXpresso and fsl_lcdc driver. The project is based on the SDK demo project lpcxpresso54608_demo_apps_touch_cursor

 

I want to draw graphics with a greater color depth. For example, 24 bits per pixel. In order to do this, I need to allocate a bigger frame buffer, which does not fit in the internal RAM of the LPC54608. Therefore I want to allocate the frame buffer on the external SDRAM on the eval board. Can I have any example code for this?

 

So far, I tried using a macro declaration to allocate the buffer variable on the RAM4 region (which corresponds to the external RAM):

 

#include <cr_section_macros.h>

...

__attribute__(( section(".data.$RAM4"), aligned(8) ))

static uint8_t s_frameBufs[IMG_HEIGHT][IMG_WIDTH];

 

In addition to that, I added the functions necessary to bring up the external SDRAM from the example lpcxpresso54608_driver_examples_emc_sdram:

 

#include "fsl_emc.h"

...

BOARD_InitSDRAM();

 

My project builds correctly and the compiler statistics show indeed the variable is stored in the external RAM:

 

Memory region         Used Size  Region Size  %age Used

   PROGRAM_FLASH:       92532 B       512 KB     17.65%

     BOARD_FLASH:          0 GB        16 MB      0.00%

    SRAM_0_1_2_3:        8576 B       160 KB      5.23%

           SRAMX:          0 GB        32 KB      0.00%

         USB_RAM:          0 GB         8 KB      0.00%

     BOARD_SDRAM:       65280 B        16 MB      0.39%

Finished building target: lpcxpresso54608_demo_apps_touch_cursor.axf

 

However, it does not run after programming, the display on the eval board is completely white and, shockingly: The debugger hangs, it gives communication error and the board must be power cycled.

 

 

I think this application could be useful in many cases, an I am looking forward to know if there’s any example or application note explaining how to put the frame buffer on the external SDRAM.

 

Thanks,

Víctor

1 Solution
1,253 Views
victorpecanins
Contributor II

I solved the problem by myself. Thanks Dieter, your comment gave me the right clues. The LPC platform is very new for me and I was missing setting the proper configuration of the pins in the file board/pin_mux.c. The pin_mux.c files from SDK example projects must be combined in a single one to enable both LCD and SDRAM (lpcxpresso54608_demo_apps_touch_cursor and lpcxpresso54608_driver_examples_emc_sdram)

In addition to this, the variable storing the frame buffer must not be initialized (noinit section):

#include <cr_section_macros.h>

...

__attribute__(( section(".noinit.$RAM4"), aligned(8) ))

static uint8_t s_frameBufs[IMG_HEIGHT][IMG_WIDTH];

With this and calling the BOARD_InitSDRAM(); function, I am now able to put the frame buffer on the external SDRAM.

Best Regards,

Victor

View solution in original post

2 Replies
1,253 Views
dieterniesel
Contributor I

I have the same results, but the Programm ist executing because I have one LED flashing via systick  Int

in the main While loop.

The code for using the framebuffer is :
 __attribute__ ((aligned(8), section(".noinit.$RAM4"))) uint8_t s_frameBuf0[IMG_HEIGHT][IMG_WIDTH / 4];
__attribute__ ((aligned(8), section(".noinit.$RAM4"))) uint8_t s_frameBuf1[IMG_HEIGHT][IMG_WIDTH / 4];
static const uint32_t s_frameBufAddr[] = {(uint32_t)s_frameBuf0, (uint32_t)s_frameBuf1};
static const uint32_t palette[] = {0x001F0000U, 0x7C0003D0U };

There is also an error in the PWM Routine for the display 

    pwmParam.level = kSCTIMER_LowTrue; 

the example had HighTrue and you need the init for the output Pin
 const uint32_t port3_pin31_config = (
      IOCON_PIO_FUNC2 |
      IOCON_PIO_MODE_INACT |
      IOCON_PIO_INV_DI |
      IOCON_PIO_DIGITAL_EN |
      IOCON_PIO_INPFILT_OFF |
      IOCON_PIO_SLEW_STANDARD |
      IOCON_PIO_OPENDRAIN_DI
    );
    IOCON_PinMuxSet(IOCON, PORT3_IDX, PIN31_IDX, port3_pin31_config);

The Programm works without any problem if the framebuffer is allocated in SRAM

Thanks,

Dieter

1,254 Views
victorpecanins
Contributor II

I solved the problem by myself. Thanks Dieter, your comment gave me the right clues. The LPC platform is very new for me and I was missing setting the proper configuration of the pins in the file board/pin_mux.c. The pin_mux.c files from SDK example projects must be combined in a single one to enable both LCD and SDRAM (lpcxpresso54608_demo_apps_touch_cursor and lpcxpresso54608_driver_examples_emc_sdram)

In addition to this, the variable storing the frame buffer must not be initialized (noinit section):

#include <cr_section_macros.h>

...

__attribute__(( section(".noinit.$RAM4"), aligned(8) ))

static uint8_t s_frameBufs[IMG_HEIGHT][IMG_WIDTH];

With this and calling the BOARD_InitSDRAM(); function, I am now able to put the frame buffer on the external SDRAM.

Best Regards,

Victor