stm32f103zet6启动文件详解

发布时间:2023-09-26  

  启动文件这部分和arm11的还是很类似的,是开发板上电后执行的第一段代码,唯一不同的感觉的就是比arm11的启动文件简单多了,下面的一些代码解释都是和arm11对照来说的,上代码吧,先声明,我使用的是3.5的库!芯片的具体型号是stm32f103zet6!


  首先明白一点自己所用的板子的简单介绍采用STM32F103系列最高端配置芯片STM32F103ZET6,Cortex-M3内核32位处理器,72M主频,LQFP144封装,片内FLASH容量:512K,片内SRAM容量:64。所以采用的是sartup_stm32f10x_hd.s这个启动文件,这是型号所决定的,当然,如果你自己想要写启动文件的另当别论!


  代码程序:

  Stack_Size EQU 0x00000400//这里是定义了栈的大小

  AREA STACK, NOINIT, READWRITE, ALIGN=3 //AREA表示开辟一个新的段(数据或者代码)后面就指定了该段的属性

  //名称为stack,未初始化,可读写,以2*2*2 = 8字节方式对齐

  //所谓字节对齐就是就是该代码段的指令地址能够被8整除,Cortex-M3

  //的指令地址要求是4字节对齐的,要求不同罢了!

  Stack_Mem SPACE Stack_Size //分配堆栈空间,将Stack_Size的首地址给Stack_Mem,SPACE 用于分配一片连续的存储单元

  __initial_sp //初始化堆栈指针,注意栈是向下增长的

  __initial_spTop EQU 0x20000400 ; stack used for SystemInit_ExtMemCtl

  ; Heap Configuration

  ; Heap Size (in Bytes) 《0x0-0xFFFFFFFF:8》

  ;

  Heap_Size EQU 0x00000200 //与之对应的是堆的大小

  AREA HEAP, NOINIT, READWRITE, ALIGN=3 //同样的道理

  __heap_base

  Heap_Mem SPACE Heap_Size

  __heap_limit

  PRESERVE8 //这是整个文件8字节的描述方式,在使用RVDS2.2的时候也是要8字节对齐的

  //这个和编译器和处理器有关,不许深究

  THUMB //THUNB指令集

  ; Vector Table Mapped to Address 0 at Reset

  AREA RESET, DATA, READONLY //下面就是复位向量了

  EXPORT __Vectors //EXPORT用于声明一个符号,相当于全局变量,可以被调用

  EXPORT __Vectors_End //相对应的还有一个IMPORT是调用别的函数,相当于一个全局变量

  EXPORT __Vectors_Size

  __Vectors DCD __initial_spTop ; Top of Stack//DCD指令为各中断向量分配空间

  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 & ADC2

  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

  DCD TIM8_BRK_IRQHandler ; TIM8 Break

  DCD TIM8_UP_IRQHandler ; TIM8 Update

  DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation

  DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare

  DCD ADC3_IRQHandler ; ADC3

  DCD FSMC_IRQHandler ; FSMC

  DCD SDIO_IRQHandler ; SDIO

  DCD TIM5_IRQHandler ; TIM5

  DCD SPI3_IRQHandler ; SPI3

  DCD UART4_IRQHandler ; UART4

  DCD UART5_IRQHandler ; UART5

  DCD TIM6_IRQHandler ; TIM6

  DCD TIM7_IRQHandler ; TIM7

  DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1

  DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2

  DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3

  DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5

  __Vectors_End

  __Vectors_Size EQU __Vectors_End - __Vectors

  AREA |.text|, CODE, READONLY //开辟代码段

  ; Dummy SystemInit_ExtMemCtl function

  SystemInit_ExtMemCtl PROC

  EXPORT SystemInit_ExtMemCtl [WEAK]

  BX LR

  ENDP

  ; Reset handler routine

  Reset_Handler PROC

  EXPORT Reset_Handler [WEAK]

  IMPORT __main //调用main函数,这就是每个程序需要main函数的原因

  //所以你可以修改成你顺眼的主函数

  LDR R0, = SystemInit_ExtMemCtl ; initialize external memory controller

  BLX R0

  //这应该是一条位置相关跳转代码指令,也也就是跳转到运行地址

  //而不是编译地址,不清楚的可以百度了!

  LDR R1, = __initial_sp ; restore original stack pointer

  MSR MSP, R1 //存储堆栈指针

  LDR R0, =__main //同样的道理

  BX R0

  ENDP

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

  //下面的中断都是不可返回的中断跳转,一般都是系自我保护的中断跳转

  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

  //输出异常向量表标号,方便外部实现异常的具体功能

  [WEAK] 是弱定义的意思,如果外部定义了,优先执行外部定义,

  否则下面的函数定义,明显这是为了防止我们使用了中断,却没有定义而准备的。

  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]

  EXPORT TIM8_BRK_IRQHandler [WEAK]

  EXPORT TIM8_UP_IRQHandler [WEAK]

  EXPORT TIM8_TRG_COM_IRQHandler [WEAK]

  EXPORT TIM8_CC_IRQHandler [WEAK]

  EXPORT ADC3_IRQHandler [WEAK]

  EXPORT FSMC_IRQHandler [WEAK]

  EXPORT SDIO_IRQHandler [WEAK]

  EXPORT TIM5_IRQHandler [WEAK]

  EXPORT SPI3_IRQHandler [WEAK]

  EXPORT UART4_IRQHandler [WEAK]

  EXPORT UART5_IRQHandler [WEAK]

  EXPORT TIM6_IRQHandler [WEAK]

  EXPORT TIM7_IRQHandler [WEAK]

  EXPORT DMA2_Channel1_IRQHandler [WEAK]

  EXPORT DMA2_Channel2_IRQHandler [WEAK]

  EXPORT DMA2_Channel3_IRQHandler [WEAK]

  EXPORT DMA2_Channel4_5_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

  TIM8_BRK_IRQHandler

  TIM8_UP_IRQHandler

  TIM8_TRG_COM_IRQHandler

  TIM8_CC_IRQHandler

  ADC3_IRQHandler

  FSMC_IRQHandler

  SDIO_IRQHandler

  TIM5_IRQHandler

  SPI3_IRQHandler

  UART4_IRQHandler

  UART5_IRQHandler

  TIM6_IRQHandler

  TIM7_IRQHandler

  DMA2_Channel1_IRQHandler

  DMA2_Channel2_IRQHandler

  DMA2_Channel3_IRQHandler

  DMA2_Channel4_5_IRQHandler

  B

  ENDP

  ALIGN

  ;*******************************************************************************

  ; User Stack and Heap initialization

  ;*******************************************************************************

  //下面是用户堆栈区的初始化

  下面的条件语句对应MDK上的

  

  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 2009 STMicroelectronics *****END OF FILE*****


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>