单片机
返回首页

STM32F10X启动流程

2025-02-25 来源:jianshu

总体流程

1.初始化堆栈指针 SP=_initial_sp,初始化 PC指针=Reset_Handler

2.初始化中断向量表

3.配置系统

4.调用 C库函数_main初始化用户堆栈,然后进入 main函数。


STM32三种启动流程


mode=0x 从flash 启动,正常模式


mode=10 从系统存储器启动  串口下载程序模式


mode=11 内置SRAM 启动   用于程序调试


;******************** (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.;*******************************************************************************; Amount of memory (in bytes) allocated for Stack; Tailor this value to your application needs; Stack Configuration;    Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>; Stack_Size      EQU     0x00000400    ////#define Stack_Size = 0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3 ////伪指令Stack_Mem       SPACE   Stack_Size    ////分配stack大小, Stack_Mem = Stack_Size(0x00000400)__initial_sp                          ////表示栈顶的地址; Heap Configuration;     Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>; Heap_Size       EQU     0x00000200    ////define Heap_Size = 0x00000200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3  ////伪指令__heap_base                           ////表示堆空间的起始地址Heap_Mem        SPACE   Heap_Size     ////分配空间 Heap_Mem 大小为0x00000200__heap_limit                          ////分配空间结束

                PRESERVE8             ////告诉编译器8字节对齐

                THUMB                 ////THUMB 指令集; Vector Table Mapped to Address 0 at Reset///定义只读数据段,实际是CODE 区域【假设启动模式FLASH 启动,那么中断向量的地址是0x8000000】

                AREA    RESET, DATA, READONLY

                EXPORT  __Vectors         ////__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     MemManage_Handler          ; MPU Fault Handler

                DCD     BusFault_Handler           ; Bus Fault Handler

                DCD     UsageFault_Handler         ; Usage Fault Handler

                DCD     0                          ; Reserved

                DCD     0                          ; Reserved

                DCD     0                          ; Reserved

                DCD     0                          ; Reserved

                DCD     SVC_Handler                ; SVCall Handler

                DCD     DebugMon_Handler           ; Debug Monitor Handler

                DCD     0                          ; Reserved

                DCD     PendSV_Handler             ; PendSV Handler

                DCD     SysTick_Handler            ; SysTick Handler                ; 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                                      /////__Vectors_End 结束地址__Vectors_Size  EQU  __Vectors_End - __Vectors   /////__Vectors_Size = __Vectors_End - __Vectors 


                AREA    |.text|, CODE, READONLY; Reset handlerReset_Handler    PROC                           ////复位中断函数,PROC.......ENDP 中间是函数体

                 EXPORT  Reset_Handler             [WEAK] ////Reset_Handler 声明为全局属性

     IMPORT  __main     IMPORT  SystemInit                         ////import指令,在外面定义,下文可能会使用到这些符号

                 LDR     R0, =SystemInit

                 BLX     R0

                 LDR     R0, =__main                 BX      R0

                 ENDP; Dummy Exception Handlers (infinite loops which can be modified)NMI_Handler     PROC

                EXPORT  NMI_Handler                [WEAK]

                B       .

                ENDPHardFault_Handler                PROC

                EXPORT  HardFault_Handler          [WEAK]

                B       .

                ENDPMemManage_Handler                PROC

                EXPORT  MemManage_Handler          [WEAK]

                B       .

                ENDPBusFault_Handler                PROC

                EXPORT  BusFault_Handler           [WEAK]

                B       .

                ENDPUsageFault_Handler                PROC

                EXPORT  UsageFault_Handler         [WEAK]

                B       .

                ENDPSVC_Handler     PROC

                EXPORT  SVC_Handler                [WEAK]

                B       .

                ENDPDebugMon_Handler                PROC

                EXPORT  DebugMon_Handler           [WEAK]

                B       .

                ENDPPendSV_Handler  PROC

                EXPORT  PendSV_Handler             [WEAK]

                B       .

                ENDPSysTick_Handler PROC

                EXPORT  SysTick_Handler            [WEAK]

                B       .

                ENDPDefault_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_IRQHandlerPVD_IRQHandlerTAMPER_IRQHandlerRTC_IRQHandlerFLASH_IRQHandlerRCC_IRQHandlerEXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerDMA1_Channel1_IRQHandlerDMA1_Channel2_IRQHandlerDMA1_Channel3_IRQHandlerDMA1_Channel4_IRQHandlerDMA1_Channel5_IRQHandlerDMA1_Channel6_IRQHandlerDMA1_Channel7_IRQHandlerADC1_2_IRQHandlerUSB_HP_CAN1_TX_IRQHandlerUSB_LP_CAN1_RX0_IRQHandlerCAN1_RX1_IRQHandlerCAN1_SCE_IRQHandlerEXTI9_5_IRQHandlerTIM1_BRK_IRQHandlerTIM1_UP_IRQHandlerTIM1_TRG_COM_IRQHandlerTIM1_CC_IRQHandlerTIM2_IRQHandlerTIM3_IRQHandlerTIM4_IRQHandlerI2C1_EV_IRQHandlerI2C1_ER_IRQHandlerI2C2_EV_IRQHandlerI2C2_ER_IRQHandlerSPI1_IRQHandlerSPI2_IRQHandlerUSART1_IRQHandlerUSART2_IRQHandlerUSART3_IRQHandlerEXTI15_10_IRQHandlerRTCAlarm_IRQHandlerUSBWakeUp_IRQHandler


                B       .


                ENDP


                ALIGN;*******************************************************************************; User Stack and Heap initialization;*******************************************************************************

                 IF      :DEF:__MICROLIB         ////判断是否使用MICROLIB    

                

                 EXPORT  __initial_sp            ////声明为全局属性,外部可以使用

                 EXPORT  __heap_base             ////声明为全局属性,外部可以使用

                 EXPORT  __heap_limit            ////声明为全局属性,外部可以使用

                

                 ELSE


                 IMPORT  __use_two_region_memory ////定义全局标识 __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*****# 对上面文件的说明AREA:伪指令,定义代码段,数据段,

     __initial_sp 如果启动在flash 中,那么__initial_sp 栈顶地址在0x80000000, 0x8000004 位置就Reset_handlerDCD:  开辟地址,类似指针数组,存储都是向量跳转函数


STM32的程序在flash上的存储结构

栈顶指针 MSP 的值会根据程序数据段(包含 bss 段)的大小,加上定义的堆空间的大小,再加上定义的栈空间的大小,最终加起来才会得到栈顶指针的值的,也就是说栈顶指针所指向的地址还和具体的程序定义了多少全局数据有关。栈顶指针的值会保存在启动文件定义 __initial_sp 这个标号中,这个标号具体的数值在程序编译后才会被确定。


STM32的数据在SRAM上的存储结构

  • .data:存放的是已经初始化的全局数据。

  • .bss:存放的是没有初始化或者初始化为0的全局数据。

  • 堆空间:程序员使用 malloc 等函数动态申请的内存空间就是从这里分配的,堆空间的大小可以在启动文件中自定义。

  • 栈空间:栈主要用于程序的局部变量、函数调用、函数参数、中断保存现场等情况的开销的,同样栈空间的大小也可以在启动文件中自定义。

系统中断向量地址:


memory map 地址:

开发使用的资料文件

https://www.st.com/en/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html

https://www.st.com/resource/en/reference_manual/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf

参考文章:
https://www.elecfans.com/d/1802838.html

https://www.st.com/en/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html#documentation



进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 便携式混音器

  • 18W乙类音频放大器

  • 6晶体管H桥

  • USB LED调光器

  • USB自供电声卡

  • AVR LCD温度计—LM35

    相关电子头条文章