STM32启动流程
启动文件主要工作:
. 设置堆栈指针SP=_initial_sp
. 设置PC指针=Reset_Handler
. 配置系统时钟
. 配置外部SRAM用于程序变量等数据存储(可选)
. 调用C库中的_main函数,最终调用main函数
注意:CortexM4复位后,处于线程模式,指令权限是特权级别(最高级别),堆栈设置为主堆栈
复位流程:
. 硬件复位后,CPU内的电路完成如下两个工作(Flash为例子)
. 将0x08000000位置存放的堆栈栈顶地址存放到SP中(MSP)
. 将0x08000004位置存放的向量地址装入到PC程序计数器
. CPU从PC寄存器指向的物理地址取出第一条指令开始执行程序,也就是Reset_Handler。
qi
复位中断程序会调用SystemInit函数(C语言)来配置时钟、配置FSMC总线上的SRAM,然后跳转到C库的_main函数,最后由_main函数调用用户写的main()函数执行C程序
IAR中main中具体流程(http://www.cnblogs.com/mssql/archive/2011/01/29/tt146.html)
参考程序IAR(W1-Main-F4工程)//
Reset_Handler LDR R0, =SystemInit;//将SystemInit函数的地址放到R0中
BLX R0;//跳转SystemInit函数
LDR R0, =__iar_program_start;// __iar_program_start函数的地址存放到R0,
BX R0 PUBWEAK NMI_Handler
SECTION .text:CODE:REORDER:NOROOT()
//然后跳转到main函数中(__iar_program_start到main中还有很多隐藏部分,可不理解)
Keil参考程序(STM32-X3开发板:ADC的8通道扫描模式)
; Reset handler
;利用PROC、ENDP这一对伪指令把程序段分为若干个过程,使程序的结构加清晰
Reset_Handler PROC;过程的开始
EXPORT Reset_Handler [WEAK];//弱定义,意思是如果在别处也定义该标号(函数),在链接事用别处的地址,如果没有其他地方定义,编译器也不会报错,以此地址进行链接,EXPORT提示编译器该标号可以为外部文件使用
IMPORT SystemInit;;通知编译器要使用的标号在其他文件
IMPORT __main LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
https://www.cnblogs.com/afeibfp/archive/2013/01/08/2850408.html
;BX是ARM指令集和THUMB指令集之间程序的跳转
;使用“=”表示LDR目前是伪指令不是标准指令。这里是把__main的地址给RO
__main函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main()函数 NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B . ;原地跳转(即无限循环),
ENDP Stack_Size EQU 0x00000400 ;//定义堆栈大小
AREA STACK, NOINIT, READWRITE, ALIGN= ;//定义一个数据段 按8字节对齐 ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0
Stack_Mem SPACE Stack_Size ;//保留Stack_Size大小的堆栈空间 分 配连续 Stack_Size 字节的存储单元并初始化为 0
__initial_sp ;//标号,代表堆栈顶部地址,后面有用 ; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:>
; </h>
Heap_Size EQU 0x00000200 ;//定义堆空间大小
AREA HEAP, NOINIT, READWRITE, ALIGN= ;//定义一个数据段,8字节对齐
__heap_base ;//标号,代表堆末底部地址,后面有用
Heap_Mem SPACE Heap_Size ;//保留Heap_Size的堆空间
__heap_limit ;//标号,代表堆界限地址,后面有用
;PRESERVE8 指令指定当前文件保持堆栈八字节对齐。 它设置 PRES8 编译属性以通知链接器。
;链接器检查要求堆栈八字节对齐的任何代码是否仅由保持堆栈八字节对齐的代码直接或间接地调用。
PRESERVE8 ;//指示编译器8字节对齐
THUMB ;//指示编译器以后的指令为THUMB指令
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
;堆和栈的初始化
IF :DEF:__MICROLIB ;“DEF”的用法——:DEF:X 就是说X定义了则为真,否则为假
;如果定义了MICORLIB,
EXPORT __initial_sp ;则将栈顶地址,
EXPORT __heap_base ;堆起始地址赋予全局属性,
EXPORT __heap_limit ;堆末端界限地址赋予全局属性,使外部程序可调用 ELSE ;如果没定义__MICROLIB,则使用默认的C运行时库 IMPORT __use_two_region_memory ;;通知编译器要使用的标号在其他文件__use_two_region_memory
EXPORT __user_initial_stackheap ;声明全局标号__user_initial_stackheap,这样外程序也可调用此标号
;则进行堆栈和堆的赋值,在__main函数执行过程中调用 ;如果使用默认的C库,程序启动过程中就不会执行该标号下的代码
__user_initial_stackheap ;标号__user_initial_stackheap,表示用户堆栈初始化程序入口
;//则进行堆栈和堆的赋值,在__main函数执行过程中调用。
LDR R0, = Heap_Mem ;保存堆始地址
LDR R1, =(Stack_Mem + Stack_Size) ;保存栈的大小
LDR R2, = (Heap_Mem + Heap_Size) ;保存堆的大小
LDR R3, = Stack_Mem ;保存栈顶指针
BX LR
ALIGN ;填充字节使地址对齐
ENDIF
END
STM32启动流程的更多相关文章
- RTT学习之启动流程
总结RT-Thread的启动流程. 非运行时与运行时的image文件分别是什么样的,请画下来.是谁将 RW 段中的 RW-data(初始化的全局变量)搬运到 RAM 中? MDK环境下各种数据段存储 ...
- STM32启动代码分析及其汇编学习-ARM
STM32 启动代码 Author By YuCloud 边看启动文件边学汇编 汇编 see ARM: Assembler User Guide see: https://blog.csdn.net/ ...
- STM32启动文件
一.复位电路 在了解启动文件之前需要明白STM32的复位中断流程,STM32的复位分为上电复位和手动复位,复位的电路图如下所示: 注意: 图中的复位电路是低电平复位,有的MCU是高电平复位. 上电复位 ...
- MyCat源码分析系列之——配置信息和启动流程
更多MyCat源码分析,请戳MyCat源码分析系列 MyCat配置信息 除了一些默认的配置参数,大多数的MyCat配置信息是通过读取若干.xml/.properties文件获取的,主要包括: 1)se ...
- Android进阶系列之源码分析Activity的启动流程
美女镇楼,辟邪! 源码,是一个程序猿前进路上一个大的而又不得不去翻越障碍,我讨厌源码,看着一大堆.5000多行,要看完得啥时候去了啊.不过做安卓的总有这一天,自从踏上这条不归路,我就认命了.好吧,我慢 ...
- Spring Boot启动流程详解(一)
环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...
- linux启动流程及自定义gurb
linux 启动流程 POST BIOS(boot sequence) 所选择的启动设备次序的MBR中是否有引导程序, ----> MBR(bootloader) 提供内核列表 -------& ...
- STM32启动代码分析 IAR 比较好
stm32启动代码分析 (2012-06-12 09:43:31) 转载▼ 最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...
- linux启动流程
看了深入理解linux内核一书的最后对linux启动流程的介绍,下面就把我能理解的写一下吧: bios(硬件加电自检POST,寻找第一个启动设备) the boot loader(可以从硬盘启动也可以 ...
随机推荐
- layui的tree和form并没有冲突!无限级tree下拉列表和select下拉列表同一页使用!
在昨天写的随笔中: layui的tree和form同时引用出现冲突的粗略解决办法 https://www.cnblogs.com/xwma/p/10900975.html 提出有冲突,今天在开发中发现 ...
- JMETER CSS JQUERY EXTRACTOR
我想如果你在这里,你可能已经访问了我们关于变量提取的JMeter系列: XPath Extractor:使用XPath Expressions从XML响应中提取内容, Regexp Extractor ...
- js 为对象添加和删除属性
对于一个普通的js对象: var obj = { name:"mary", age:21 } 如果我们要对它添加新属性的话可以使用下列方式: obj.address = " ...
- saltstack执行结果存储到MySQL
saltstack执行结果保存到MySQL中,以便进行命令安全审计必须是python2.7以上的环境安装相关模块ubuntu系统安装 apt-get install -y python-mysqldb ...
- angular中[hidden]="expression"注意事项
[hidden]="expression",右侧的表达式尽量使用布尔值:虽然比较运算符也可以达到效果,但时常会出现一些莫名其妙的错误.
- Testing Round #12 B
Description A restaurant received n orders for the rental. Each rental order reserve the restaurant ...
- (转)IE6 死后即将大快人心的10件事
(转)未来五年程序员应当具备的十项技能 W3C CSS 2.1 Specification(Quick Table of Contents) (转)IE6 死后即将大快人心的10件事 2009-04- ...
- flask SQLAlchemy query.filter_by 常用操作符
常用的filter操作符 下面的这些操作符可以应用在filter函数中 equals: query.filter(User.name == 'ed') not equals: query.filter ...
- Arduino连接SHT10温湿度传感器--返回值不正常解决办法
如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...
- hibernate课程 初探单表映射3-3 对象类型
本节简介: 1 简介对象类型(重点是音视频blob类型) 2 demo(对图片的写入数据库与读取) 1 简介对象类型 映射类型 java类型 标准sql类型 mysql类型 oracle类型 bina ...