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(可以从硬盘启动也可以 ...
随机推荐
- C语言经典算法100例(三)
1.河内之塔 说明河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家 Edoua ...
- VS2010 不显示 最近使用的项目 解决办法(转)
昨天重装了VS2010,然后开了项目看了下今天早上再打开发现起始页近使用项目列表是空白的,每次打开项目都要去到指定目录去找解决方案才能打开,感觉很麻烦,在网上找了下解决方案,解决步骤下:菜单 —— 运 ...
- Hadoop3.0 DataNode启动不成功——java.net.BindException: Port in use: localhost:0 Caused by: java.net.BindException: Cannot assign requested address解决办法
一.问题出现的原因 启动Hadoop分布式环境时出现主节点的namenode.secondarynamenode启动成功,但是Worker节点datenode启动不成功. hadoop@master$ ...
- QQ音乐MP3下载
QQ音乐MP3下载 没错本次写的内容的对象是我们熟知的QQ Music. 本篇文章涉及内容包括:Python,爬虫,json解析,request 库的使用 缘起 前几天刷B站无意中又刷到了一首神曲,“ ...
- html的Vue.js框架概述
前端的三大框架: Augular.js 由Google的研发团队最先写出 React.js 由facebook的团队继Augular.js之后写出 Vue.js ...
- 洛谷P2846 光开关Light Switching
题目描述 灯是由高科技--外星人鼠标操控的.你只要左击两个灯所连的鼠标, 这两个灯,以及之间的灯都会由暗变亮,或由亮变暗.右击两个灯所连的鼠 标,你就可以知道这两个灯,以及之间的灯有多少灯是亮的.起初 ...
- idea中使用Git对项目进行版本控制
- jquery 中$.fn是什么意思
$.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效. 如扩展$.fn.abc() 那么你可以这样子:$("#div").abc(); 通常使 ...
- jquery json实现省市级级联
java后台程序: import java.util.HashMap;import java.util.List;import java.util.Map; import javax.servlet. ...
- Restful 2 --DRF解析器,序列化组件使用(GET/POST接口设计)
一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...