STM32CubeIDE 기준임.
먼저 Loader 스크립트를 수정해야함
외부 RAM이 0x90000000에서 시작하고 용량이 32MB라는 가정을 하면,
__EXTRAM_BEGIN = 0x90000000;
__EXTRAM_SIZE = 0x02000000;
__RAM_BEGIN = 0x24000000;
__RAM_SIZE = 0x71C00;
__RAM_NONCACHEABLEBUFFER_SIZE = 0x400;
/* Memories definition */
MEMORY
{
RAM (xrw) : ORIGIN = __RAM_BEGIN, LENGTH = __RAM_SIZE
RAM_NONCACHEABLEBUFFER (xrw) : ORIGIN = __RAM_BEGIN + __RAM_SIZE, LENGTH = __RAM_NONCACHEABLEBUFFER_SIZE
ITCM (xrw) : ORIGIN = 0x00000000, LENGTH = 0x00010000
DTCM (rw) : ORIGIN = 0x20000000, LENGTH = 0x00010000
SRAMAHB (rw) : ORIGIN = 0x30000000, LENGTH = 0x00008000
BKPSRAM (rw) : ORIGIN = 0x38800000, LENGTH = 0x00001000
FLASH (xrw) : ORIGIN = __FLASH_BEGIN, LENGTH = __FLASH_SIZE
EXTRAM (rw) : ORIGIN = __EXTRAM_BEGIN, LENGTH = __EXTRAM_SIZE
/* EXT_FLASH (rx) : ORIGIN = 0x70000000, LENGTH = 8192K */
}
.....
SECTIONS
{
... 생략...
/* 외부 램 사용자 섹션 */
.ext_ram_data (NOLOAD) : {
. = ALIGN(4);
*(.ext_ram_data)
. = ALIGN(4);
} > EXTRAM
... 생략...
}
처럼 수정한다.
NOLOAD는 매우 중요하다. 이것은 flash에 초기화 값을 사용하지 않겠다는것이다. 따라서
기본값 지정은 불가능함.
내가 사용하는 STM32H7시리즈 칩이 내부 플래시가 워낙 작고, 나는 단지 RAM을 확장할것이
때문에 RAM만 늘리면 되기에 초기값은 사용하지 않은것이다.
그리고 변수를 만들때에는
__attribute__((section(".ext_ram_data"))) uint8_t ext_ram_variable_example1[100];
이런식으로 section을 직접 지정해준다.