Skip to main content
carlossp
Associate II
March 7, 2023
Question

Where is the STM32F103 start code?

  • March 7, 2023
  • 4 replies
  • 3458 views

Hi,

As far as I understand, for the STM32F103, after a reset or power on without the use of the bootloader, the first task that happens is load SP with the content of address 0x00 (alias of 0x8000000) , followed by the load of the content of address 0x04 to the PC.

My question is where are the code to performs this tasks written?

Thanks.

This topic has been closed for replies.

4 replies

KnarfB
Super User
March 7, 2023

Depends on your tool chain. Look for a startup*.s assembler file in your STM232CubeMX generated project folder.

The startup code could also be written in C with some attributes like:

// Cortex-M startup code using gcc-none-eabi toolchain
#include <stdint.h>
#include <string.h>
 
// symbols provided by the .ld linker script file
extern uint32_t _etext;
extern uint32_t _sdata;
extern uint32_t _edata;
extern uint32_t _sidata;
extern uint32_t _sbss;
extern uint32_t _ebss;
extern uint32_t _estack;
 
extern int main(void);
 
#pragma GCC optimize("O3")
 
__attribute__ ((naked)) 
void Reset_Handler(void)
{
 // copy initialized global variables in .data from flash to SRAM
 memcpy(&_sdata, &_sidata, (size_t)&_edata - (size_t)&_sdata);
 
 // init uninitialized global variables in .bss with zero
 memset(&_sbss, 0, (size_t)&_ebss - (size_t)&_sbss);
 
 // now invoke main()
 main();
 
 // if main() returns:
 for (;;)
 ;
}
 
void* vectors[128] __attribute__((section(".isr_vector"))) = 
{
 &_estack,
 Reset_Handler,
 // more IRQ handlers go here
};

hth

KnarfB

WojtekP1
Associate II
March 7, 2023

Where i decide it is.

Your code fragment is just a right step on proper programming.

Second step would be using open source compiler, -nostdlib

to not waste stack put main in vectors instead of reset handler and then do

void __attribute__ ((noreturn)) main() {

system_init();

while(1) {

//main loop here;

}

}

and in system init do this memcpy, memset. I recommend to configure FLASH_ACR and then clocks first so it gets up to speed as soon as possible. Unless you want to run on lower than default clock then set up clock after init.

If you would make your own linker script stack definition could be much easier - just declare global variable with right section (like noinit).

Too i recommend to not abuse memcpy and memset. Make use of fact that both data and bss is 4 byte aligned at least - you may copy by words.

I like to put stack at beginning, not end of RAM (by defining section in linkerscript), as stack overflow would result in hard crash, not silent overwrite of global variables. But that's my preference.

carlossp
carlosspAuthor
Associate II
March 7, 2023

Hi,

The code I mean is not my code, it is the code that after a reset load SP and PC with the values I put in address 0x00 and 0x04.

This code runs before my code, it is a kind of bootloader?

Tesla DeLorean
Guru
March 7, 2023

No, it's a vector table pointing at start up code.

The function is called Reset_Handler, and it typically contains or calls code to initialize the processor and perform the C run-time start up requirements, typically copying initial content of the statics to RAM, and zeroing other stuff, and in the case of C++ running the constructors, before handing off to the user's main() function.

...
__Vectors DCD __initial_sp ; Top of Stack
 DCD Reset_Handler ; Reset Handler
 DCD NMI_Handler ; NMI Handler
 DCD HardFault_Handler ; Hard Fault Handler
 DCD MemManage_Handler ; MPU Fault Handler
 DCD BusFault_Handler ; Bus Fault Handler
 DCD UsageFault_Handler ; Usage Fault Handler
 DCD SecureFault_Handler ; Secure Fault Handler
...
Reset_Handler PROC
 EXPORT Reset_Handler [WEAK]
 IMPORT SystemInit
 IMPORT __main
 
 LDR SP, =__initial_sp
 
 LDR R0, =SystemInit
 BLX R0
				
 LDR R0, =__main
 BX R0
				
 ENDP
...

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
carlossp
carlosspAuthor
Associate II
March 7, 2023

Thanks all for the answers, they helped me.