Post

Journey Through STM32F103VE Startup - From Power-on to Main()

Journey Through STM32F103VE Startup - From Power-on to Main()

Have you ever wondered what happens when you press the reset button on your STM32 board? Let’s embark on a journey through the startup process of the STM32F103VE, breaking down this complex process into an easy-to-understand story.

The Wake-up Call

Imagine your STM32F103VE as a person waking up in the morning. Just like how we need to follow a specific routine to start our day, the MCU follows its own “morning routine” defined in the startup file (startup_stm32f10x_hd.s).

First Things First: Getting Oriented

1
2
3
4
5
6
7
8
9
10
11
Stack_Size      EQU     0x00000400    ; Like choosing how much space you need
                                      ; 1KB of stack - your working space

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp    ; Your desk is now ready!

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size     ; Storage space for later use
__heap_limit

Just as you need to know where your things are when you wake up, the MCU needs to set up its workspace (stack) and storage area (heap).

The Morning Checklist (Vector Table)

1
2
3
4
5
6
7
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                
__Vectors       DCD     __initial_sp               ; Where to find things
                DCD     Reset_Handler              ; The wake-up routine
                DCD     NMI_Handler                ; Emergency contact
                DCD     HardFault_Handler          ; When things go wrong

Think of this as your morning emergency contacts list - who to call when different types of problems occur.

The Wake-up Routine (Reset_Handler)

1
2
3
4
5
6
7
8
9
10
11
12
13
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                
                ; First cup of coffee - essential initialization
                LDR     R0, =SystemInit
                BLX     R0               
                
                ; Time to start the day!
                LDR     R0, =__main
                BX      R0
                ENDP

This is like your morning routine - get up (SystemInit), get ready, and start your day (main function).

Real-World Customizations

Quick Start Mode

For when you need to get going fast:

1
2
3
4
5
6
7
8
; Like grabbing a quick breakfast
Reset_Handler   PROC
                CPSID   I               ; Do Not Disturb mode
                LDR     R0, =QuickInit  ; Essential tasks only
                BLX     R0
                LDR     R0, =main
                BX      R0              ; Start the day
                ENDP

Safety Check Mode

When you need extra security:

1
2
3
4
5
; Like double-checking everything before leaving
                LDR     R0, =SafetyCheck
                BLX     R0
                CMP     R0, #0          ; All good?
                BNE     Error_Handler   ; Something's wrong!

Debugging Tips: When Things Go Wrong

1. LED Breadcrumbs

1
2
3
4
5
6
7
void DebugPoint1(void)
{
    // Like leaving a trail of breadcrumbs
    LED_ON();
    Delay_ms(100);
    LED_OFF();
}

2. Simple Status Messages

1
2
3
4
5
6
7
8
9
void Debug_Print(const char* msg)
{
    // Quick note to yourself
    while(*msg)
    {
        USART1->DR = *msg++;
        while(!(USART1->SR & USART_SR_TXE));
    }
}

Optimization Tips

For Power Efficiency

1
2
3
4
5
6
void LowPowerInit(void)
{
    // Like turning off unnecessary lights
    RCC->AHBENR &= ~(RCC_AHBENR_DMA1EN);
    PWR->CR |= PWR_CR_LPDS;
}

For Quick Response

1
2
3
4
5
6
void FastInit(void)
{
    // Like preparing everything the night before
    FLASH->ACR |= FLASH_ACR_PRFTBE;    // Quick access mode
    NVIC_SetPriority(SysTick_IRQn, 0); // Priority to alarm clock
}

Food for Thought

Your startup routine should adapt to your needs:

  • Need to wake up quickly? Streamline your morning routine
  • Safety critical? Add more checks
  • Power conscious? Turn off unnecessary systems

Remember: The startup file is like the foundation of your house - take time to build it right, and your application will stand strong.

These concepts become much clearer when we think of them in familiar terms. Just as we optimize our morning routines, we can optimize our MCU’s startup process for different needs and scenarios.

This post is licensed under CC BY 4.0 by the author.