STM32启动文件详解

合集下载

STM32启动文件详解

STM32启动文件详解

STM32启动文件详解(2012-07-28 11:22:34)转载▼分类:STM32标签:stm32启动在<<STM32不完全手册里面>>,用的是STM32F103RBT6,所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。

STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。

实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。

比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无**常使用。

又比如,你TIM1~4的中断可以正常使用,而5~8的,则无法使用。

而在固件库里出现3个文件startup_stm32f10x_ld.sstartup_stm32f10x_md.sstartup_stm32f10x_hd.s其中,ld.s适用于小容量产品;md.s适用于中等容量产品;hd适用于大容量产品;这里的容量是指FLASH的大小.判断方法如下:小容量:FLASH≤32K中容量:64K≤FLASH≤128K大容量:256K≤FLASH;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd.s;* Author : MCD Application Team;* Version : V3.5.0;* Date : 11-March-2011;* Description : STM32F10x High Density 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;* - Configure the clock system and also configure the external;* SRAM mounted on STM3210E-EVAL board to be used as data;* memory (optional, to be enabled by user);* - Branches to __main in the C library (which eventually;* calls main()).;* After Reset the CortexM3 processor is in Thread mode,;* priority is Privileged, and the Stack is set to Main.;* 说明: 此文件为STM32F10x高密度设备的MDK工具链的启动文件;* 该模块执行以下操作:;* -设置初始堆栈指针(SP);* -设置初始程序计数器(PC)为复位向量,并在执行main函数前初始化系统时钟;* -设置向量表入口为异常事件的入口地址;* -复位之后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈;* <<< Use Configuration Wizard in Context Menu >>>; 首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈; 顶地址,第二个表项是复位中断服务入口地址。

stm32启动文件详解及SystemInit函数分析

stm32启动文件详解及SystemInit函数分析
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
;__main函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main()函数,来到C的世界。
Stack_Size EQU 0x00000400 ;//定义堆栈大小
AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0
;链接器检查要求堆栈八字节对齐的任何代码是否仅由保持堆栈八字节对齐的代码直接或间接地调用。
PRESERVE8 ;//指示编译器8字节对齐
Байду номын сангаас THUMB ;//指示编译器以后的指令为THUMB指令
;中断向量表定义
; Vector Table Mapped to Address 0 at Reset
;中断函数仅仅实现了Reset_Handler,其他要么是死循环,要么仅仅定义了函数名称
;STM32被设置为从内部FLASH启动时(这也是最常见的一种情况),当STM32遇到复位信号后,

STM32之启动文件详解

STM32之启动文件详解

STM32 之启动文件详解在嵌入式应用程序开发过程里,由于使用C 语言编程,基本很少涉及到机器底层寄存器的执行过程,一般都会直接在main 函数里开始写代码,似乎main 成为了理所当然的起点,尽管从C 程序的角度来看程序都是直接从main 函数开始执行。

然而,MCU 上电后,是如何寻找到并执行main 函数这一问题却很自然的被忽略了!事实上微控制器是无法从硬件上去定位main 函数的入口地址,因为使用C 语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,因此main 函数的入口地址在编译后便不一定是一个绝对地址。

MCU 上电后又是如何寻找到这个入口地址呢?以前接触无论是PIC、AVR、MSP430 或是51 过程中都没涉及到启动文件的配置,仅仅只有熔丝位或配置字是需要根据实际使用配置来设置,其实并非没有,而是由于大部分的开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main 函数开始进行应用程序的设计即可。

然而,但接触到嵌入内核比如Linux 系统移植过程bootloader 却是很重要也是必不可少的一个环节。

事实上,每一种微控制器,无论性能高下,结构简繁,价格贵贱都是必须有启动文件才能正常工作的,它的作用同bootloader 类似。

启动文件完成了微控制器从复位到开始执行main 函数中间这段时间的必要启动配置。

在STM32 中,如果是在MDK 下创建一个工程,一般都有提示是否加入Star up Code 文件,这个就是启动文件,这里有个误区,一般对于初学者来看,很容易误以为STM32F10x.s 这个启动文件是STM32 所有类型芯片的通用启动文件,因此也自然不会去理会它的作用,事实上,这个启动文件只是。

STM32启动文件的选择及宏定义及芯片型号更改IAP总结

STM32启动文件的选择及宏定义及芯片型号更改IAP总结

STM32启动文件的选择及宏定义及芯片型号更改IAP总结对于STM32芯片,启动文件主要包括以下几个部分:1.启动向量表:包含中断服务程序的地址信息,用于系统初始化和中断处理等功能。

2.中断服务程序:对中断进行处理的代码,包括系统初始化时的复位中断和其他外部中断。

3.系统初始化代码:完成芯片的初始化工作,包括时钟配置、外设初始化、堆栈初始化等。

在选择启动文件时,需要注意以下几点:1.芯片型号匹配:确保所选择的启动文件与使用的芯片型号兼容,以确保正常的系统初始化和中断处理。

2. 如需使用外部存储器:如果需要使用外部存储器,如外部Flash 或RAM,需要选择支持外部存储器的启动文件。

3. 如需使用操作系统:如果需要在系统中运行操作系统,如FreeRTOS或uc/OS等,需要选择对应操作系统的启动文件。

在启动文件中,还涉及宏定义的使用。

宏定义是一种预处理指令,用于在编译时替换特定的文本字符串。

在启动文件中,通常会使用宏定义来配置系统的时钟频率、中断向量表的起始地址等参数。

在更改芯片型号时1.切换器件描述文件:在工程文件中,需要将所使用的芯片型号对应的器件描述文件进行切换。

这个文件通常在项目设置中进行配置。

2.修改启动文件:将原有的启动文件替换为新的芯片型号所对应的启动文件。

3.更新宏定义:在新的启动文件中,需要确认并更新宏定义,以确保系统的配置和参数正确。

4.复查外设配置:在启动文件中,有可能包含对外设的初始化代码。

在更改芯片型号后,需要复查外设的配置和初始化。

总结起来,选择合适的STM32启动文件,需要根据所使用的芯片型号来进行选择,并注意更改宏定义和复查外设配置。

这样才能确保系统正常初始化和中断处理的功能。

STM32入门之文件结构

STM32入门之文件结构

STM32入门之文件结构在开始STM32的开发之前,了解其文件结构对于编写和组织代码非常重要。

文件结构是指将代码和资源组织在文件夹和文件中的方式。

一个良好的文件结构能够提高代码的可维护性、可扩展性和可读性。

下面是一个典型的STM32文件结构示例:1. Core文件夹:这个文件夹包含了一些核心的STM32的系统文件,例如启动文件、链接脚本文件等。

启动文件包含了一些处理器的初始化代码,用于设置操作模式、初始化中断向量表等。

链接脚本文件定义了代码和数据在存储器中的位置和排列方式。

2. Drivers文件夹:这个文件夹包含了所有的外设驱动文件。

每个外设都有对应的C文件和头文件,用于控制和配置外设。

这些外设包括GPIO(通用输入输出)、USART(串行通信)、SPI(串行外设接口)等。

3. Inc文件夹:这个文件夹包含了所有的头文件。

头文件是用于声明和定义变量、函数和数据结构的文件。

每个源文件都应该包含所需的头文件。

4. Src文件夹:这个文件夹包含了所有的源文件。

源文件包含了实际的代码和功能的实现。

这些文件可以包括主函数、外设初始化函数、中断处理函数等。

5. Middlewares文件夹:这个文件夹包含了一些中间件(middleware),用于简化开发过程和提供一些高级功能。

这些中间件可以包括操作系统、文件系统、图形库等。

6. Libraries文件夹:这个文件夹包含了一些标准的STM32库文件,用于提供一些常用的函数和方法。

这些库文件可以包括数学函数、字符串处理函数、操作系统函数等。

7. Tools文件夹:这个文件夹包含了一些用于开发和调试的工具。

这些工具可以包括编译器、调试器、仿真器等。

以上是一个基本的文件结构示例,实际情况中可能会有一些变化和定制。

根据项目的需求,开发者可以在文件夹中添加其他文件夹,例如Tests文件夹用于存放测试代码,Docs文件夹用于存放文档等。

通过使用一个清晰而有组织的文件结构,开发者可以更容易地理解和维护代码。

STM32启动文件选用说明

STM32启动文件选用说明

stm32 启动文件的选择最近在网上看到一些关于STM32启动文件的问题帖,都是类似这样的问题:随便选两个“startup_stm32f10x_ld、hd、md这3个启动文件有什么不同”“官网固件库中的启动文件有啥区别,怎么选择?”搜索了论坛,也看了一下,有一些回答,但是都不太全或者不甚明了。

其实我以前也不清楚,当然我是新手,只不过是个爱折腾的新手,因为我觉得,这个有必要弄清楚。

一是启动文件在一个工程中有着不可取代的作用,二是对于STM32这个让人蛋疼而又强大的东东,经常是新手乱添加启动文件或者去找一下工程例子“依葫芦画瓢”的添加,试问你的MCU和人家工程例子的就是一样,换一款型号,要命[夸张的修辞手法,呵呵]?所有说,基于这些,我就说一说我的认识:注意此处只针对MDK-ARM的IDE,其他的一样,只不过想说明的是对不同的IDE,同一芯片型号的启动文件的“内容”是不一样的,这是因为编译器造成的,意思就是说,启动文件的功能一样,但是指令有所区别。

这个每个启动文件也注释了,如:(原文件名:.s for MDK IAR.JPG)啰嗦了……启动文件的作用:无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。

最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。

[来自网上]我的理解,说白了,大家常说,程序执行都从main函数开始,是的,没错,但是在这之前是谁来完成了这一个繁琐而又复杂的启动过程呢?就是它。

(看来.s尽干脏活苦活,就像“活雷锋一样,做了好事有不留名”)具体的启动过程论坛里有,想了解的可以去细看。

好了,上图:(原文件名:MDK-s.JPG)看到是不好多,都晕了,慢慢来看:重要的来看这些缩写:这几个是代表Flash容量的ld Low-density 小容量 16-32Kmd Medium-density 中容量 64-128Khd High-density 大容量 256-512Kxl 超大容量512-1024K这些都是基本型的,包括STM32F101xx, STM32F102xx 和STM32F103xx然后vl value line devices 超值型系列大家记住:这个只有STM32F100xx,也就是说只要是vl那一定是STM32F100的启动文件,其他的不予考虑下面还有个特殊的:cl Connectivity line devices 互联型有STM32F105xx和STM32F107xx区别完了,我想你大概也知道什么样的片子对应什么启动文件了吧,如果还有点迷糊,不要紧,下面来举个例子:如:STM32F103VC首先你要知道它的容量,这儿IDE下面器件选型(原文件名:MDK opt.JPG)还有这儿,数据手册(原文件名:database 103vc.JPG)都可以知道它的容量,看你习惯,我人懒,经常用第一种方式知道容量了之后,因为它不属于超值型STM32F100xx系列,也不属于互联型的STM32F105xx和STM32F107xx,所有我想你知道该怎么办了吧:(原文件名:s.JPG)工程下面如是添加最后你可以打开这个.s看一下,这儿注释得也很明确(原文件名:stm32f103vc s.JPG)。

stm32启动文件

stm32启动文件

NMI_Handler PROC EXPORT NMI_Handler B . ENDP HardFault_Handler\ PROC EXPORT HardFault_Handler B . ENDP SysTick_Handler PROC EXPORT SysTick_Handler B . ENDP Default_Handler PROC EXPORT EXPORT EXPORT EXPORT WWDG_IRQHandler PVD_IRQHandler RTC_IRQHandler FLASH_IRQHandler
EXPORT __initial_sp ;栈顶地址,赋予全局属性 EXPORT __heap_base ;堆的起始地址 EXPORT __heap_limit ;堆的末地址 ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR LDR LDR LDR BX ALIGN ENDIF END ;定义全局标号 ;声明ctors
DCD DCD DCD DCD DCD DCD ••••• ••••• DCD DCD
;中断向量表的起始位置 __initial_sp ; 栈顶地址,给 __initial_sp分配4字节32位的地址为0x08000000 Reset_Handler ; Reset Handler 复位中断地址,分配地址为0x08000004 NMI_Handler ; NMI Handler 不可屏蔽中断地址,分配地址为0x08000008 HardFault_Handler ; Hard Fault Handler 硬件失败中断,分配地址为0x0800000C 0 ; Reserved 保留,没有使用到 0 ; Reserved ;地址分配每个中断向量占4个字节 PendSV_Handler SysTick_Handler ; PendSV Handler ; SysTick Handler 系统设备挂起请求 系统时钟定时器

STM32的启动

STM32的启动

STM32的启动1、启动⽂件简介 启动⽂件由汇编编写,是系统上电复位后第⼀个执⾏的程序。

主要做了以下⼯作: (1)初始化堆栈指针 MSP=_initial_sp (2)初始化 PC 指针=Reset_Handler (3)初始化中断向量表 (4)配置系统时钟 (5)调⽤ C 库函数_main 初始化⽤户堆栈,从⽽最终调⽤ main 函数去到 C 的世界2、STM32的启动流程 下⾯这段话引⽤⾃《CM3 权威指南 CnR2》—复位序列, CM4 的复位序列跟 CM3 ⼀样。

在离开复位状态后, CM3 做的第⼀件事就是读取下列两个 32 位整数的值: (1)从地址 0x0000,0000(FLASH 的地址 0x08000000,因为STM32设计的Flash起始地址是在0x0800 0000开始的)处取出 MSP 的初始值。

(2)从地址 0x0000,0004(FLASH 的地址 0x08000004,因为STM32设计的Flash起始地址是在0x0800 0000开始的)处取出 PC 的初始值——这个值是复位向量, LSB 必须是1,然后从这个值所对应的地址处取值。

请注意,这与传统的 ARM 架构不同——其实也和绝⼤多数的其它单⽚机不同。

传统的 ARM 架构总是从 0 地址开始执⾏第⼀条指令。

它们的 0 地址处总是⼀条跳转指令。

在CM3 中,在 0 地址处提供 MSP 的初始值,然后紧跟着就是向量表。

向量表中的数值是 32位的地址,⽽不是跳转指令。

向量表的第⼀个条⽬指向复位后应执⾏的第⼀条指令,就是我们刚刚分析的 Reset_Handler 这个函数。

初始化 MSP 和 PC 的⼀个范例 因为 CM3 使⽤的是向下⽣长的满栈,所以 MSP 的初始值必须是堆栈内存的末地址加1。

举例来说,如果我们的堆栈区域在 0x20007C00-0x20007FFF 之间,那么 MSP 的初始值就必须是 0x20008000。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32启动文件详解(2012-07-28 11:22:34)转载▼分类:STM32标签:stm32启动在<<STM32不完全手册里面>>,用的是STM32F103RBT6,所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。

STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。

实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。

比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无**常使用。

又比如,你TIM1~4的中断可以正常使用,而5~8的,则无法使用。

而在固件库里出现3个文件startup_stm32f10x_ld.sstartup_stm32f10x_md.sstartup_stm32f10x_hd.s其中,ld.s适用于小容量产品;md.s适用于中等容量产品;hd适用于大容量产品;这里的容量是指FLASH的大小.判断方法如下:小容量:FLASH≤32K中容量:64K≤FLASH≤128K大容量:256K≤FLASH;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd.s;* Author : MCD Application Team;* Version : V3.5.0;* Date : 11-March-2011;* Description : STM32F10x High Density 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;* - Configure the clock system and also configure the external;* SRAM mounted on STM3210E-EVAL board to be used as data;* memory (optional, to be enabled by user);* - Branches to __main in the C library (which eventually;* calls main()).;* After Reset the CortexM3 processor is in Thread mode,;* priority is Privileged, and the Stack is set to Main.;* 说明: 此文件为STM32F10x高密度设备的MDK工具链的启动文件;* 该模块执行以下操作:;* -设置初始堆栈指针(SP);* -设置初始程序计数器(PC)为复位向量,并在执行main函数前初始化系统时钟;* -设置向量表入口为异常事件的入口地址;* -复位之后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈;* <<< Use Configuration Wizard in Context Menu >>>; 首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈; 顶地址,第二个表项是复位中断服务入口地址。

然后在复位中断服务程序中跳转??C/C++标; 准实时库的__main函数。

假设STM32被设置为从内部FLASH启动中断向量表起始地位为0x8000000,; 则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。

当STM32遇; 到复位信号后,则从0x80000004处取出复位中断服务入口地址继而执行复位中断服务程序,; 然后跳转__main函数,最后来到C的世界。

; DCD指令:作用是开辟一段空间,其意义等价于C语言中的地址符“&”。

开始建立的中断向量; 表则类似于使用C语.其每一个成员都是一个函数指针,分别指向各个中断服务函数;伪指令AREA,表示开辟一段大小为Stack_Size的内存空间作为栈,段名是STACK,可读可写。

;NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0;****************************************************************************** *; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.;****************************************************************************** *; 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 0x00000400 ;定义栈大小1024BAREA STACK, NOINIT, READWRITE, ALIGN=3;###AREA 命令指示汇编器汇编一个新的代码段或数据段。

;段是独立的、指定的、不可见的代码或数据块,它们由链接器处理.;段是独立的、命名的、不可分割的代码或数据序列。

一个代码段是生成一个应用程序的最低要求;默认情况下,ELF 段在四字节边界上对齐。

expression 可以拥有0 到31 的任何整数。

;段在2expression 字节边界上对齐Stack_Mem SPACE Stack_Size ;### ;分配连续Stack_Size 字节的存储单元并初始化为0。

;堆栈段,未初始化,允许读写,8字节边界对齐;说明: Cortex-M3的指令地址要求是字边界对齐(4字节);但是代码段是8字节边界对齐的__initial_sp ;###初始化堆栈指,标号__initial_sp表示指向堆栈顶. ; ###此处有个一个问题讨论,关于栈顶在RAM中所处位置问题,很多初学者一直以为是编译器特意放在HEAP段之后是有意为之,并且认为这样可以利用heap未分配空间来防止未知的栈溢出问题; 这种理解是错误的,链接器并不会为栈的位置做特殊的处理,而且这样做也并不会利用heap段,在此文件的最后对堆栈的初始化代码中可以看出他们是两个互相独立的数据区。

此处出现的现; 象是因为MDK按数据段的字母顺序链接数据段的地址的,所以此处造成了堆的地址在栈的前面的假象,不要窃以为是有某种特殊的约定。

; <h> Heap Configuration; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>; </h>Heap_Size EQU 0x00000200 ;定义堆的大小AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;堆段,malloc用的地方,不一定连续空间,未初始化,允许读写,堆数据段8字节边界对齐__heap_base ;表示堆空间起始地址Heap_Mem SPACE Heap_Size ;分配堆空间__heap_limit ;表示堆空间结束地址与__heap_base配合限制堆的大小PRESERVE8 ;命令指定当前文件保持栈的八字节对齐THUMB ;指令集,THUMB 必须位于使用新语法的任何Thumb代码之前; EXPORT 命令声明一个符号,可由链接器用于解释各个目标和库文件中的符号引用,相当于声明了一个全局变量。

GLOBAL 于EXPORT相同。

; 以下为向量表,在复位时被映射到FLASH的0地址; Vector Table Mapped to Address 0 at Reset;实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000)AREA RESET, DATA, READONLY ;定义一块数据段,只可读,段名字是RESET,复位段,只包含数据,只读EXPORT __Vectors ;标号输出,中断向量表开始;EXPORT在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用EXPORT __Vectors_End ;在程序中声明一个全局标号__Vectors_EndEXPORT __Vectors_Size ;在程序中声明一个全局号__Vectors_Size,中断向量表大小; DCD 命令分配一个或多个字的存储器,在四个字节的边界上对齐,并定义存储器的运行时初值。

__Vectors ;建立中断表DCD __initial_sp ; Top of Stack 栈顶指针,被放在向量表的开始,FLASH的0地址,复位后首先装载栈顶指针DCD Reset_Handler ; Reset Handler 复位异常,装载完栈顶后,第一个执行的,并且不返回。

相关文档
最新文档