你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32启动文件详解及SystemInit函数分析

[复制链接]
Lumhao 发布时间:2016-7-20 11:05
先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000然后在RAM中分配变量使用的堆然后在CODE区(flash)分配中断向量表,flash的起始地址为0x0800_0000,该中断向量表就从这个起始地址开始分配分配完成后,再定义和实现相应的中断函数,所有的中断函数全部带有[weak]特性,即弱定义,如果编译器发现在别处文件中定义了同名函数,在链接时用别处的地址进行链接。中断函数仅仅实现了Reset_Handler,其他要么是死循环,要么仅仅定义了函数名称STM32被设置为从内部FLASH启动时(这也是最常见的一种情况),当STM32遇到复位信号后,从0x0800_0000处取出栈顶地址存放于MSP寄存器,从0x0800_0004处取出复位中断服务入口地址放入PC寄存器,继而执行复位中断服务程序Reset_Handler,Reset_Handler仅仅执行了两个函数调用,一个是SystemInit,另一个__main,SystemInit定义在system_stm32f10x.c中,主要初始化了STM的时钟系统:HSI,HSE,LSI,LSE,PLL,SYSCLK,USBCLK,APECLK等等.__main函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main()函数,来到C的世界。
  1. Stack_Size      EQU     0x00000400  ;//定义堆栈大小
  2.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3  ;//定义一个数据段 按8字节对齐    ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0
  3. Stack_Mem       SPACE   Stack_Size    ;//保留Stack_Size大小的堆栈空间 分 配连续 Stack_Size 字节的存储单元并初始化为 0
  4. __initial_sp  ;//标号,代表堆栈顶部地址,后面有用
  5.                                                   
  6. <h> Heap Configuration
  7.    <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
  8. </h>
  9. Heap_Size       EQU     0x00000200    ;//定义堆空间大小
  10.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3  ;//定义一个数据段,8字节对齐
  11. __heap_base      ;//标号,代表堆末底部地址,后面有用
  12. Heap_Mem        SPACE   Heap_Size     ;//保留Heap_Size的堆空间  
  13. __heap_limit     ;//标号,代表堆界限地址,后面有用
  14.     PRESERVE8 指令指定当前文件保持堆栈八字节对齐。 它设置 PRES8 编译属性以通知链接器。
  15.     链接器检查要求堆栈八字节对齐的任何代码是否仅由保持堆栈八字节对齐的代码直接或间接地调用。
  16.                 PRESERVE8 ;//指示编译器8字节对齐
  17.                 THUMB   ;//指示编译器以后的指令为THUMB指令

  18. 中断向量表定义
  19. Vector Table Mapped to Address 0 at Reset
  20.                 AREA    RESET, DATA, READONLY   ;//定义只读数据段,其实放在CODE区,位于0地址
  21.                 EXPORT  __Vectors    ;EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用
  22.                 EXPORT  __Vectors_End
  23.                 EXPORT  __Vectors_Size
  24. __Vectors       DCD     __initial_sp               ; Top of Stack  ;给__initial_sp分配4字节32位的地址0x0
  25.                 DCD     Reset_Handler              ; Reset Handler ; 给标号Reset Handler分配地址为0x00000004
  26.                 DCD     NMI_Handler                ; NMI Handler ; 给标号NMI Handler分配地址0x00000008
  27.                 DCD     HardFault_Handler          ; Hard Fault Handler
  28.                 DCD     MemManage_Handler          ; MPU Fault Handler
  29.                 DCD     BusFault_Handler           ; Bus Fault Handler
  30.                 DCD     UsageFault_Handler         ; Usage Fault Handler
  31.                 DCD     0                          ; Reserved  ; 这种形式就是保留地址,不给任何标号分配
  32.                 DCD     0                          ; Reserved
  33.                 DCD     0                          ; Reserved
  34.                 DCD     0                          ; Reserved
  35.                 DCD     SVC_Handler                ; SVCall Handler
  36.                 DCD     DebugMon_Handler           ; Debug Monitor Handler
  37.                 DCD     0                          ; Reserved
  38.                 DCD     PendSV_Handler             ; PendSV Handler
  39.                 DCD     SysTick_Handler            ; SysTick Handler
  40.                 ; External Interrupts
  41.                 DCD     WWDG_IRQHandler            ; Window Watchdog
  42.                 DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
  43.                 DCD     TAMPER_IRQHandler          ; Tamper
  44.                 DCD     RTC_IRQHandler             ; RTC
  45.                 DCD     FLASH_IRQHandler           ; Flash
  46.                 DCD     RCC_IRQHandler             ; RCC
  47.                 DCD     EXTI0_IRQHandler           ; EXTI Line 0
  48.                 DCD     EXTI1_IRQHandler           ; EXTI Line 1
  49.                 DCD     EXTI2_IRQHandler           ; EXTI Line 2
  50.                 DCD     EXTI3_IRQHandler           ; EXTI Line 3
  51.                 DCD     EXTI4_IRQHandler           ; EXTI Line 4
  52.                 DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
  53.                 DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
  54.                 DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
  55.                 DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
  56.                 DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
  57.                 DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
  58.                 DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
  59.                 DCD     ADC1_2_IRQHandler          ; ADC1 & ADC2
  60.                 DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
  61.                 DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
  62.                 DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
  63.                 DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
  64.                 DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
  65.                 DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
  66.                 DCD     TIM1_UP_IRQHandler         ; TIM1 Update
  67.                 DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
  68.                 DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
  69.                 DCD     TIM2_IRQHandler            ; TIM2
  70.                 DCD     TIM3_IRQHandler            ; TIM3
  71.                 DCD     TIM4_IRQHandler            ; TIM4
  72.                 DCD     I2C1_EV_IRQHandler         ; I2C1 Event
  73.                 DCD     I2C1_ER_IRQHandler         ; I2C1 Error
  74.                 DCD     I2C2_EV_IRQHandler         ; I2C2 Event
  75.                 DCD     I2C2_ER_IRQHandler         ; I2C2 Error
  76.                 DCD     SPI1_IRQHandler            ; SPI1
  77.                 DCD     SPI2_IRQHandler            ; SPI2
  78.                 DCD     USART1_IRQHandler          ; USART1
  79.                 DCD     USART2_IRQHandler          ; USART2
  80.                 DCD     USART3_IRQHandler          ; USART3
  81.                 DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
  82.                 DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
  83.                 DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
  84.                 DCD     TIM8_BRK_IRQHandler        ; TIM8 Break
  85.                 DCD     TIM8_UP_IRQHandler         ; TIM8 Update
  86.                 DCD     TIM8_TRG_COM_IRQHandler    ; TIM8 Trigger and Commutation
  87.                 DCD     TIM8_CC_IRQHandler         ; TIM8 Capture Compare
  88.                 DCD     ADC3_IRQHandler            ; ADC3
  89.                 DCD     FSMC_IRQHandler            ; FSMC
  90.                 DCD     SDIO_IRQHandler            ; SDIO
  91.                 DCD     TIM5_IRQHandler            ; TIM5
  92.                 DCD     SPI3_IRQHandler            ; SPI3
  93.                 DCD     UART4_IRQHandler           ; UART4
  94.                 DCD     UART5_IRQHandler           ; UART5
  95.                 DCD     TIM6_IRQHandler            ; TIM6
  96.                 DCD     TIM7_IRQHandler            ; TIM7
  97.                 DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1
  98.                 DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2
  99.                 DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3
  100.                 DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
  101. __Vectors_End
  102. __Vectors_Size  EQU  __Vectors_End - __Vectors
  103.                 AREA    |.text|, CODE, READONLY ;代码段定义

  104. Reset Handler
  105. 利用PROC、ENDP这一对伪指令把程序段分为若干个过程,使程序的结构加清晰
  106. Reset_Handler   PROC   ;过程的开始
  107.                 EXPORT  Reset_Handler             [WEAK];[WEAK] 弱定义,意思是如果在别处也定义该标号(函数),在链接时用别处的地址。
  108.               ;如果没有其它定方定义,编译器也不报错,以此处地址进行链接。
  109.               ;EXPORT提示编译器该标号可以为外部文件引用。
  110.                 IMPORT  __main    ;通知编译器要使用的标号在其他文件
  111.                 IMPORT  SystemInit
  112.                 LDR     R0, =SystemInit
  113.                 BLX     R0          ;BX是ARM指令集和THUMB指令集之间程序的跳转     
  114.                 LDR     R0, =__main ;使用“=”表示LDR目前是伪指令不是标准指令。这里是把__main的地址给RO。
  115.                 BX      R0   ;BX是ARM指令集和THUMB指令集之间程序的跳转
  116.                 ENDP     ;过程的结束
  117.                
  118. Dummy Exception Handlers (infinite loops which can be modified)
  119. NMI_Handler     PROC
  120.                 EXPORT  NMI_Handler                [WEAK]
  121.                 B       .      ;原地跳转(即无限循环),
  122.                 ENDP
  123. HardFault_Handler\
  124.                 PROC
  125.                 EXPORT  HardFault_Handler          [WEAK]
  126.                 B       .
  127.                 ENDP
  128. MemManage_Handler\
  129.                 PROC
  130.                 EXPORT  MemManage_Handler          [WEAK]
  131.                 B       .
  132.                 ENDP
  133. BusFault_Handler\
  134.                 PROC
  135.                 EXPORT  BusFault_Handler           [WEAK]
  136.                 B       .
  137.                 ENDP
  138. UsageFault_Handler\
  139.                 PROC
  140.                 EXPORT  UsageFault_Handler         [WEAK]
  141.                 B       .
  142.                 ENDP
  143. SVC_Handler     PROC
  144.                 EXPORT  SVC_Handler                [WEAK]
  145.                 B       .
  146.                 ENDP
  147. DebugMon_Handler\
  148.                 PROC
  149.                 EXPORT  DebugMon_Handler           [WEAK]
  150.                 B       .
  151.                 ENDP
  152. PendSV_Handler  PROC
  153.                 EXPORT  PendSV_Handler             [WEAK]
  154.                 B       .
  155.                 ENDP
  156. SysTick_Handler PROC
  157.                 EXPORT  SysTick_Handler            [WEAK]
  158.                 B       .
  159.                 ENDP
  160. Default_Handler PROC
  161.                 EXPORT  WWDG_IRQHandler            [WEAK]
  162.                 EXPORT  PVD_IRQHandler             [WEAK]
  163.                 EXPORT  TAMPER_IRQHandler          [WEAK]
  164.                 EXPORT  RTC_IRQHandler             [WEAK]
  165.                 EXPORT  FLASH_IRQHandler           [WEAK]
  166.                 EXPORT  RCC_IRQHandler             [WEAK]
  167.                 EXPORT  EXTI0_IRQHandler           [WEAK]
  168.                 EXPORT  EXTI1_IRQHandler           [WEAK]
  169.                 EXPORT  EXTI2_IRQHandler           [WEAK]
  170.                 EXPORT  EXTI3_IRQHandler           [WEAK]
  171.                 EXPORT  EXTI4_IRQHandler           [WEAK]
  172.                 EXPORT  DMA1_Channel1_IRQHandler   [WEAK]
  173.                 EXPORT  DMA1_Channel2_IRQHandler   [WEAK]
  174.                 EXPORT  DMA1_Channel3_IRQHandler   [WEAK]
  175.                 EXPORT  DMA1_Channel4_IRQHandler   [WEAK]
  176.                 EXPORT  DMA1_Channel5_IRQHandler   [WEAK]
  177.                 EXPORT  DMA1_Channel6_IRQHandler   [WEAK]
  178.                 EXPORT  DMA1_Channel7_IRQHandler   [WEAK]
  179.                 EXPORT  ADC1_2_IRQHandler          [WEAK]
  180.                 EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]
  181.                 EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]
  182.                 EXPORT  CAN1_RX1_IRQHandler        [WEAK]
  183.                 EXPORT  CAN1_SCE_IRQHandler        [WEAK]
  184.                 EXPORT  EXTI9_5_IRQHandler         [WEAK]
  185.                 EXPORT  TIM1_BRK_IRQHandler        [WEAK]
  186.                 EXPORT  TIM1_UP_IRQHandler         [WEAK]
  187.                 EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]
  188.                 EXPORT  TIM1_CC_IRQHandler         [WEAK]
  189.                 EXPORT  TIM2_IRQHandler            [WEAK]
  190.                 EXPORT  TIM3_IRQHandler            [WEAK]
  191.                 EXPORT  TIM4_IRQHandler            [WEAK]
  192.                 EXPORT  I2C1_EV_IRQHandler         [WEAK]
  193.                 EXPORT  I2C1_ER_IRQHandler         [WEAK]
  194.                 EXPORT  I2C2_EV_IRQHandler         [WEAK]
  195.                 EXPORT  I2C2_ER_IRQHandler         [WEAK]
  196.                 EXPORT  SPI1_IRQHandler            [WEAK]
  197.                 EXPORT  SPI2_IRQHandler            [WEAK]
  198.                 EXPORT  USART1_IRQHandler          [WEAK]
  199.                 EXPORT  USART2_IRQHandler          [WEAK]
  200.                 EXPORT  USART3_IRQHandler          [WEAK]
  201.                 EXPORT  EXTI15_10_IRQHandler       [WEAK]
  202.                 EXPORT  RTCAlarm_IRQHandler        [WEAK]
  203.                 EXPORT  USBWakeUp_IRQHandler       [WEAK]
  204.                 EXPORT  TIM8_BRK_IRQHandler        [WEAK]
  205.                 EXPORT  TIM8_UP_IRQHandler         [WEAK]
  206.                 EXPORT  TIM8_TRG_COM_IRQHandler    [WEAK]
  207.                 EXPORT  TIM8_CC_IRQHandler         [WEAK]
  208.                 EXPORT  ADC3_IRQHandler            [WEAK]
  209.                 EXPORT  FSMC_IRQHandler            [WEAK]
  210.                 EXPORT  SDIO_IRQHandler            [WEAK]
  211.                 EXPORT  TIM5_IRQHandler            [WEAK]
  212.                 EXPORT  SPI3_IRQHandler            [WEAK]
  213.                 EXPORT  UART4_IRQHandler           [WEAK]
  214.                 EXPORT  UART5_IRQHandler           [WEAK]
  215.                 EXPORT  TIM6_IRQHandler            [WEAK]
  216.                 EXPORT  TIM7_IRQHandler            [WEAK]
  217.                 EXPORT  DMA2_Channel1_IRQHandler   [WEAK]
  218.                 EXPORT  DMA2_Channel2_IRQHandler   [WEAK]
  219.                 EXPORT  DMA2_Channel3_IRQHandler   [WEAK]
  220.                 EXPORT  DMA2_Channel4_5_IRQHandler [WEAK]
  221. WWDG_IRQHandler
  222. PVD_IRQHandler
  223. TAMPER_IRQHandler
  224. RTC_IRQHandler
  225. FLASH_IRQHandler
  226. RCC_IRQHandler
  227. EXTI0_IRQHandler
  228. EXTI1_IRQHandler
  229. EXTI2_IRQHandler
  230. EXTI3_IRQHandler
  231. EXTI4_IRQHandler
  232. DMA1_Channel1_IRQHandler
  233. DMA1_Channel2_IRQHandler
  234. DMA1_Channel3_IRQHandler
  235. DMA1_Channel4_IRQHandler
  236. DMA1_Channel5_IRQHandler
  237. DMA1_Channel6_IRQHandler
  238. DMA1_Channel7_IRQHandler
  239. ADC1_2_IRQHandler
  240. USB_HP_CAN1_TX_IRQHandler
  241. USB_LP_CAN1_RX0_IRQHandler
  242. CAN1_RX1_IRQHandler
  243. CAN1_SCE_IRQHandler
  244. EXTI9_5_IRQHandler
  245. TIM1_BRK_IRQHandler
  246. TIM1_UP_IRQHandler
  247. TIM1_TRG_COM_IRQHandler
  248. TIM1_CC_IRQHandler
  249. TIM2_IRQHandler
  250. TIM3_IRQHandler
  251. TIM4_IRQHandler
  252. I2C1_EV_IRQHandler
  253. I2C1_ER_IRQHandler
  254. I2C2_EV_IRQHandler
  255. I2C2_ER_IRQHandler
  256. SPI1_IRQHandler
  257. SPI2_IRQHandler
  258. USART1_IRQHandler
  259. USART2_IRQHandler
  260. USART3_IRQHandler
  261. EXTI15_10_IRQHandler
  262. RTCAlarm_IRQHandler
  263. USBWakeUp_IRQHandler
  264. TIM8_BRK_IRQHandler
  265. TIM8_UP_IRQHandler
  266. TIM8_TRG_COM_IRQHandler
  267. TIM8_CC_IRQHandler
  268. ADC3_IRQHandler
  269. FSMC_IRQHandler
  270. SDIO_IRQHandler
  271. TIM5_IRQHandler
  272. SPI3_IRQHandler
  273. UART4_IRQHandler
  274. UART5_IRQHandler
  275. TIM6_IRQHandler
  276. TIM7_IRQHandler
  277. DMA2_Channel1_IRQHandler
  278. DMA2_Channel2_IRQHandler
  279. DMA2_Channel3_IRQHandler
  280. DMA2_Channel4_5_IRQHandler
  281.                 B       .
  282.                 ENDP
  283.                 ALIGN ;填充字节使地址对齐
  284. *******************************************************************************
  285. User Stack and Heap initialization
  286. *******************************************************************************
  287. 堆和栈的初始化
  288.                  IF      :DEF:__MICROLIB ;“DEF”的用法——:DEF:X 就是说X定义了则为真,否则为假
  289.                        ;如果定义了MICORLIB,
  290.                  EXPORT  __initial_sp  ;则将栈顶地址,
  291.                  EXPORT  __heap_base  ;堆起始地址赋予全局属性,
  292.                  EXPORT  __heap_limit  ;堆末端界限地址赋予全局属性,使外部程序可调用
  293.                
  294.                  ELSE  ;如果没定义__MICROLIB,则使用默认的C运行时库
  295.                
  296.                  IMPORT  __use_two_region_memory  ;;通知编译器要使用的标号在其他文件__use_two_region_memory   
  297.                  EXPORT  __user_initial_stackheap ;声明全局标号__user_initial_stackheap,这样外程序也可调用此标号
  298.              ;则进行堆栈和堆的赋值,在__main函数执行过程中调用

  299.     ;如果使用默认的C库,程序启动过程中就不会执行该标号下的代码
  300. __user_initial_stackheap     ;标号__user_initial_stackheap,表示用户堆栈初始化程序入口
  301.         ;//则进行堆栈和堆的赋值,在__main函数执行过程中调用。
  302.                  LDR     R0, =  Heap_Mem     ;保存堆始地址
  303.                  LDR     R1, =(Stack_Mem + Stack_Size) ;保存栈的大小
  304.                  LDR     R2, = (Heap_Mem +  Heap_Size)  ;保存堆的大小
  305.                  LDR     R3, = Stack_Mem    ;保存栈顶指针
  306.                  BX      LR
  307.                  ALIGN  ;填充字节使地址对齐

  308.                  ENDIF
  309.      
  310.                  END
复制代码


收藏 3 评论2 发布时间:2016-7-20 11:05

举报

2个回答
wolfgang2015 回答时间:2016-7-20 11:36:25
优秀~~~~~~~~~~~
stary666 回答时间:2016-7-20 16:05:58

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版