STM32启动文件详解_第1页
STM32启动文件详解_第2页
STM32启动文件详解_第3页
STM32启动文件详解_第4页
STM32启动文件详解_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

精品文档 1欢迎下载 STM32 启动文件详解 2012 07 28 11 22 34 转 载 标签 stm32 启动 分类 STM32 在 用的是 STM32F103RBT6 所有的例程都采用了一个叫 STM32F10 x s 的启动文件 里面定义了 STM32 的堆栈大小以及各种中断的名字及入口函数 名称 还有启动相关的汇编代码 STM32F10 x s 是 MDK 提供的启动代码 从其里面的内容 看来 它只定义了 3 个串口 4 个定时器 实际上 STM32 的系列产品有 5 个串口的型号 也只有有 2 个串口的型号 定时器也是 做多的有 8 个定时器 比如 如果你用的 STM32F103ZET6 而启动文件用的是 STM32F10 x s 的话 你可以正常使用串口 1 3 的中断 而串口 4 和 5 的中断 则无 常使用 又比如 你 TIM1 4 的中断可以正常使用 而 5 8 的 则无法使用 而在固件库里出现 3 个文件 startup stm32f10 x ld s startup stm32f10 x md s startup stm32f10 x hd s 其中 ld s 适用于小容量 产品 md s 适用于中等容量产品 hd 适用于大容量产品 这里的容量是指 FLASH 的大小 判断方法如下 小容量 FLASH 32K 中容量 64K FLASH 128K 大容量 256K FLASH C COPYRIGHT 2011 STMicroelectronics File Name startup stm32f10 x hd s Author MCD Application Team Version V3 5 0 Date 11 March 2011 Description STM32F10 x 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 精品文档 2欢迎下载 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 说明 此文件为 STM32F10 x 高密度设备的 MDK 工具链的启动文件 该模块执行以下操作 设置初始堆栈指针 SP 设置初始程序计数器 PC 为复位向量 并在执行 main 函数前 初始化系统时钟 设置向量表入口为异常事件的入口地址 复位之后处理器为线程模式 优先级为特权级 堆栈设置为 MSP 主堆栈 首先对栈和堆的大小进行定义 并在代码区的起始处建立中断向量表 其第一个表项是 栈 顶地址 第二个表项是复位中断服务入口地址 然后在复位中断服务程序中跳转 C C 标 准实时库的 main 函数 假设 STM32 被设置为从内部 FLASH 启动中断向量表起始地位为 0 x8000000 则栈顶地址存放于 0 x8000000 处 而复位中断服务入口地址存放于 0 x8000004 处 当 STM32 遇 到复位信号后 则从 0 x80000004 处取出复位中断服务入口地址继而执行复位中断服务程 序 然后跳转 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 精品文档 3欢迎下载 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 Stack Configuration Stack Size in Bytes Stack Size EQU 0 x00000400 定义栈大小 1024B AREA 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 按数据段的字母顺序链接数据段的地址的 所以此处造成了堆的地址在栈 的前面的假象 不要窃以为是有某种特殊的约定 Heap Configuration Heap Size in Bytes Heap Size EQU 0 x00000200 定义堆的大小 AREA HEAP NOINIT READWRITE ALIGN 3 堆段 malloc 用的地方 不一定连续空间 未初始化 允许读写 堆数据段 8 字节边界对齐 heap base 表示堆空间起始地址 精品文档 4欢迎下载 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 启动 则此中断向量表起始地址即为 0 x8000000 AREA RESET DATA READONLY 定义一块数据段 只可读 段名 字是 RESET 复位段 只包含数据 只读 EXPORT Vectors 标号输出 中断向量表开始 EXPORT 在程序中声明 一个全局的标号 Vectors 该标号可在其他的文件中引用 EXPORT Vectors End 在程序中声明一个全局标号 Vectors End EXPORT Vectors Size 在程序中声明一个全局号 Vectors Size 中断向量表大小 DCD 命令分配一个或多个字的存储器 在四个字节的边界上对齐 并定义存储器的运行 时初值 Vectors 建立中断表 DCD initial sp Top of Stack 栈顶指针 被放在向量 表的开始 FLASH 的 0 地址 复位后首先装载栈顶指针 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 总线错 误中断 一般发生在数据访问异常 比如 fsmc 访问不当 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 调试 精品文档 5欢迎下载 监视异常 DCD 0 Reserved DCD PendSV Handler PendSV Handler 挂起异常 此处可以看见用作了 uCOS II 的上下文切换异常 这是被推荐使用的 因为 Cortex M3 会在异常发生时自动保存 R0 R3 R12 R13 堆栈指针 SP R14 链接地址 也叫返回地址 LR 在异常返回时使用 R15 程序计数器 PC 为当前应用程序 4 和中断完成时自动回复我们只需保存 R4 R11 大大减少了中断响应和上下文切换的时间 说明 此处涉及到一个中断保存寄存器问题 因为在所有的运行模式下 未分组寄存器 都指向同一个物理寄存器 他们未被系统用作特殊的用途 因此 在中断或者异常处理进行模式转换时 由于不同模式 此处为 线程 和 特权 均使用相同的物理寄存器 可能会造成寄存器中数据的破坏 这也是常说的 关键代码段 和 l 临界区 保护的原因 DCD SysTick Handler SysTick Handler 滴答定时 器 为操作系统内核时钟 DCD OS CPU PendSVHandler DCD OS CPU SysTickHandler External Interrupts 以上都是 Coretex M3 内核自带的 以下 为外部中断向量表 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 USB High Priority or CAN1 TX DCD USB LP CAN1 RX0 IRQHandler USB Low Priority or CAN1 RX0 精品文档 6欢迎下载 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 向量表结束标志 精品文档 7欢迎下载 Vectors Size EQU Vectors End Vectors 计算向量表地址空间大小 得到 向量表的大小 304 个字节也就是 0 x130 个字节 text 用于表示由 C 编译程序产生的代码段 或用于以某种方式与 C 库关联的代码段 AREA text CODE READONLY 定义 C 编译器源代码的代码段 只读 定义一个代码段 可读 段名字是 text Reset handler Reset Handler PROC 利用 PROC ENDP 这一对伪指令把程序段分为若干个过程 使程序 的结构加清晰 EXPORT Reset Handler WEAK 此处 WEAK 表示弱定义 在外部没有定义该符号时导出该符号 Reset Handler IMPORT main IMPORT 伪指令用于通知编译器要使用的标号 在其他的源文件中定义 但要在当前源文件中引用 而且无论当前源文件是否引用该标号 该标号均会被加入到当前源文件的符号表中 IMPORT SystemInit LDR R0 SystemInit 装载寄存器指令 BLX R0 带链接的跳转 切换指令集 LDR R0 main main 为 运行时库提供的函数 完成堆栈 堆 的初始话等工作 会调用下面定义的 user initial stackheap BX R0 切换指令集 main 函数不返回 跳到 main 进 入 C 的世界 ENDP Dummy Exception Handlers infinite loops which can be modified WEAK 声明其他的同名标号优先于该标号被引用 就是说如果外面声明了的话 会调用外 面的 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 精品文档 8欢迎下载 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 OS CPU PendSV Handler PROC EXPORT PendSV Handler WEAK EXPORT OS C PU PendSV Handler WEAK B B ENDP ENDP SysTick Handler PROC OS CPU SysTick Handler PROC EXPORT SysTick Handler WEAK E XPORT OS CPU SysTick Handler WEAK B B ENDP 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 精品文档 9欢迎下载 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 精品文档 10欢迎下载 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 IRQHandl

温馨提示

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

评论

0/150

提交评论