Skip to main content
Visitor II
September 27, 2022
Solved

Cortex-M0 Vector table relocation.

  • September 27, 2022
  • 1 reply
  • 4046 views

To give a context:

I'm working to implement OTA for an existing project which uses stm32f091xx.

And it already contains separate bootloader(0x08000000) and application(0x08001000) with their own vector tables.

Currently, when a reset occurs, the bootloader which is remapped to 0x0 will call the application at 0x08001000.

Question:

Both bootloader and application have their own vector table.

But on the internet, I found that Cortex-M0 doesn't have a vector table offset.

Just to know more about it, I tried to create a hard fault on the application and surprisingly, the hard fault is now in a location which is relative to the application and not the bootloader.

This is map of the bootloader:

HardFault_Handler 0x080000e3 Thumb Code 2 startup_stm32f0xx.o(.text)

This is map of the application:

HardFault_Handler 0x08002447 Thumb Code 2 stm32f0xx_startup.o(.text)

Why is this working? I mean when I set a hard fault, it should go to 0x080000e3  but why it is going to 0x08002447? Can someone give me any ideas about what is happening?

    This topic has been closed for replies.
    Best answer by Tesla DeLorean

    Typically on the CM0 you have to copy the vector table into the base of RAM, and then remap that into the zero address space. Register in SYSCFG ​

    1 reply

    Graduate II
    September 27, 2022

    Typically on the CM0 you have to copy the vector table into the base of RAM, and then remap that into the zero address space. Register in SYSCFG ​

    Vmere.1Author
    Visitor II
    September 27, 2022
    ; 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
     DCD NMI_Handler ; NMI Handler
     DCD HardFault_Handler ; Hard Fault Handler
     DCD 0 ; Reserved
     DCD 0 ; Reserved
     DCD 0 ; Reserved

    Now I can relate why the start up file above was defined like this.

    They mentioned it in Data section I found it like this.

    ; 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
     DCD NMI_Handler ; NMI Handler
     DCD HardFault_Handler ; Hard Fault Handler
     DCD 0 ; Reserved
     DCD 0 ; Reserved
     DCD 0 ; Reserved
     DCD 0 ; Reserved
     DCD 0 ; Reserved
     DCD 0 ; Reserved
     DCD 0 ; Reserved
     DCD SVC_Handler ; SVCall Handler
     DCD 0 ; Reserved
     DCD 0 ; Reserved
     DCD PendSV_Handler ; PendSV Handler
     DCD SysTick_Handler ; SysTick Handler

    Thank you.