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