Skip to main content
Visitor II
January 8, 2015
Question

How to make program start from a customized address?

  • January 8, 2015
  • 14 replies
  • 5571 views
Posted on January 08, 2015 at 04:51

I understand this question has been asked before. I searched the forum and view these three threads: 

''How to program the application flash file (hex file) in chosen flash area by using ST-LINK for STM32F0''

''Flash Address setting to write main program starting from specific address''

''How start running STM32 firmware from IROM2 ?''

However, I still have some doubts. For STM32F407, there are 12 flash sectors. If I define the IROM1 address to be 0x080E0000, which is the 12th sector, can I then store data in the first 11 sectors, including sector 0 starting from 0x08000000? From the threads, it seems that I can't because some vectors are located in sector 0. Does it mean I can only use sector 1~11?

#know-your-tools #flash #boot #stm32f4
    This topic has been closed for replies.

    14 replies

    Graduate II
    January 14, 2015
    Posted on January 14, 2015 at 13:01

    The memory mapped at zero at reset is controlled by the BOOTx pins, these define THREE addresses, 0x080E0000 is NOT one of them.

    http://www.keil.com/forum/59235/

    You'd need to create an IROM2 section at 0x08000000 of at least EIGHT bytes in size, and place TWO vectors in there.

    ; Vector Table Mapped to Address 0 at Reset
    AREA RESETZERO, DATA, READONLY
    DCD __initial_sp ; Top of Stack
    DCD Reset_Handler ; Reset Handler

    ; *************************************************************
    ; *** Scatter-Loading Description File generated by uVision ***
    ; *************************************************************
    LR_IROM1 0x080E0000 0x00020000 { ; load region size_region
    ER_IROM1 0x080E0000 0x00020000 { ; load address = execution address
    *.o (RESET, +First)
    *(InRoot$$Sections)
    .ANY (+RO)
    }
    RW_IRAM1 0x20000000 0x00020000 { ; RW data
    .ANY (+RW +ZI)
    }
    }
    LR_IROM2 0x08000000 0x00000010 { ; load region size_region
    ER_IROM2 0x08000000 0x00000010 { ; load address = execution address
    *.o (RESETZERO)
    }
    }

    songAuthor
    Visitor II
    January 15, 2015
    Posted on January 15, 2015 at 05:03

    My biggest mistake. The program still can't run. It was the one that previously burned to 0x8000000 which runs even though the modified one was burned to 0x80E0000. So back to square 1. :(

    songAuthor
    Visitor II
    January 15, 2015
    Posted on January 15, 2015 at 08:01

    Does it mean I have to write my won startup code? In the default onestartup_stm32f4xx.s

    ; Vector Table Mapped to Address 0 at Reset
    AREA RESET, DATA, READONLY
    EXPORT __Vectors
    EXPORT __Vectors_End
    EXPORT __Vectors_Size
    __Vectors DCD __initial_sp ; Top of Stack
    DCD Reset_Handler ; Reset Handler

    After I set IROM2, the scatter file shows

    LR_IROM1 0x080E0000 0x00020000 { ; load region size_region
    ER_IROM1 0x080E0000 0x00020000 { ; load address = execution address
    *.o (RESET, +First)
    *(InRoot$$Sections)
    .ANY (+RO)
    }
    RW_IRAM1 0x20000000 0x00001000 { ; RW data
    .ANY (+RW +ZI)
    }
    }
    LR_IROM2 0x08000000 0x00000100 {
    ER_IROM2 0x08000000 0x00000100 { ; load address = execution address
    .ANY (+RO)
    }
    }

    If I manually change the code in LR_IROM2 from

    .ANY (+RO) to

    *.o (RESET), the compiler will complain:

    Error: L6223E: Ambiguous selectors found for startup_stm32f4xx.o(RESET) from Exec regions ER_IROM1 and ER_IROM2.

    So any advice about how I can map vector table to IROM2?
    Visitor II
    May 29, 2024

    Hello,

    The post is to ancient, but if someone need start de App in a specific location on memory, need to do the next steps:

    Step 1: Open xxxx_FLASH.Id and change the line #50 or when you can find the text
    "FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K" (for STM32F407, p.e.) and modify the ORIGIN with
    the FLASH_ADDR_APP_JUMP_EN and the LENGTH subtracting the DFU and EEPROM sizes. P.E.:

    If FLASH_ADDR_APP_JUMP_EN = 0x08010000, put in ORIGIN = 0x08010000 and LENGHT = 960K

     

    Step 2: Open ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32F407xx.h and change the line
    #906 or when you can find the text "#define FLASH_BASE 0x08000000UL" and
    modify the value with the FLASH_ADDR_APP_JUMP_EN. P.E.:

    If FLASH_ADDR_APP_JUMP_EN = 0x08010000, put in FLASH_BASE the value 0x08010000

     

    Step 3: In the sysetm_stm32f4xx.c file, in line #94, uncomment the definition
    "#define USER_VECT_TAB_ADDRESS" for relocate the vector table and, in the line #108
    put the offset value. P.E.:

    FLASH_ADDR_APP_JUMP_EN = 0x08010000 => #define VECT_TAB_OFFSET 0x00010000U

     

    With this simples steps, you can configure all, position for code and table vectors. Only need to jump to this position to run without a DFU or another program in the empty space.

     

    Regards

    Graduate II
    May 29, 2024

    Yeah a NINE year old thread, where the OP was using KEIL, not GNU/GCC

    Or use a linker symbol for the Vector Table so you don't have to edit multiple files and change defines, and allow the same files to build correctly at the address defined in the linker script / scatter file.