********************(C)COPYRIGHT2009STMicroelectronics********************;*FileName:startup_stm32f10x_cl.s;*Author:MCDApplicationTeam;*Version:V3.1.0;*Date:06/19/2009;*Description:STM32F10xConnectivitylinedevicesvectortableforRVMDK;*toolchain.;*Thismoduleperforms:;*-SettheinitialSP;*-SettheinitialPC==Reset_Handler;*-SetthevectortableentrieswiththeexceptionsISRaddress;*-Branchesto__mainintheClibrary(whicheventually;*callsmain()).;*AfterResettheCortexM3processorisinThreadmode,;*priorityisPrivileged,andtheStackissettoMain.;*UseConfigurationWizardinContextMenu;*******************************************************************************;THEPRESENTFIRMWAREWHICHISFORGUIDANCEONLYAIMSATPROVIDINGCUSTOMERS;WITHCODINGINFORMATIONREGARDINGTHEIRPRODUCTSINORDERFORTHEMTOSAVETIME.;ASARESULT,STMICROELECTRONICSSHALLNOTBEHELDLIABLEFORANYDIRECT,;INDIRECTORCONSEQUENTIALDAMAGESWITHRESPECTTOANYCLAIMSARISINGFROMTHE;CONTENTOFSUCHFIRMWAREAND/ORTHEUSEMADEBYCUSTOMERSOFTHECODING;INFORMATIONCONTAINEDHEREININCONNECTIONWITHTHEIRPRODUCTS.;*******************************************************************************;Amountofmemory(inbytes)allocatedforStack;Tailorthisvaluetoyourapplicationneeds;hStackConfiguration;oStackSize(inBytes)0x0-0xFFFFFFFF:8;/h;首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈;顶地址,第二个表项是复位中断服务入口地址。然后在复位中断服务程序中跳转C/C++标;准实时库的__main函数。假设STM32被设置为从内部FLASH启动中断向量表起始地位为0x8000000,;则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。当STM32遇;到复位信号后,则从0x80000004处取出复位中断服务入口地址继而执行复位中断服务程序,;然后跳转__main函数,最后来到C的世界。;DCD指令:作用是开辟一段空间,其意义等价于C语言中的地址符“&”。开始建立的中断向量;表则类似于使用C语.其每一个成员都是一个函数指针,分别指向各个中断服务函数;伪指令AREA,表示开辟一段大小为Stack_Size的内存空间作为栈,段名是STACK,可读可写。;NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0;常见的数据定义伪指令有如下几种:;—DCB用于分配一片连续的字节存储单元并用指定的数据初始化。;—DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化。;—DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化。;—DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。;—DCFSDCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。;—DCQDCQU)用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化。;—SPACE用于分配一片连续的存储单元;—MAP用于定义一个结构化的内存表首地址;—FIELD用于定义一个结构化的内存表的数据域;EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL代替。标号在程序中区分大小写,[WEAK]选项声明其他的同名标号优先于该标号被引用。;;启动代码作用一般是:;;1)堆和栈的初始化;;2)向量表定义;;;3)地址重映射及中断向量表的转移;;;4)设置系统时钟频率;;;5)中断寄存器的初始化;;;6)进入C应用程序。;1)堆和栈的初始化Stack_SizeEQU0x00000400;栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;SPACE用来分配一片连续的存储区域并初始化为0.AREASTACK,NOINIT,READWRITE,ALIGN=3;AREA伪指令用于定义一个代码段或数据,;定义栈,可初始为0,8字节对齐2*2*2,2的3次方;NOINIT:指定此数据段仅仅保留了内存单元,;READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。;STACK段名;ALIGN属性:使用方式为ALIGN表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐方式为2表达式次方。Stack_MemSPACEStack_Size;;分配0x400个连续字节,并初始化为0__initial_sp;标号__initial_sp,表示栈空间顶地址。;汇编代码地址标号;hHeapConfiguration;oHeapSize(inBytes)0x0-0xFFFFFFFF:8;/hHeap_SizeEQU0x00000200;堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表AREAHEAP,NOINIT,READWRITE,ALIGN=3;ALIGN用来指定对齐方式,8字节对齐__heap_base;表示堆空间起始地址Heap_MemSPACEHeap_Size__heap_limit;表示堆空间结束地址PRESERVE8;PRESERVE8指令指定当前文件保持堆栈八字节对齐THUMB;告诉汇编器下面是32位的Thumb指令,如果需要汇编器将插入位以保证对齐;2)中断向量表定义;VectorTableMappedtoAddress0atReset;实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000)AREARESET,DATA,READONLY;定义一块数据段,只可读,段名字是RESET;DATA属性:用于定义数据段,默认为READWRITE。指定本段为可读可写EXPORT__Vectors;EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用EXPORT__Vectors_End;在程序中声明一个全局的标号__Vectors_EndEXPORT__Vectors_Size;在程序中声明一个全局的标号__Vectors_Size__VectorsDCD__initial_sp;TopofStack第一个表项是栈顶地址;该处物理地址值即为__Vetors标号所表示的值,;该地址中存储__initial_sp所表示的地址值,;大小为一个字(32bit)DCDReset_Handler;ResetHandler第二个表项是复位中断服务入口地址DCDNMI_Handler;NMIHandler不可屏蔽中断?DCDHardFault_Handler;HardFaultHandler硬件错误处理DCDMemManage_Handler;MPUFaultHandler存储器错误处理DCDBusFault_Handler;BusFaultHandler总线错误处理DCDUsageFault_Handler;UsageFaultHandler用法错误处理DCD0;Reserved;这种形式就是保留地址,不给任何标号分配DCD0;ReservedDCD0;ReservedDCD0;ReservedDCDSVC_Handler;SVCallHandler执行系统服务调用指令(SVC)引发的异常DCDDebugMon_Handler;DebugMonitorHandler调试监视器(断点,数据观察点,或者是外部调试请求DCD0;ReservedDCDPendSV_Handler;PendSVHandler为系统设备而设的“可悬挂请求”(pendablerequest)DCDSysTick_Handler;SysTickHandler系统滴答定时器;ExternalInterrupts外设中断DCDWWDG_IRQHandler;WindowWatchdog窗口看门狗DCDPVD_IRQHandler;PVDthroughEXTILinedetect电源电压检测(PVD)中断DCDTAMPER_IRQHandler;TamperDCDRTC_IRQHandler;RTCDCDFLASH_IRQHandler;FlashDCDRCC_IRQHandler;RCCDCDEXTI0_IRQHandler;EXTILine0DCDEXTI1_IRQHandler;EXTILine1DCDEXTI2_IRQHandler;EXTILine2DCDEXTI3_IRQHandler;EXTILine3DCDEXTI4_IRQHandler;EXTILine4DCDDMA1_Channel1_IRQHandler;DMA1Channel1DCDDMA1_Channel2_IRQHandler;DMA1Channel2DCDDMA1_Channel3_IRQHandler;DMA1Channel3DCDDMA1_Channel4_IRQHandler;DMA1Channel4DCDDMA1_Channel5_IRQHandler;DMA1Channel5DCDDMA1_Channel6_IRQHandler;DMA1Channel6DCDDMA1_Channel7_IRQHandler;DMA1Channel7DCDADC1_2_IRQHandler;ADC1andADC2DCDCAN1_TX_IRQHandler;CAN1TXDCDCAN1_RX0_IRQHandler;CAN1RX0DCDCAN1_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