Arm Mbed OS support forum

STM32F746 Discovery - ARM-Compiler (armclang): How to use external SDRAM as heap?

Hello,

I have a hard time figuring out how to use external SDRAM of STM32F746 discovery board as heap memory.

I use ARM compiler (armclang) version 6.

What I did so far:

edit targets/TARGET_STM/TARGET_STM32F7/TARGET_STM32F746xG/TOOLCHAIN_ARM/stm32f746xg.sct

#define SDRAM_START         0xC0000000
#define SDRAM_SIZE          0x00800000

LR_IROM1 MBED_APP_START MBED_APP_SIZE  {    ; load region size_region

  ER_IROM1 MBED_APP_START MBED_APP_SIZE  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }

  RW_RAM1 SDRAM_START SDRAM_SIZE {
    *(ARM_LIB_HEAP)
  }

  RW_m_crash_data MBED_CRASH_REPORT_RAM_START EMPTY MBED_CRASH_REPORT_RAM_SIZE { ; RW data
  }

  RW_IRAM1 (MBED_RAM0_START) (MBED_RAM0_SIZE-Stack_Size)  {  ; RW data
   .ANY (+RW +ZI)
  }

  ARM_LIB_STACK (MBED_RAM0_START+MBED_RAM0_SIZE) EMPTY -Stack_Size { ; stack
  }

  ARM_LIB_HEAP (SDRAM_START)  EMPTY (SDRAM_SIZE)  { ; Heap growing up
  }

}

and added this to my main()-function right at the very beginning:

unsigned char err = BSP_SDRAM_Init();

    if(err == SDRAM_ERROR) {

        printf("Failed to initialize SDRAM -> exit.\r\n");

        exit(-1);

    }

    MPU_Region_InitTypeDef MPU_InitStruct;

    /* Disable the MPU */

    HAL_MPU_Disable();

    /* Configure the MPU attributes for SDRAM */

    MPU_InitStruct.Enable = MPU_REGION_ENABLE;

    MPU_InitStruct.BaseAddress = 0xC0000000;

    MPU_InitStruct.Size = MPU_REGION_SIZE_4MB;

    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;

    MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

    MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;

    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;

    MPU_InitStruct.Number = MPU_REGION_NUMBER0;

    MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;

    MPU_InitStruct.SubRegionDisable = 0x00;

    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;

    HAL_MPU_ConfigRegion(&MPU_InitStruct);

    /* Enable the MPU */

    HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

Unfortunately - nothing works. It seems like the CPU is dead because I can’t print / do anything - I get no response, not even a hard fault error or something.

Any ideas how I can awake the SDRAM?