STM32F4XX启动文件分析 
STM32F4XX启动文件下载地址

导读:STM32F4XX启动文件的作用

  • 初始化设置SP,即栈指针

  • 初始化设置PC指针指向复位中断处理函数,即PC = Reset_Handler

  • 导入中断服务程序(ISR)地址以设置中断向量表

  • 配置系统时钟与外部挂载到STM324xG-EVAL板子上的的SRAM用作数据存储,外部完成的Systeminit完成

  • 转到C库的__main处,也就是main()函数处进行代码的执行

  • 复位CortexM4之后,处理器处于线程模式,为特权优先级,并且栈被设置位MSP主堆栈

1、设置栈

  1. Stack_Size EQU 0x00000400 ;栈大小设置为1024字节
  2. AREA STACK, NOINIT, READWRITE, ALIGN=3 ;段名称为STACK,未初始化,允许读写,8字节对齐
  3. ;AREA指示编译器编译出一个新的代码段或者数据段,ALIGN = 3,就是23次方字节对齐,也就是8字节
  4. Stack_Mem SPACE Stack_Size ;分配空间,大小为1024字节,并把首地址赋值给Stack_Mem
  5. __initial_sp ;初始化栈指针,指向栈的顶部,也就是上述空间的尾部,STM32采用满递减堆栈
寻址方式 说明   pop=LDM   push=STM
FA 满递增 LDMFA LDMDA STMFA STMIB
FD 满递减 LDMFD LDMIA STMFD STMDB
EA 空递增 LDMEA LDMDB STMEA STMIA
ED 空递减 LDMED LDMIB STMED STMDA

满递增:SP指向最后一个被压入的元素,SP朝内存地址增加方向递增 
满递减:SP指向最后一个被压入的元素,SP朝内存地址减小方向递增 
空递增:SP指向最后一个被压入的元素的下一个为空的地址,SP朝内存地址增加方向递增 
空递减:SP指向最后一个被压入的元素的下一个为空的地址,SP朝内存地址减小方向递增

2、设置堆

  1. Heap_Size EQU 0x00000200 ;堆大小设置为512字节
  2. AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;段名称为HEAP,未初始化,允许读写,8字节对齐
  3. __heap_base ;堆起始地址
  4. Heap_Mem SPACE Heap_Size ;分配堆空间
  5. __heap_limit ;堆限制大小

3、设置对齐与指令集

  1. PRESERVE8 ;保持下述空间保持8字节对齐
  2. THUMB ;使用THUMB指令集,要声明在任何使用THUMB指令集的语句之前

4、设置中断向量表

  1. AREA RESET, DATA, READONLY ;段名称为RESET,数据段,只读,保持8字节对齐,由上面的PRESERVE8指定
  2. EXPORT __Vectors ;向量表开始
  3. EXPORT __Vectors_End ;向量表结束
  4. EXPORT __Vectors_Size ;向量表大小,可由上述两个标号算出
  5. ;EXPORT 标号的输出(类似于linux设备驱动模块的EXPORT_SYMBOL(symbol))
  6. ;DCD 用于分配一片连续的存储单元,并且使用指定的数据进行初始化,仍然保持8字节的对齐
  7. __Vectors DCD __initial_sp ; 堆栈顶部地址,复位后首先装载堆栈
  8. DCD Reset_Handler ; Reset Handler
  9. DCD NMI_Handler ; NMI Handler
  10. DCD HardFault_Handler ; 硬件错误
  11. DCD MemManage_Handler ; MPU错误
  12. DCD BusFault_Handler ; 总线错误
  13. DCD UsageFault_Handler ; 引用错误
  14. DCD 0 ; Reserved
  15. DCD 0 ; Reserved
  16. DCD 0 ; Reserved
  17. DCD 0 ; Reserved
  18. DCD SVC_Handler ; SVCall Handler
  19. DCD DebugMon_Handler ; Debug Monitor Handler
  20. DCD 0 ; Reserved
  21. DCD PendSV_Handler ; PendSV Handler
  22. DCD SysTick_Handler ; 系统滴答计时器中断响应函数
  23. ;上述为STM32内部指定中断向量
  24. ; External Interrupts
  25. DCD WWDG_IRQHandler ; Window WatchDog
  26. ... ...
  27. DCD HASH_RNG_IRQHandler ; Hash and Rng
  28. DCD FPU_IRQHandler ; FPU
  29. __Vectors_End ;中断向量表结束地址
  30. __Vectors_Size EQU __Vectors_End - __Vectors ;定义中断向量表长度为结束地址减去开始地址

5、构建中断向量函数

  1. AREA |.text|, CODE, READONLY ;段名为.textC编译器产生的代码段就是.text,此处可以嵌入C编译出来的代码段),代码段,只读
  2. ; Reset handler
  3. Reset_Handler PROC
  4. EXPORT Reset_Handler [WEAK] ;WEAK,如果有重复的定义,优先执行其他的定义
  5. IMPORT SystemInit ;导入SystemInit标号
  6. IMPORT __main ;导入__main标号,也就是main()函数地址
  7. LDR R0, =SystemInit
  8. BLX R0 ;带链接跳转并切换指令集
  9. LDR R0, =__main
  10. BX R0 ;跳转并切换指令集
  11. ENDP
  12. ; Dummy Exception Handlers (infinite loops which can be modified)
  13. NMI_Handler PROC
  14. EXPORT NMI_Handler [WEAK]
  15. B . ;死循环
  16. ENDP
  17. ... ... ... ...

6、用户栈与堆初始化

  1. ALIGN ;默认的对齐方式,也就是4字节对齐
  2. ;*******************************************************************************
  3. ; User Stack and Heap initialization
  4. ;*******************************************************************************
  5. IF :DEF:__MICROLIB ;如果勾选了此选项(在keil工程optiontarget选项右侧)
  6. EXPORT __initial_sp ;导出三个符号
  7. EXPORT __heap_base ;
  8. EXPORT __heap_limit ;
  9. ELSE
  10. IMPORT __use_two_region_memory ;否则导入__use_two_region_memory
  11. EXPORT __user_initial_stackheap ;导出__user_initial_stackheap
  12. __user_initial_stackheap
  13. LDR R0, = Heap_Mem ;堆首地址
  14. LDR R1, =(Stack_Mem + Stack_Size) ;栈顶
  15. LDR R2, = (Heap_Mem + Heap_Size) ;堆末地址
  16. LDR R3, = Stack_Mem ;栈首地址
  17. BX LR ;等同于mov pc, lr
  18. ;跳转并切换指令集,也就是切换到ARM指令集
  19. ALIGN
  20. ENDIF
  21. END

7、整个流程分析

  1. 先分配好栈,堆段
  2. 设置中断向量表段
  3. 初始化堆栈(外部调用)
  4. 构建中断处理函数,代码段(里面包含了中断复位处理函数,里面可以初始化整个系统,然后跳转到main()函数处执行)

STM32F4XX启动文件分析的更多相关文章

  1. 【AT91SAM3S】英蓓特EM-SAM3S开发板例子工程中的启动文件分析

    手上一块英倍特的EM-SAM3S开发板,拿到已经有一个月了.本来是做uLoong活动使用的板子,可当初由于不熟悉这个芯片,使用了STM32F4当作了替代.最近准备抽点时间折腾下这个板子. 这个板子的资 ...

  2. STM32启动过程--启动文件--分析

    一.概述 1.说明 每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道.通过了解启动文件,我们可以体会到处理器的架构.指令集.中断向量安排等内容,是非常值得玩味的. ST ...

  3. startup_LPC17XX.s 启动文件分析

    工程中startup_LPC17XX.s是M3的启动文件,启动文件由汇编语言写的,它的作用一般是下面这几个: 1)堆和栈的初始化 2)中断向量表定义 3)地址重映射及中断向量表的转移 4)设置系统时钟 ...

  4. 关于ARM CM3的启动文件分析

    下面以ARM Cortex_M3裸核的启动代码为例,做一下简单的分析.首先,在启动文件中完成了三项工作: 1.  堆栈以及堆的初始化 2.  定位中断向量表 3.  调用Reset Handler. ...

  5. Cortex-M3 .s启动文件分析

    1. 基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器软件接口标准. 2. CMSIS标准的文件结构: a) ...

  6. Cortex-M系列内核 启动文件分析

    最近终于闲了下来了准备好好学习下Cortex-M3/M4系列处理器的架构,经过各种资料的折磨也没法对它的整个工作过程能有个完整的认知,最后看到一片博客打算从程序的运行过程开始探究,所以首先就找到了启动 ...

  7. keil MDK启动文件分析---基于LPC2100系列(其实都是相通的)

    转用MDK有一段时间了,越来越觉得MDK的强大,因为我之前都是用ADS1.2开发产品,所以更能体会到MDK的强大与易用性.MDK编译出来的代码与ADS1.2相比,代码量减少了很多,我的一个工程用ADS ...

  8. 关于启动文件分析的(MDK-ARM) 【转】

    ;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** ;* File Name : star ...

  9. stm32f407启动文件分析

    ; Amount of memory (in bytes) allocated for Stack; Tailor this value to your application needs; < ...

随机推荐

  1. JavaScript中的call、apply、bind是怎么回事?

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...

  2. 由浅入深了解EventBus:(二)

    概念 深入学习EventBus框架,就必须理解EventBus的相关原理和一些概念: Subscribe 在EventBus框架中,消息的处理接收方法必须要“@Subscribe”注解来进行标注: p ...

  3. 禁用iPhone手机浏览器上给电话号码自动加上的link样式(苹果手机自动给手机号加样式)

    原文地址:http://blog.csdn.net/atec2000/article/details/44631633 iPhone手机上的浏览器(如Safari),在解析网页的时候会自动给 像是电话 ...

  4. LeetCode OJ:Implement strStr()(实现子字符串查找)

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  5. 【javascript基础】函数前面的一元操作符

    在函数前面加:+  ;  ~ !  - 等等一元操作符,javascript 引擎都会将后面的statement转换成表达式(expression),这样就可以调用了.

  6. C++以多态方式处理数组可能会遇到的问题

    今天读<More Effective C++>时遇到一个条款:绝对不要以多态方式处理数组.以前自己也没有注意过,觉得有必要记录下来. C++是允许通过base class的指针或引用来操作 ...

  7. 联想北研实习生面试-嵌入式Linux研发工程师

    8月中旬暑假去联想北研参加了实习生面试,面试职位是嵌入式Linux研发工程师.投完简历第二天,主管回复我邮件,意思是说随时来面试,到北研时候给他打个电话就行.于是我回复条短信表示感谢,并约好时间第二天 ...

  8. 20165202 2017-2018-2 《Java程序设计》第6周学习总结

    教材学习内容总结 Ch8 String类: 程序可以直接使用,String类不能有子类 - 构造String对象 使用String类声明并创建对象 String s = new String(&quo ...

  9. android 编译环境 & 开发教程 【持续更新】

    一. 优秀博文推荐 1.ubuntu 搭建 android源码编译环境 ubuntu14.04LTS android 源码编译环境的搭建 2.开源网站 2.android 开源 网站 2015最流行的 ...

  10. 安装visio 2010:您的计算机上的Office 2003安装已损坏,安装程序无法继续。请删除或修复office 2003产品并重新运行安装程序

    您的计算机上的Office 2003安装已损坏,安装程序无法继续.请删除或修复office 2003产品并重新运行安装程序   最近打算安装visio 2010时出现 以下错误: “您的计算机上的Of ...