历史上的今天
返回首页

历史上的今天

今天是:2025年08月14日(星期四)

正在发生

2018年08月14日 | STM32启动过程解读与跟踪验证

2018-08-14 来源:eefocus

        近段时间由于在做ucos-iii的移植,所以就顺便了解下STM32的启动过程。经过查阅各种官方文献和对代码进行单步跟踪,详细地叙述了STM32加电启动的具体过程。对于关键性的语句都指明了出处。下面将学习成果分享给大家,由于笔者知识有限,不当之处敬请指出。     

        为了更好的说明问题,先来看STM32的内存映射(以STM32L1xx为例)

        由于固定的内存映射,代码区(code area)从0x00000000开始,通过指令总线(ICode Bus)和数据总线(DCode Bus)访问。数据区(SRAM)从0x20000000开始,通过系统总线(System Bus)访问。Cortex™-M3 CPU总是通过指令总线(ICode Bus)取得复位向量,这就意味着启动空间(boot space)只能处于代码区(code area),典型的就是Flash。STM32系列使用了一种特殊的机制,能够从代码区以外的区域启动(如,内部的SRAM)。(《cortex-m3编程指南》)

        这就意味着,STM32系列可以有3种启动模式,由BOOT1与BOOT0的设置决定选择Flash、System memory还是SRAM作为启动空间(boot space)。

          STM32把从0x00000000到0x0005FFFF的区域作为启动空间(boot space)的别名区。

从上面两个表中可以看出:

当从主闪存(Main Flash memory)启动时,启动空间别名区映射到Flash。

当从系统内存(System memory)启动时,启动空间别名区映射到System memory。

当从内部SRAM(Embedded SRAM)启动时,启动空间别名区映射到SRAM。

注:默认是这样的映射关系,但上述的映射关系启动后可以由软件修改(通过修改SYSCFG启动器的MEM_MODE位域)。

这样,Flash、System memory和SRAM分别可以从别名区和原始地址处访问。

Flash:访问地址为0x00000000或0x08000000

System memory:访问地址为0x00000000或0x1FF00000

SRAM:启动时地址为0x00000000或0x20000000(STM32Fxx的参考手册上说,启动后只能在0x20000000开始访问,即启动后这个映射消失,需要重定位中断向量表,这是特例)

System memory内置了ST提供的boot loader,可以通过该boot loader下载程序到Flash中。

用户程序实际只能存储在Flash中,且能在Flash和SRAM中执行(因为cortex-m3核采用哈佛结构,代码可直接在Flash运行,冯•诺依曼结构则必须将代码拷贝至RAM运行)。

Flash就像是电脑的硬盘,用于存储代码。

System memory就像是电脑的ROM,里面的程序有芯片厂商写好,用户不可改写。

SRAM就像是电脑的内存,里面的数据都是动态的,掉电就丢失的,用于建立堆栈等。

对于用户代码来说,只需要考虑从Flash启动和从SRAM启动两种情况。

了解上述映射关系之后,就可以讨论中断向量表了。

Cortex-m3核的中断向量表是不变的(中断向量表每一项为4个字节,中断向量表的第一项:栈顶,中断向量表的第二项:复位向量……,中断向量表每项内容可以看官方的启动文件,或者查看相关的手册),只需要用户设定表头的地址。

默认情况下,从Flash启动,中断向量表从Flash的起始地址(0x08000000)开始存放。同时映射到0x00000000处。向量表偏移寄存器(VTOR)的值为0x00000000(实际映射到0x08000000)。

若从SRAM启动,中断向量表还是存放在Flash中(Flash才能固化存储,SRAM只能加电才有效),只不过拷贝到SRAM的首地址0x20000000处。此时向量表偏移寄存器(VTOR)的值也是0x00000000(实际映射到0x20000000)。而启动过程结束后,这个特殊的映射不复存在了(据参考手册推测的),所以,需要修改向量表偏移寄存器(VTOR)的值为0x20000000以后的值(其中TBLOFF位域要是0x200的倍数,这个是字对齐的要求(见《cortex-m3编程手册》),由于STM32的中断向量一共有68+16=84个,应该把这个数增加到下一个2的整数倍即128,然后换算成地址范围128*4=512,就得到了0x200),以便处理中断。

因此,无论用哪种模式启动,复位时栈顶指针总能在0x00000000(或0x08000000)处找到,而复位向量总能在0x00000004(或0x08000004)处找到。

又根据《cortex-m3编程手册》,复位时,CPU从0x00000000处获取栈顶指针MSP(默认使用主堆栈),从0x00000004处获取程序计数器PC(复位向量)。则印证了上述说法。

下面通过追踪STM32L1xx标准外设库V1.2.0(STM32L1xx_StdPeriph_Lib_V1.2.0)中的启动文件startup_stm32l1xx_md.s来验证上述说法。

先复位CPU,从寄存器窗口可以看到:

 

R13(SP)的值为0x20000FC0(MSP),R15(PC)的值为0x08000420。这两个值就是地址0x00000000和地址0x00000004处存放的内容。由于是从Flash启动,所以,实际上也就是0x08000000和0x08000004处存放的内容。可以从内存窗口中看出:

 


内存地址

内容

0x00000000

C0H

0x00000001

0FH

0x00000002

00H

0x00000003

20H

0x00000004

21H

0x00000005

04H

0x00000006

00H

0x00000007

08H

从0x00000000处,取出1个字(32位,4个字节),为0x20000FC0,是堆栈指针SP的值。

从0x00000004处,取出1个字(32位,4个字节),为0x08000421,而PC指针读回0x08000420

它把末位的1变成了0,这个是由于内存对齐造成的,因为cortex-m3核PC的LSB一定读回0,因此指令至少是半字对齐的(《cortex-m3编程手册》)。

同样的结果在反汇编窗口也可以得到:

 


继续跟踪:此时程序寻址到PC指针指示的地址0x08000420处执行

 


此处,指令 LDR R0,=SystemInit 将函数SystemInit的入口地址传给R0,从反汇编窗口可以看到指令被写成LDR r0,[pc,#36],表明SystemInit的入口地址在存放在PC指针偏移36处,即0x08000420(+0x4)+0x24=0x08000448(因为CM3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4《Cortex™-M3权威指南》)下一条指令在0x08000422处,BLX R0 将R0的值传给PC(必须保证加载到PC的数值是奇数(即LSB=1),传给PC后,PC的LSB读回0),调用SystemInit函数。这个函数里面开启了外部晶振,设置了PLL,除能了所有中断,设置了时钟为32MHz,并且重定位中断向量表在0x08000000处(这句在Flash启动时可以不需要,因为能从0x00000000映射到0x08000000)。从该函数返回后,用同样的方式调用C/C++标准实时库的__main函数,进行了一些处理(如用户堆栈初始化等,具体可以跟踪汇编代码,这部分网上已有过分析,不再赘述)后,调用main函数,进入C语言环境。

关于启动文件的中断向量表部分:

 

以上是在建立中断向量表(DCD伪指令表明,为每个中断向量分配了1个字的连续空间)。

实际上,对启动文件分析的资料已经很多,也足够详细,此处就不再赘述了。

基于上面分析,可以总结STM32启动的大体过程。

1、上电复位,CPU从0x00000000处获取栈顶指针MSP(默认使用主堆栈),从0x00000004处获取程序计数器PC(复位向量)。

2、MSP指针必然指向SRAM区的,因为堆栈必须建立在该区。

3、根据PC的值找到复位中断处理函数Reset_Handler

4、调用SystemInit函数。

5、调用__main函数,初始化用户堆栈

6、调用main函数,进入C语言环境


推荐阅读

史海拾趣

FEIG ELECTRONIC公司的发展小趣事

FEIG ELECTRONIC成立于1978年,作为德国射频识别(RFID)系统的先驱,公司从一开始就专注于RFID技术的研发与制造。在创立初期,FEIG凭借其独特的技术视角和对市场需求的敏锐洞察,成功开发了一系列RFID系统,为物流、零售等行业提供了有效的解决方案。通过不断的技术创新和市场拓展,FEIG逐渐在RFID领域崭露头角。

Ethertronics公司的发展小趣事

FEIG ELECTRONIC与意法半导体(STMicroelectronics)的合作是其发展史上的又一重要篇章。两家公司共同研发了一种非接触式个性化设置系统,该系统能够在短时间内完成对托盘上有意法半导体ST25DV NFC动态标签的货品的个性化设置,无需打开产品电源或包装。这一创新技术不仅大大提高了产品生产效率,还为客户提供了更加便捷、高效的服务体验。

H&D Wireless公司的发展小趣事

2017年,高创被美的集团全资收购,成为美的工业技术事业群的重要业务板块之一。这一转变标志着高创进入了一个全新的发展阶段。借助美的集团的平台力量,高创在技术研发、生产制造、供应链管理等方面得到了显著提升。同时,与美的集团旗下其他业务板块如库卡机器人等的协同合作,进一步拓宽了高创的市场应用领域。

Acme Electric Corporation公司的发展小趣事

2017年,高创被美的集团全资收购,成为美的工业技术事业群的重要业务板块之一。这一转变标志着高创进入了一个全新的发展阶段。借助美的集团的平台力量,高创在技术研发、生产制造、供应链管理等方面得到了显著提升。同时,与美的集团旗下其他业务板块如库卡机器人等的协同合作,进一步拓宽了高创的市场应用领域。

Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

随着技术实力的不断提升,银河微电开始积极拓展市场。公司深入分析市场需求,针对不同行业和领域的特点,推出了定制化的产品解决方案。同时,银河微电还加大了营销力度,通过参加行业展会、举办技术研讨会等方式,与潜在客户建立联系,推动产品销售。在市场的不断拓展中,银河微电实现了跨越式发展,市场份额逐年提升。

Good Will Instrument Co., Ltd.公司的发展小趣事

在发展过程中,银河微电积极寻求与行业内外的合作伙伴建立战略合作关系。通过与晶通半导体(深圳)有限公司等企业的合作,银河微电在技术研发、市场拓展等方面取得了显著成效。这些战略合作不仅提升了公司的综合实力,还为公司的未来发展奠定了坚实的基础。

问答坊 | AI 解惑

弱信号测量手册 第5版

弱信号测量手册  第5版  英文版 …

查看全部问答>

Linux服务器集群系统实现解决方案解析

一、集群的基本概念   有一种常见的方法可以大幅提高服务器的安全性,这就是集群。   Cluster集群技术可如下定义:一组相互独立的服务器在网络中表现为单一的系统,并以单一系统的模式加以管理。此单一系统为客户工作站提供高可靠性的服务。 ...…

查看全部问答>

6410 SDBOOT的问题

6410的SDBOOT是个很方便的工具,利用SD卡启动加载SD_EBOOT,然后下载WINCE6.0生成的标准STEPLDR和EBOOT,然后再进入NANDFLASH启动模式下载NK。整个过程都很方便,现在的问题是,SDBOOT没有源码,一些LOGO,公司信息什么的没办法添加。用SMDK6410里 ...…

查看全部问答>

SPI驱动的问题

参考了2410下的驱动,写了个SPI驱动,可是在串口只看到 SPI : DLL_PROCESS_ATTACH SPI: DLL_PROCESS_DETACH 已经确定添加到.reg和.bib文件正确,请问是什么原因啊??? 摘取部分代码: [code] BOOL WINAPI   DllEntry(HANDLE hIn ...…

查看全部问答>

初入行业,向各位请教些问题,请不惜赐教,非常感激

本人刚刚进入单片机嵌入式开发行业,因原来学的是计算机专业,所以对非常多的东西很不了解,在此向各位请教。 这几个星期一直在做51单片机方面的开发工作,可发现自己懂的东西太少了。象电路设计方面,在学校学的那些8255,8155 8251等芯片,现在 ...…

查看全部问答>

STM32相关讨论帖子汇总(工具篇)

EK-STM32FEK-STM32F学习开发套件继续优惠销售及相关资料下载连接万利的演示程序这里是不是用问题?倒塌了~~~EK-STM32F上的LCD是什么型号???万利的EK—STM32F板的USB调试问题带我们 一步一步学习 EK-STM32 吧!更新IV:Firmware&n ...…

查看全部问答>

求助:STM8S103F2的AD采样值偏小

STM8S103F2,用于采样电流。电流采样电阻为50毫欧,通过1K及104简单滤波后输入至芯片的AD口。采样电阻上的电压大约在10~50mV,芯片工作于5.0v,16MHz内部振荡。 调试过程中,发现,芯片采样出来的AD结果比实际值偏小1~2个AD字,请问有什么解 ...…

查看全部问答>

RHC zigbee无线井下定位系统应用方案

RHC   zigbee无线井下定位系统应用方案  随着国家对煤矿等矿业安全日益重视,监管力度不断加强,大中型煤矿和众多乡镇小煤矿均已大量装备了煤矿安全监控系统,有效遏制了重大瓦斯爆炸事故的发生。但是,缺乏对井下人员位置信息 ...…

查看全部问答>

出售一块闲置arm开发板:TQ2440开发板 3.5寸LCD套装

产品概述 该套装包含TQ2440开发板,全新3.5寸数字触摸屏     S3C2440是三星公司推出的一款功能强大,功耗极低的ARM9嵌入式CPU,应用范围非常广泛。TQ2440开发板我司基于三星公司S3C2440的公版电路,优化设计而来。     TQ24 ...…

查看全部问答>

终于收到论坛发的C2000系列仿真器啦

好东西呀! [ 本帖最后由 masonshao 于 2012-1-12 17:21 编辑 ]…

查看全部问答>