Lesson 3 [STM32 startup] startup mode startup file startup process

Keywords: stm32

Basic knowledge framework

Class notes

Startup process after normal reset

Will STM32 execute the main function immediately after reset and power on?

No, before executing the main function, STM32 will experience:

  1. Hardware select boot mode
  2. Read the interrupt vector table of the memory corresponding to the startup mode
  3. Initialization stack
  4. Initialize PC pointer to Reset Handler
  5. Initialize system clock
  6. Execute C library functions__ Main, enter the world of C language and execute the main function

These processes executed before the main function are called STM32 startup processes. Although this process is difficult to understand, it must be mastered

Hardware

There are BOOT0 and BOOT1 pins in the pins led out by STM32 single chip microcomputer. By adding different levels to these two pins, STM32 can enter different startup modes

BOOT0BOOT1storageMemory corresponding address
0XInternal Flash (common)0x0800 0000
10System memory (store the ISP program written by the manufacturer, read-only, run the ISP program, and save the data transmitted from the serial port to the internal Flash)0x1FFF 0000
11Internal sRam (code data will be lost after power failure and can be used to execute temporary code)0x2000 0000

Software

After hardware judgment, STM32 will select the storage medium corresponding to the code (such as internal Flash), and start reading data from the memory base address to find the interrupt vector table

interrupt
Interrupt refers to the behavior that STM32 needs to save the progress of the current task, handle other tasks, handle the exceptions, and then return to the original task.
For example, when a person is eating (current task) and his express arrives (abnormal situation), he puts down his dishes and chopsticks (save the progress), goes to get the express (perform the abnormal task), and then returns home for dinner (return to perform the original task). This is "interruption"


Interrupt vector table
For the machine, the abnormal conditions encountered will not be too complex. All emergencies can be summarized through the interrupt vector table
The interrupt vector table is essentially a 32-bit integer array, which stores the address of the corresponding task function to be executed when an exception occurs. When an exception occurs, the corresponding address will be assigned to the PC register to execute the corresponding task


The following is the interrupt vector table stored in Flash

Priority: the smaller the priority label, the higher the interrupt priority
MSP: Main Stack Pointer refers to the Main Stack Pointer

Taking the Flash memory as an example, after finding the interrupt vector table, STM32 starts to execute the code from the address 0x0000 0000. The first task to be executed is to initialize the main stack pointer MSP, and the next step is to execute the interrupt Reset after Reset (power on again after Reset is also an exception). The corresponding processing function is Reset Handler(). There are two main things to be done by Reset Handler:

  1. Initialize the system clock through the SystemInit() function
  2. Through C library function__ Main, execute the user function main

The above is the general start-up process of STM32 single chip microcomputer

Flash startup file

For the software part of the STM32 startup process, you can modify the startup file stm32f10x_xx.s to configure. According to different models and available resources, xx can be divided into:

The contents of different startup files are similar. Its main task is

  • Initialize heap
  • Initialization stack
  • Configure interrupt handler function Reset Handler
  • Configure system clock
  • Through C library function__ Main, run the user function main
  • User stack configuration

Start up with medium capacity_ stm32f10x_ HD. S file as an example, the following is the file content:

;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name          : startup_stm32f10x_md.s
;* Author             : MCD Application Team
;* Version            : V3.5.0
;* Date               : 11-March-2011
;* Description        : STM32F10x Medium Density Devices vector table for MDK-ARM 
;*                      toolchain.  
;*                      This module performs:
;*                      - Set the initial SP
;*                      - Set the initial PC == Reset_Handler
;*                      - Set the vector table entries with the exceptions ISR address
;*                      - Configure the clock system
;*                      - Branches to __main in the C library (which eventually
;*                        calls main()).
;*                      After Reset the CortexM3 processor is in Thread mode,
;*                      priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>   
;*******************************************************************************
; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;*******************************************************************************

; Data segment
; Stack initialization
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size      EQU     0x00000400                          ; Defines the stack size as 1 KB
                AREA    STACK, NOINIT, READWRITE, ALIGN=3   ; Assign a data segment with the name`STACK`,The data segment is not initialized,Can read and write, 8 (2)^3)byte alignment 
Stack_Mem       SPACE   Stack_Size                          ; Assign 1 to stack KB Space of
__initial_sp                                                ; Stack top address. The stack grows from high address to low address

; Heap initialization
; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000200                         ; The size of the defined heap is 256 B
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3   ; Assign a data segment with the name`HEAP`,The data segment is not initialized,Can read and write, 8 (2)^3)byte alignment 
__heap_base                                                ; Start address of heap
Heap_Mem        SPACE   Heap_Size                          ; Allocate 256 to heap B Space of
__heap_limit                                               ; End address of heap

                PRESERVE8                                  ; Stack of current file, aligned by 8 bytes
                THUMB                                      ; Indicates that the following instructions are compatible THUMB Instructions. THUBM yes ARM Previous instruction sets, 16 bit,Now? Cortex-M Series are used THUMB-2 Instruction set, THUMB-2 It is 32-bit, compatible with 16 bit and 32-bit instructions, yes THUMB Superset of

; Configure the interrupt vector table from address 0 x0000 0000 start
; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY              ; Assign a data segment with the name`RESET`,This segment is read-only
                EXPORT  __Vectors                          ; Define external label__Vectors,Read from external file
                EXPORT  __Vectors_End                      ; Define external label__Vectors_End,Read from external file   
                EXPORT  __Vectors_Size                     ; Define external label__Vectors_Size,Read from external file
;Allocate memory space for the address of the interrupt processing function and store it in the vector table (Note: the address is stored). The specific contents can be found in STM32 Chinese Reference Manual
__Vectors       DCD     __initial_sp                       ; Reserve
                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     0                                  ; Reserve
                DCD     0                                  ; Reserve
                DCD     0                                  ; Reserve
                DCD     0                                  ; Reserve
                DCD     SVC_Handler                        ; SVCall Handler
                DCD     DebugMon_Handler                   ; Debug Monitor Handler
                DCD     0                                  ; Reserve
                DCD     PendSV_Handler                     ; PendSV Handler
                DCD     SysTick_Handler                    ; SysTick Handler

                ; Interrupt address of peripheral
                ; External Interrupts
                DCD     WWDG_IRQHandler                    ; Window Watchdog
                DCD     PVD_IRQHandler                     ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler                  ; Tamper
                DCD     RTC_IRQHandler                     ; RTC
                DCD     FLASH_IRQHandler                   ; Flash
                DCD     RCC_IRQHandler                     ; RCC
                DCD     EXTI0_IRQHandler                   ; EXTI Line 0
                DCD     EXTI1_IRQHandler                   ; EXTI Line 1
                DCD     EXTI2_IRQHandler                   ; EXTI Line 2
                DCD     EXTI3_IRQHandler                   ; EXTI Line 3
                DCD     EXTI4_IRQHandler                   ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler           ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler           ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler           ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler           ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler           ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler           ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler           ; DMA1 Channel 7
                DCD     ADC1_2_IRQHandler                  ; ADC1_2
                DCD     USB_HP_CAN1_TX_IRQHandler          ; USB High Priority or CAN1 TX
                DCD     USB_LP_CAN1_RX0_IRQHandler         ; USB Low  Priority or CAN1 RX0
                DCD     CAN1_RX1_IRQHandler                ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler                ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler                 ; EXTI Line 9..5
                DCD     TIM1_BRK_IRQHandler                ; TIM1 Break
                DCD     TIM1_UP_IRQHandler                 ; TIM1 Update
                DCD     TIM1_TRG_COM_IRQHandler            ; TIM1 Trigger and Commutation
                DCD     TIM1_CC_IRQHandler                 ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler                    ; TIM2
                DCD     TIM3_IRQHandler                    ; TIM3
                DCD     TIM4_IRQHandler                    ; TIM4
                DCD     I2C1_EV_IRQHandler                 ; I2C1 Event
                DCD     I2C1_ER_IRQHandler                 ; I2C1 Error
                DCD     I2C2_EV_IRQHandler                 ; I2C2 Event
                DCD     I2C2_ER_IRQHandler                 ; I2C2 Error
                DCD     SPI1_IRQHandler                    ; SPI1
                DCD     SPI2_IRQHandler                    ; SPI2
                DCD     USART1_IRQHandler                  ; USART1
                DCD     USART2_IRQHandler          		   ; USART2
                DCD     USART3_IRQHandler                  ; USART3
                DCD     EXTI15_10_IRQHandler               ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler                ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler               ; USB Wakeup from suspend
__Vectors_End                                              ; End of interrupt vector table
__Vectors_Size  EQU  __Vectors_End - __Vectors  		   ; Calculate vector table size

; Code snippet
                AREA    |.text|, CODE, READONLY            ; Assign a code segment with a data segment name of`|.text|`,Define a code segment that is read-only

; Reset interrupt function
; Reset handler
Reset_Handler    PROC                                      ; Define functions, PROC...ENDP Represents the beginning and end of a function, with the function content in the middle
                 EXPORT  Reset_Handler             [WEAK]  ; bring Reset Handler Function has global properties, and other external functions can also use this function
     IMPORT  __main                                        ; Description This function is externally defined
     IMPORT  SystemInit
                 LDR     R0, =SystemInit				   ; external SystemInit Function to initialize the system clock
                 BLX     R0
                 LDR     R0, =__main				       ; adopt C Library function__main,Can enter
                 BX      R0
                 ENDP

; Dummy Exception Handlers (infinite loops which can be modified)
; [WEAK]The instruction will preferentially use external link symbols, but without a prototype, the compiler will not report an error
NMI_Handler     PROC
                EXPORT  NMI_Handler                [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler          [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler           [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler         [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler                [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler           [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler             [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler            [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  WWDG_IRQHandler            [WEAK]
                EXPORT  PVD_IRQHandler             [WEAK]
                EXPORT  TAMPER_IRQHandler          [WEAK]
                EXPORT  RTC_IRQHandler             [WEAK]
                EXPORT  FLASH_IRQHandler           [WEAK]
                EXPORT  RCC_IRQHandler             [WEAK]
                EXPORT  EXTI0_IRQHandler           [WEAK]
                EXPORT  EXTI1_IRQHandler           [WEAK]
                EXPORT  EXTI2_IRQHandler           [WEAK]
                EXPORT  EXTI3_IRQHandler           [WEAK]
                EXPORT  EXTI4_IRQHandler           [WEAK]
                EXPORT  DMA1_Channel1_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel2_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel3_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel4_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel5_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel6_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel7_IRQHandler   [WEAK]
                EXPORT  ADC1_2_IRQHandler          [WEAK]
                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]
                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]
                EXPORT  CAN1_RX1_IRQHandler        [WEAK]
                EXPORT  CAN1_SCE_IRQHandler        [WEAK]
                EXPORT  EXTI9_5_IRQHandler         [WEAK]
                EXPORT  TIM1_BRK_IRQHandler        [WEAK]
                EXPORT  TIM1_UP_IRQHandler         [WEAK]
                EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]
                EXPORT  TIM1_CC_IRQHandler         [WEAK]
                EXPORT  TIM2_IRQHandler            [WEAK]
                EXPORT  TIM3_IRQHandler            [WEAK]
                EXPORT  TIM4_IRQHandler            [WEAK]
                EXPORT  I2C1_EV_IRQHandler         [WEAK]
                EXPORT  I2C1_ER_IRQHandler         [WEAK]
                EXPORT  I2C2_EV_IRQHandler         [WEAK]
                EXPORT  I2C2_ER_IRQHandler         [WEAK]
                EXPORT  SPI1_IRQHandler            [WEAK]
                EXPORT  SPI2_IRQHandler            [WEAK]
                EXPORT  USART1_IRQHandler          [WEAK]
                EXPORT  USART2_IRQHandler          [WEAK]
                EXPORT  USART3_IRQHandler          [WEAK]
                EXPORT  EXTI15_10_IRQHandler       [WEAK]
                EXPORT  RTCAlarm_IRQHandler        [WEAK]
                EXPORT  USBWakeUp_IRQHandler       [WEAK]

WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler

                B       .

                ENDP

                ALIGN

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB           
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END

;******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE*****

Basic knowledge framework Xmind file download

Link: Resource download

Posted by poe on Tue, 28 Sep 2021 10:29:45 -0700