相应的视频教程:https://www.bilibili.com/video/BV1pW411p7ae?p=1
;****************************************************************************** ;* File Name : startup_stm32l010x4.s ;* Author : MCD Application Team ;* Description : STM32l010x4 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 ;* - Branches to __main in the C library (which eventually ;* calls main()). ;* After Reset the Cortex-M0+ processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. ;****************************************************************************** ;* @attention ;* ;* Copyright (c) 2016 STMicroelectronics. ;* All rights reserved. ;* ;* This software component is licensed by ST under BSD 3-Clause license, ;* the "License"; You may not use this file except in compliance with the ;* License. You may obtain a copy of the License at: ;* opensource.org/licenses/BSD-3-Clause ;* ;****************************************************************************** ; 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 0x400 ;EQU伪指令,相当于宏定义,即#define Stack_Size 0x400 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;AREA伪指令,用于定义代码段或数据段。STACK表段名,NOINIT表不初始化,READWRITE可读可写,ALIGN按2^3字节对齐 Stack_Mem SPACE Stack_Size ;SPACE用于分配一定大小的内存空间,单位为子节 __initial_sp ;__initial_sp紧挨着SPACE语句,表示栈的结束地址。也就是栈顶的地址 ; <h> Heap Configuration ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> Heap_Size EQU 0x200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base ;在SPACE前出现这条代码代表的是堆的起始地址 Heap_Mem SPACE Heap_Size __heap_limit ;在SPACE后出现这条代码代表的是堆的结束地址 PRESERVE8 ;指定当前文件的堆栈按照 8 字节对齐 THUMB ;表示后面指令兼容 THUMB 指令 ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size __Vectors DCD __initial_sp ; Top of Stack。DCD开辟以字为单位的内存,四子节对齐,并要求初始化 DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler ; External Interrupts DCD WWDG_IRQHandler ; Window Watchdog DCD 0 ; Reserved DCD RTC_IRQHandler ; RTC through EXTI Line DCD FLASH_IRQHandler ; FLASH DCD RCC_IRQHandler ; RCC DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 DCD 0 ; Reserved DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3 DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel 4 and Channel 5 DCD ADC1_IRQHandler ; ADC1 DCD LPTIM1_IRQHandler ; LPTIM1 DCD 0 ; Reserved DCD TIM2_IRQHandler ; TIM2 DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD TIM21_IRQHandler ; TIM21 DCD 0 ; Reserved DCD 0 ; Reserved DCD I2C1_IRQHandler ; I2C1 DCD 0 ; Reserved DCD SPI1_IRQHandler ; SPI1 DCD 0 ; Reserved DCD 0 ; Reserved DCD USART2_IRQHandler ; USART2 DCD LPUART1_IRQHandler ; LPUART1 DCD 0 ; Reserved DCD 0 ; Reserved __Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors AREA |.text|, CODE, READONLY ; Reset handler routine Reset_Handler PROC ;PROC和ENDP伪指令,把程序段分成若干个过程,使程序结构更加清晰 EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =__initial_sp ; set stack pointer MSR MSP, R0 ;;Check if boot space corresponds to system memory LDR R0,=0x00000004 ;04地址存放了Reset_Handler地址 LDR R1, [R0] ;Reset_Handler地址有可能是0x2000 0000左右(sram启动),也有可能是0x0800 0000左右(flash启动),也有可能是0x1fff ec00左右(system memory启动) LSRS R1, R1, #24 ;Reset_Handler地址向右移动24bit,剩余高八位移到低八位 LDR R2,=0x1F CMP R1, R2 ;相等则说明是从system memory启动(串口启动) BNE ApplicationStart ;不相等则跳到ApplicationStart ;; SYSCFG clock enable LDR R0,=0x40021034 ;如果是串口启动则从这里开始执行,主要是配置一些时钟 LDR R1,=0x00000001 STR R1, [R0] ;; Set CFGR1 register with flash memory remap at address 0 ;CFGR1是时钟配置寄存器 LDR R0,=0x40010000 LDR R1,=0x00000000 STR R1, [R0] ApplicationStart LDR R0, =SystemInit ;主要在这里面进行时钟配置,该函数定义在system_stm3210xx.c中 BLX R0 ;BLX可以返回的跳转,使程序跳转到R0指示的位置处,并将PC中的内容保存到R14中 ;__main地址装入R0寄存器,该函数为编译系统提供的c/c++标准库函数里的一个初始化子程序 ;__main函数主要处理两个工作:1、完成映象文件的初始化工作。2、调用_rt_entry库函数进入到用户程序。 ;__main是一个库函数,在它调用的_rt_entry函数的第一条指令就是调用本程序的__user_initial_stackheap函数,初始化代码的堆和栈, ;然后初始化C运行库,接下来调用用户的main()函数 LDR R0, =__main BX R0 ;BX,不返回的跳转 ENDP ; Dummy Exception Handlers (infinite loops which can be modified) NMI_Handler PROC EXPORT NMI_Handler [WEAK] ;弱声明 B . ; "B ."表示程序跳转到此处,也就是不停在本行跳转,即死循环 ENDP HardFault_Handler PROC EXPORT HardFault_Handler [WEAK] B . ENDP SVC_Handler PROC EXPORT SVC_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 RTC_IRQHandler [WEAK] EXPORT FLASH_IRQHandler [WEAK] EXPORT RCC_IRQHandler [WEAK] EXPORT EXTI0_1_IRQHandler [WEAK] EXPORT EXTI2_3_IRQHandler [WEAK] EXPORT EXTI4_15_IRQHandler [WEAK] EXPORT DMA1_Channel1_IRQHandler [WEAK] EXPORT DMA1_Channel2_3_IRQHandler [WEAK] EXPORT DMA1_Channel4_5_IRQHandler [WEAK] EXPORT ADC1_IRQHandler [WEAK] EXPORT LPTIM1_IRQHandler [WEAK] EXPORT TIM2_IRQHandler [WEAK] EXPORT TIM21_IRQHandler [WEAK] EXPORT I2C1_IRQHandler [WEAK] EXPORT SPI1_IRQHandler [WEAK] EXPORT USART2_IRQHandler [WEAK] EXPORT LPUART1_IRQHandler [WEAK] WWDG_IRQHandler RTC_IRQHandler FLASH_IRQHandler RCC_IRQHandler EXTI0_1_IRQHandler EXTI2_3_IRQHandler EXTI4_15_IRQHandler DMA1_Channel1_IRQHandler DMA1_Channel2_3_IRQHandler DMA1_Channel4_5_IRQHandler ADC1_IRQHandler LPTIM1_IRQHandler TIM2_IRQHandler TIM21_IRQHandler I2C1_IRQHandler SPI1_IRQHandler USART2_IRQHandler LPUART1_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 STMicroelectronics *****END OF FILE*****