STM32F4XX启动文件分析
STM32F4XX启动文件分析
- STM32F4XX启动文件下载地址
导读:STM32F4XX启动文件的作用
初始化设置SP,即栈指针
初始化设置PC指针指向复位中断处理函数,即PC = Reset_Handler
导入中断服务程序(ISR)地址以设置中断向量表
配置系统时钟与外部挂载到STM324xG-EVAL板子上的的SRAM用作数据存储,外部完成的Systeminit完成
转到C库的__main处,也就是main()函数处进行代码的执行
复位CortexM4之后,处理器处于线程模式,为特权优先级,并且栈被设置位MSP主堆栈
1、设置栈
Stack_Size EQU 0x00000400 ;栈大小设置为1024字节
AREA STACK, NOINIT, READWRITE, ALIGN=3 ;段名称为STACK,未初始化,允许读写,8字节对齐
;AREA指示编译器编译出一个新的代码段或者数据段,ALIGN = 3,就是2的3次方字节对齐,也就是8字节
Stack_Mem SPACE Stack_Size ;分配空间,大小为1024字节,并把首地址赋值给Stack_Mem
__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、设置堆
Heap_Size EQU 0x00000200 ;堆大小设置为512字节
AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;段名称为HEAP,未初始化,允许读写,8字节对齐
__heap_base ;堆起始地址
Heap_Mem SPACE Heap_Size ;分配堆空间
__heap_limit ;堆限制大小
3、设置对齐与指令集
PRESERVE8 ;保持下述空间保持8字节对齐
THUMB ;使用THUMB指令集,要声明在任何使用THUMB指令集的语句之前
4、设置中断向量表
AREA RESET, DATA, READONLY ;段名称为RESET,数据段,只读,保持8字节对齐,由上面的PRESERVE8指定
EXPORT __Vectors ;向量表开始
EXPORT __Vectors_End ;向量表结束
EXPORT __Vectors_Size ;向量表大小,可由上述两个标号算出
;EXPORT 标号的输出(类似于linux设备驱动模块的EXPORT_SYMBOL(symbol))
;DCD 用于分配一片连续的存储单元,并且使用指定的数据进行初始化,仍然保持8字节的对齐
__Vectors DCD __initial_sp ; 堆栈顶部地址,复位后首先装载堆栈
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; 硬件错误
DCD MemManage_Handler ; MPU错误
DCD BusFault_Handler ; 总线错误
DCD UsageFault_Handler ; 引用错误
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; 系统滴答计时器中断响应函数
;上述为STM32内部指定中断向量
; External Interrupts
DCD WWDG_IRQHandler ; Window WatchDog
... ...
DCD HASH_RNG_IRQHandler ; Hash and Rng
DCD FPU_IRQHandler ; FPU
__Vectors_End ;中断向量表结束地址
__Vectors_Size EQU __Vectors_End - __Vectors ;定义中断向量表长度为结束地址减去开始地址
5、构建中断向量函数
AREA |.text|, CODE, READONLY ;段名为.text(C编译器产生的代码段就是.text,此处可以嵌入C编译出来的代码段),代码段,只读
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK] ;WEAK,如果有重复的定义,优先执行其他的定义
IMPORT SystemInit ;导入SystemInit标号
IMPORT __main ;导入__main标号,也就是main()函数地址
LDR R0, =SystemInit
BLX R0 ;带链接跳转并切换指令集
LDR R0, =__main
BX R0 ;跳转并切换指令集
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B . ;死循环
ENDP
... ... ... ...
6、用户栈与堆初始化
ALIGN ;默认的对齐方式,也就是4字节对齐
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB ;如果勾选了此选项(在keil工程option的target选项右侧)
EXPORT __initial_sp ;导出三个符号
EXPORT __heap_base ;
EXPORT __heap_limit ;
ELSE
IMPORT __use_two_region_memory ;否则导入__use_two_region_memory
EXPORT __user_initial_stackheap ;导出__user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem ;堆首地址
LDR R1, =(Stack_Mem + Stack_Size) ;栈顶
LDR R2, = (Heap_Mem + Heap_Size) ;堆末地址
LDR R3, = Stack_Mem ;栈首地址
BX LR ;等同于mov pc, lr
;跳转并切换指令集,也就是切换到ARM指令集
ALIGN
ENDIF
END
7、整个流程分析
- 先分配好栈,堆段
- 设置中断向量表段
- 初始化堆栈(外部调用)
- 构建中断处理函数,代码段(里面包含了中断复位处理函数,里面可以初始化整个系统,然后跳转到main()函数处执行)
STM32F4XX启动文件分析的更多相关文章
- 【AT91SAM3S】英蓓特EM-SAM3S开发板例子工程中的启动文件分析
手上一块英倍特的EM-SAM3S开发板,拿到已经有一个月了.本来是做uLoong活动使用的板子,可当初由于不熟悉这个芯片,使用了STM32F4当作了替代.最近准备抽点时间折腾下这个板子. 这个板子的资 ...
- STM32启动过程--启动文件--分析
一.概述 1.说明 每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道.通过了解启动文件,我们可以体会到处理器的架构.指令集.中断向量安排等内容,是非常值得玩味的. ST ...
- startup_LPC17XX.s 启动文件分析
工程中startup_LPC17XX.s是M3的启动文件,启动文件由汇编语言写的,它的作用一般是下面这几个: 1)堆和栈的初始化 2)中断向量表定义 3)地址重映射及中断向量表的转移 4)设置系统时钟 ...
- 关于ARM CM3的启动文件分析
下面以ARM Cortex_M3裸核的启动代码为例,做一下简单的分析.首先,在启动文件中完成了三项工作: 1. 堆栈以及堆的初始化 2. 定位中断向量表 3. 调用Reset Handler. ...
- Cortex-M3 .s启动文件分析
1. 基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器软件接口标准. 2. CMSIS标准的文件结构: a) ...
- Cortex-M系列内核 启动文件分析
最近终于闲了下来了准备好好学习下Cortex-M3/M4系列处理器的架构,经过各种资料的折磨也没法对它的整个工作过程能有个完整的认知,最后看到一片博客打算从程序的运行过程开始探究,所以首先就找到了启动 ...
- keil MDK启动文件分析---基于LPC2100系列(其实都是相通的)
转用MDK有一段时间了,越来越觉得MDK的强大,因为我之前都是用ADS1.2开发产品,所以更能体会到MDK的强大与易用性.MDK编译出来的代码与ADS1.2相比,代码量减少了很多,我的一个工程用ADS ...
- 关于启动文件分析的(MDK-ARM) 【转】
;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** ;* File Name : star ...
- stm32f407启动文件分析
; Amount of memory (in bytes) allocated for Stack; Tailor this value to your application needs; < ...
随机推荐
- ansible modules开发(一)
一 模块说明 官方是否有提供的类似功能模块? 可从下面两个连接确定官方提供的模块,以免重复造轮子 官方已发布的模块 http://docs.ansible.com/ansible/modules.ht ...
- settings.xml配置文件详解
简单值 一半顶层settings元素是简单值,它们表示的一系列值可以配置Maven的核心行为:settings.xml中的简单顶层元素 < settings xmlns="http:/ ...
- Spring入门2. IoC中装配Bean
Spring入门2. IoC中装配Bean 20131125 前言: 上一节学习了Spring在JavaProject中的配置,通过配置文件利用BeanFactory和ApplicationConte ...
- System.Zip
自XE2增加的System.Zip单元很好.注意事项: 1.文件压缩到文档后所使用的文件名会成为解压后的文件名,如果该文件名为指定文件名且无后缀名,那么解压出来的文件名也没有后缀名:
- SCM-MANAGER-禁用用户
用管理远用户登录到scm-manager的管理界面http://*.*.*.*:8081/ 设置目标用户为禁用 验证 非 “active” 状态 目标用户客户端不能pull 一直提示登录
- eureka-3-常用注解
@EnableDiscoveryClient @EnableEurekaClient 上面两个注解都是用在应用的启动类上面,声明这是一个Eureka Client ,现在说明两个注解的区别. spri ...
- PHP工作笔记:离线执行php任务
直接上代码,主要函数 ignore_user_abort(true);这个函数忽略了终端被关闭(打开的网页被关闭),后面 getfiles()这函数是执行采集任务的自定义函数,后面又配置了下路径打开写 ...
- java中a++和++a的区别详解
java中的++操作无论在前还是在后,都是在变量自身的值加1,接下来将具体描述两者的区别 int a =5; int b =a++; System.out.println(b); 1.通俗易懂的理解是 ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
- jfreechart在jsp中画图方式
这个问题一直困扰我好久,今天算是稍微找到一点解决思路了,在网上搜了好多列子,大部分的都是用servlet来实现画图,偶然找到一个列子用的是org.jfree.chart.servlet.Servlet ...