stm32f10启动代码解析_第1页
stm32f10启动代码解析_第2页
stm32f10启动代码解析_第3页
stm32f10启动代码解析_第4页
stm32f10启动代码解析_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

;*文件名 :startup_stm32f10x_hd.s;*库版本 :V3.5.0;*说明: 此文件为STM32F10X高密度设备的MDK工具链的启动文件;*该模块执行以下操作:;*-设置初始堆栈指针(SP);*-设置初始程序计数器(PC)为复位向量,并在执行main函数前初始化系统时钟;*-设置向量表入口为异常事件的入口地址;*-复位之后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈・*Stack_SizeEQU0x00000200;定义堆栈的大小;AREA命令指示汇编器汇编一个新的代码段或数据段。;段是独立的、指定的、不可见的代码或数据块,它们由链接器处理.;段是独立的、命名的、不可分割的代码或数据序列。一个代码段是生成一个应用程序的最低要求;默认情况下,ELF段在四字节边界上对齐。expression可以拥有0到31的任何整数。;段在2expression字节边界上对齐AREASTACK,NOINIT,READWRITE,ALIGN=3 ;堆栈段,未初始化,允许读写,8字节边界对齐;说明:Cortex-M3的指令地址要求是字边界对齐(4字节);但是代码段是8字节边界对齐的Stack_Mem SPACEStack_Size;分配堆栈空间,把首地址赋给Stack_Mem—initial_sp;初始化堆栈指针,指向堆栈顶.;此处有个一个问题讨论,关于栈顶在RAM中所处位置问题,很多初学者一直以为是编译器特意放在HEAP段之后是有意为之,并且认为这样可以利用heap未分配空间来防止未知的栈溢出问题;这种理解是错误的,链接器并不会为栈的位置做特殊的处理,而且这样做也并不会利用heap段,在此文件的最后对堆栈的初始化代码中可以看出他们是两个互相独立的数据区。此处出现的现;象是因为MDK按数据段的字母顺序链接数据段的地址的,所以此处造成了堆的地址在栈的前面的假象,不要窃以为是有某种特殊的约定。;<h>HeapConfiguration; <o>HeapSize(inBytes)<0x0-0xFFFFFFFF:8>Heap_Size EQU0x00000200;定义堆的大小AREAHEAP,NOINIT,READWRITE,ALIGN=3;堆段,未初始化,允许读写,堆数据段8字节边界对齐__heap_baseHeap_Mem SPACEHeap_Size;分配堆空间__heap_limit ;与__heap_base配合限制堆的大小PRESERVE8;命令指定当前文件保持栈的八字节对齐DCDNMI_HandlerDCDDCDNMI_HandlerDCDHardFault_HandlerDCDMemManage_Handler断DCDBusFault_Handler般发生在数据访问异常,比如fsmc访问不当DCDUsageFault_Handler开始,FLASH的0地址,复位后首先装载栈顶指针DCD Reset_Handler后,第一个执行的,并且不返回。一般是预取值,或者位置指令,数据处理等错误DCD0DCD0DCD0DCD0DCDSVC_Handler为了调用操作系统内核服务DCDDebugMon_Handler常DCD0;DCDPendSV_Handler;EXPORT命令声明一个符号,可由链接器用于解释各个目标和库文件中的符号引用,相当于声明了一个全局变量。GLOBAL于EXPORT相同。;以下为向量表,在复位时被映射到FLASH的0地址AREARESET,DATA,READONLY;复位段,只包含数据,只读EXPORT_Vectors ;标号输出,中断向量表开始EXPORT__Vectors_End ;中断向量表结束EXPORT__Vectors_Size ;中断向量表大小;DCD命令分配一个或多个字的存储器,在四个字节的边界上对齐,并定义存储器的运行时初值。—Vectors DCD __initial_sp ;TopofStack栈顶指针,被放在向量表的;ResetHandler复位异常,装载完栈顶;NMIHandler 不可屏蔽中断;HardFaultHandler硬件错误中断;MPUFaultHandler内存管理错误中;BusFaultHandler总线错误中断,一;UsageFaultHandler用法错误中断,;Reserved;Reserved;Reserved;Reserved;SVCallHandler系统调用异常,主要是;DebugMonitorHandler调试监视异;Reserved;PendSVHandler 挂起异常,此处可以看见用作了uCOS-II的上下文切换异常,这是被推荐使用的,因为Cortex-M3会在异常发生时自动保存R0-R3,;R12,R13(堆栈指针SP),R14(链接地址,也叫返回地址LR,在异常返回时使用),R15(程序计数器PC,为当前应用程序+4)和中断完成时自动回复,;我们只需保存R4-R11,大大减少了中断响应和上下文切换的时间。;说明:此处涉及到一个中断保存寄存器问题:因为在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,因此,在中断或者异常处理进行模式转换; 时,由于不同模式(此处为"线程"和"特权")均使用相同的物理寄存器,可能会造成寄存器中数据的破坏。这也是常说的"关键代码段"和"l临界区"保护的原因。;DCDSysTick_Handler ;SysTickHandler滴答定时器,为操作系统内核时钟DCDDCDDCDOS_CPU_PendSVHandlerOS_CPU_SysTickHandler;ExternalInterrupts

以下为外部中断向量表DMA1_Channel1_IRQHandlerDMA1_Channel2_IRQHandlerDMA1_Channel1_IRQHandlerDMA1_Channel2_IRQHandlerDMA1_Channel3_IRQHandlerDMA1_Channel4_IRQHandlerDMA1_Channel5_IRQHandlerDMA1_Channel6_IRQHandlerDMA1_Channel7_IRQHandlerADC1_2_IRQHandler ;ADC1&ADC2USB_HP_CAN1_TX_IRQHandler;USBHighPriorityorCAN1TXDCDWWDG_IRQHandlerDCD PVD_IRQHandlerDCD TAMPER_IRQHandlerDCD RTC_IRQHandlerDCD FLASH_IRQHandlerDCD RCC_IRQHandlerDCD EXTIO_IRQHandlerDCD EXTI1_IRQHandlerDCD EXTI2_IRQHandlerDCD EXTI3_IRQHandlerDCD EXTI4_IRQHandlerDCDDCDDCDDCDDCDDCDDCDDCDDCD

;WindowWatchdog;PVDthroughEXTILinedetect;Tamper;RTC;Flash;RCC;EXTILine0;EXTILine1;EXTILine2;EXTILine3;EXTILine4;DMA1Channel1;DMA1Channel2;DMA1Channel3;DMA1Channel4;DMA1Channel5;DMA1Channel6;DMA1Channel7DCDUSB_LP_CAN1_RX0_IRQHandler;USBLowPriorityorCAN1RX0DCDCAN1_RX1_IRQHandler;CAN1RX1DCDCAN1_SCE_IRQHandler;CAN1SCEDCDEXTI9_5_IRQHandler;EXTILine9..5DCDTIM1_BRK_IRQHandler;TIM1BreakDCDTIM1_UP_IRQHandler;TIM1UpdateDCDTIM1_TRG_COM_IRQHandler;TIM1TriggerandCommutationDCDTIM1_CC_IRQHandler;TIM1CaptureCompareDCDTIM2_IRQHandler;TIM2DCDTIM3_IRQHandler;TIM3DCDTIM4_IRQHandler;TIM4DCDI2C1_EV_IRQHandler;I2C1EventDCDI2C1_ER_IRQHandler;I2C1ErrorDCDI2C2_EV_IRQHandler;I2C2EventDCDI2C2_ER_IRQHandler;I2C2ErrorDCDSPI1_IRQHandler;SPI1DCDSPI2_IRQHandler;SPI2DCDUSART1_IRQHandler;USART1DCDUSART2_IRQHandler;USART2DCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDDCDTIM8_UP_IRQHandlerTIM8_TRG_C0M_IRQHandlerTIM8_CC_IRQHandlerADC3_IRQHandlerFSMC_IRQHandlerSDIO_IRQHandlerTIM5_IRQHandlerSPI3_IRQHandlerUART4_IRQHandlerUART5_IRQHandlerTIM6_IRQHandlerTIM7_IRQHandlerDMA2_Channel1_IRQHandlerDMA2_Channel2_IRQHandlerDMA2_Channel3_IRQHandler;USART3;EXTILine15..10;RTCAlarmthroughEXTILine;USBWakeupfromsuspend;TIM8Break;TIM8Update;TIM8TriggerandCommutation;TIM8CaptureCompare;ADC3;FSMC;SDIO;TIM5;SPI3;UART4;UART5;TIM6;TIM7;DMA2Channel】;DMA2Channel2;DMA2Channel3DMA2_Channel4_5_IRQHandler;DMA2Channel4&Channel5Vectors_End ;向量表结束标志__Vectors_SizeEQU__Vectors_End-__Vectors;计算向量表地址空间大小;|.text|用于表示由C编译程序产生的代码段,或用于以某种方式与C库关联的代码段。AREA|.text|,CODE,READONLY淀义C编译器源代码的代码段,只读;ResethandlerReset_HandlerPROCEXPORTReset_Handler ;此处表示弱定义,优先执行其他文件的定义IMPORT__mainIMPORTSystemInitLDRRO,=SystemInit;装载寄存器指令BLX RO ;带链接的跳转,切换指令集LDR RO, =__mainBX RO ;切换指令集,main函数不返回ENDP;DummyExceptionHandlers(infiniteloopswhichcanbemodified)NMI_HandlerPROCEXPORTNMI_HandlerB .ENDPHardFault_Handler\PROCEXPORTHardFault_HandlerB .ENDPMemManage_Handler\PROCEXPORTMemManage_HandlerB .ENDPBusFault_Handler\PROCEXPORTBusFault_HandlerB .ENDPUsageFault_Handler\PROCEXPORTUsageFault_HandlerB .ENDPSVC_HandlerPROCEXPORTSVC_HandlerB .ENDPDebugMon_Handler\PROCEXPORTDebugMon_HandlerTOC\o"1-5"\h\zB .ENDPOS_CPU_PendSVHandlerPROCEXPORTOS_CPU_PendSVHandlerB .ENDPOS_CPU_SysTickHandlerPROCEXPORTOS_CPU_SysTickHandlerB .ENDPDefault_HandlerPROC;输出异常向量表标号,方便外部实现异常的具体功能,是弱定义的意思,如果外部定义了,优先执行外部定义,否则下面的函数定义EXPORTWWDG_IRQHandlerEXPORTPVD_IRQHandlerEXPORTTAMPER_IRQHandlerEXPORTRTC_IRQHandlerEXPORTFLASH_IRQHandlerEXPORTRCC_IRQHandlerEXPORTEXTIO_IRQHandlerEXPORTEXTI1_IRQHandlerEXPORTEXTI2_IRQHandlerEXPORTEXTI3_IRQHandlerEXPORTEXTI4_IRQHandlerEXPORTDMA1_Channel1_IRQHandlerEXPORTDMA1_Channel2_IRQHandlerEXPORTDMA1_Channel3_IRQHandlerEXPORTDMA1_Channel4_IRQHandlerEXPORTDMA1_Channel5_IRQHandlerEXPORTDMA1_Channel6_IRQHandlerEXPORTDMA1_Channel7_IRQHandlerEXPORTADC1_2_IRQHandlerEXPORTUSB_HP_CAN1_TX_IRQHandlerEXPORTUSB_LP_CAN1_RX0_IRQHandlerEXPORTCAN1_RX1_IRQHandlerEXPORTCAN1_SCE_IRQHandlerEXPORTEXTI9_5_IRQHandlerEXPORTTIM1_BRK_IRQHandlerEXPORTTIM1_UP_IRQHandlerEXPORTTIM1_TRG_COM_IRQHandlerEXPORTTIM1_CC_IRQHandlerEXPORTTIM2_IRQHandlerEXPORTTIM3_IRQHandlerEXPORTTIM4_IRQHandlerEXPORTI2C1_EV_IRQHandlerEXPORTI2C1_ER_IRQHandlerEXPORTI2C2_EV_IRQHandlerEXPORTI2C2_ER_IRQHandlerEXPORTSPI1_IRQHandlerEXPORTSPI2_IRQHandlerEXPORTUSART1_IRQHandlerEXPORTUSART2_IRQHandlerEXPORTUSART3_IRQHandlerEXPORTEXTI15_10_IRQHandlerEXPORTRTCAlarm_IRQHandlerEXPORTUSBWakeUp_IRQHandlerEXPORTTIM8_BRK_IRQHandlerEXPORTTIM8_UP_IRQHandlerEXPORTTIM8_TRG_COM_IRQHandlerEXPORTTIM8_CC_IRQHandlerEXPORTADC3_IRQHandlerEXPORTFSMC_IRQHandlerEXPORTSDIO_IRQHandlerEXPORTTIM5_IRQHandlerEXPORTSPI3_IRQHandlerEXPORTUART4_IRQHandlerEXPORTUART5_IRQHandlerEXPORTTIM6_IRQHandlerEXPORTTIM7_IRQHandlerEXPORTDMA2_Channel1_IRQHandlerEXPORTDMA2_Channel2_IRQHandlerEXPORTDMA2_Channel3_IRQHandlerEXPORTDMA2_Channel4_5_IRQHandler;如下只是定义一个空函数WWDG_IRQHandlerPVD_IRQHandlerTAMPER_IRQHandlerRTC_IRQHandlerFLASH_IRQHandlerRCC_IRQHandlerEXTIO_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_C0M_IRQHandlerTIM1_CC_IRQHandlerTIM2_IRQHandlerI2C2_ER_IRQHandlerSPI1_IRQHandlerSPI2_IRQHandlerUSART1_IRQHandlerUSART2_IRQHandlerUSART3_IRQHandlerEXTI15_10_IRQHandlerRTCAlarm_IRQHandlerUSBWakeUp_IRQHandlerTIM8_BRK_IRQHandlerTIM8_UP_IRQHandlerTIM8_TRG_C0M_IRQHandlerTIM8_CC_IRQHandlerADC3_IRQHandlerFSMC_IRQHandler

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论