stm32f4xxxg_flash.ld

stm32f4xxxg_flash.ld

Для начала зададим точку входа для программы:

/* Entry Point */
ENTRY(reset_handler)

Определим карту памяти, задав для хранения неизменных кода и данных- флешь по адресу 0x8000 0000(объем 1 МБ), а для хранения кода и данных которые изменяются СОЗУ по адресу 0x2000 0000(объем 112 КБ, это СОЗУ мк, в отличие от двух других помимо большего объема имеет доступ как для процессорного ядра мк, так и для периферии):

/* Specify the memory areas */
MEMORY {
    FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
    RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 112K
}

Определим базовые секции для набора:

/* Define output sections */
SECTIONS {
    . = ORIGIN(FLASH);
    .text :
    {
        *(.vectors) /* Vector table */
        *(.vectors.*) /* Any extra device vectors */
        *(.text) /* Program code */
        *(.rodata) /* Read only data */
        *(.rodata*)
        __text_end = .;
    } >FLASH
    /*
     * This is the initialized data section
     * The program executes knowing that the data is in the RAM
     * but the loader puts the initial values in the FLASH (inidata).
     * One task of "startup" is to copy the initial values from FLASH to RAM.
     */
    .data :
    {
        /* This is used by the startup in order to initialize the .data secion */
        PROVIDE (__data_start = .);
        *(.data)
        *(.data.*)
        /* This is used by the startup in order to initialize the .data secion */
        PROVIDE (__data_end = .);
    } >RAM AT >FLASH
    .bss :
    {
        PROVIDE(__bss_start = .);
        *(.bss)
        *(COMMON)
        . = ALIGN(4);
        PROVIDE(__bss_end = .);
    } >RAM
    . = ALIGN(4);
    _stack_start = .;
}
_end = .;

В конце определим начало стека( это необходимо, т.к. стек растет вниз - от старших адресов памяти к младшим):

/* Provide stack end address */
PROVIDE(_estack = ORIGIN(RAM) + LENGTH(RAM) - 4);