STM32程序在Flash上的存储结构
扫描二维码
随时随地手机看文章
每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。
STM32作为一款高端 Cortex-M3系列单片机,有必要了解它的启动文件。打好基础,为以后优化程序,写出高质量的代码最准备。
本文以一个实际测试代码--START_TEST为例进行阐述。
整体过程
STM32整个启动过程是指从上电开始,一直到运行到 main函数之间的这段过程,步骤为(以使用微库为例):
①上电后硬件设置SP、PC
②设置系统时钟
③软件设置SP
④加载.data、.bss,并初始化栈区
⑤跳转到C文件的main函数
代码
启动过程涉及的文件不仅包含 startup_stm32f10x_hd.s,还涉及到了MDK自带的连接库文件 entry.o、entry2.o、entry5.o、entry7.o等(从生成的 map文件可以看出来)。
2 程序在Flash上的存储结构
在真正讲解启动过程之前,先要讲解程序下载到 Flash上的结构和程序运行时(执行到main函数)时的SRAM数据结构。程序在用户Flash上的结构如下图所示。下图是通过阅读hex文件和在MDK下调试综合提炼出来的。
上图中:
MSP初始值由编译器生成,是主堆栈的初始值。
初始化数据段是.data
未初始化数据段是.bss
.data和.bss是在__main里进行初始化的,对于ARM Compiler,__main主要执行以下函数:
其中__scatterload会对.data和.bss进行初始化。
加载数据段和初始化栈的参数
加载数据段和初始化栈的参数分别有4个,这里只讲解加载数据段的参数,至于初始化栈的参数类似。
后来出现了 Flash 这种可电擦写的存储器,并集成在了单片机内部。但出厂的时候单片机的程序存储区仍然是空白的,没有任何代码。用户编译程序后,下载到单片机后才能运行。那么在产品发给用户后,如果发现有Bug怎么办呢?就得用编程器把新代码重新下载一次。这实在是有点儿麻烦,特别是如果客户距离很远的话。于是有聪明的程序猿想了一个办法,写一小段特殊的代码放在程序里,这段代码可以通过一定方式,比如用按键触发进入运行,它可以通过串口(早期的 PC 串口是标配)接收新的代码并写入Flash,从而在没有硬件编程器的情况下也能完成代码的更新。
标准化的零部件模式、HI(Huawei Inside) 模式以及鸿蒙智行模式。(1)零部件模式:车 BU 类似传统汽车供应链中的 Tier1, 提供标准化零部件模块给车厂,包括激光雷达、毫米波雷达、摄像头、电机电控、 车联网模块等 30 多种标准化部件。(2)HI 模式:提供包括软硬件的全栈解决方案, 帮助车企充分享受到华为先进的智能化技术,相较于零部件模式,HI 模式与车企的 合作程度更加深入,特别是 HI 模式下可以在智能电动、智能座舱与智能驾驶等领域 实现持续迭代升级。(3)鸿蒙智行模式:鸿蒙智行则是在 HI 模式的基础上更进一步, 华为全方位介入合作车型的生命周期,发挥华为消费者端累积的经验,提供技术和 服务支持,帮助其提升产品竞争力。
从业务归属和范围上看,零部件模式和 HI 模式主要由车 BU 为车企提供零部件 与解决方案,华为不参与整车设计;而鸿蒙智行模式主要归华为终端 BG 进行管理。 具体来说,终端 BG 相关部门负责产品规划、整车开发、工程实现、品控管理、供 应链管理、生产制造、渠道销售、品牌营销到交付售后等各个环节,车 BU 的解决 方案部负责进驻车企。
五大解决方案协同,为车企提供多样化配置。华为掌握芯、硬、软、云等智能 化核心技术,在此基础上,车 BU 先后推出 MDC 智能驾驶平台、激光雷达、4D 成 像雷达、AR-HUD、鸿蒙车机 OS、HUAWEI HiCar 人-车-家全场景智慧互联、车载 智慧屏、车载充电、DriveONE 电驱动、C-V2X、自动驾驶云服务等一系列创新解决 方案,共形成乾崑 ADS、乾崑车控、乾崑车云、乾崑车载光、鸿蒙座舱等五大解决 方案,涵盖了智能网联电动汽车的各个方面。华为在汽车智能化领域技术实力雄厚, 推动汽车产业转型升级。
1.3、 车企入股引望加深合作,华为有望与更多车企实现“双向奔赴”
阿维塔/赛力斯入股引望,开启华为打造汽车产业智能化开放平台的关键一步。 8 月 20 日,长安汽车发布公告,联营企业阿维塔拟与华为签署《股权转让协议》,以 115 亿元的价格购买华为持有的旗下智能汽车解决方案新公司引望 10%的股权,并且 阿维塔有权提名引望董事会 7 名成员中的 1 名董事。徐直军表示,阿维塔是华为帮 助车企“造好”车、造“好车”的开创性实践。8 月 26 日,赛力斯发布公告,子公司赛 力斯拟以 115 亿元的价格购买华为持有的旗下智能汽车解决方案新公司引望 10%的 股权,成为第二家入股华为引望的车企,并且赛力斯汽车在交割后有权向引望董事 会提名一位董事和一位审计委员会委员。华为有意将引望打造成汽车产业智能化开 放平台,成为汽车智能化部件和解决方案的领导者。阿维塔和赛力斯相继成为引望 的战略投资者后,引望还将继续对战略合作伙伴开放股权,华为将继续全方位支持 引望打造领先的产品和技术,携手共同推动汽车产业崛起和智能化全面发展。
人员、技术和资产所有权即将装载,引望独立运作在即。徐直军称,2024 年底 希望把所有资产、人员装载到引望,实现引望独立运作。根据赛力斯公告,华为技 术和目标公司将在受让方支付第一笔交易价款前签署装载协议。知识产权方面,采 用转让与许可相结合的模式进行装载,截至 2024 年 7 月 31 日,华为拟转让专利及 专利申请共计 6838 项,拟许可专利包括装载业务需要使用的其他专利;拟转让及拟 许可技术包含装载业务相关软件、代码、文档和数据等技术资产;拟转让商标及商 标申请共计 1603 项,拟许可商标及商标申请共计 1600 项。人员方面,华为技术及 其关联方从事装载业务并且用工关系将转移至目标公司的员工将不少于 5500 人。华 为在之前的发展中已与长安汽车、赛力斯、奇瑞、北汽、江淮、东风、一汽等车企 展开深度合作,合作朋友圈持续扩大,而引望已经引入了第一批包括阿维塔和赛力 斯在内的两家车企的投资,第二批车企投资尚在接触中。
程序猿们也是现代历史前进的重要推动力啊!
后来,有芯片厂商把这种代码在出厂时就固化在芯片里,极大的方便了代码下载和程序更新。STM32F030内部就固化了Bootloader。当我们把一个引脚 BOOT0 拉高的同时,重新给芯片上电或复位,就会触发Boootloader进入运行。此时我们通过单片机的串口就可以把新程序发送给单片机,发送完后把 BOOT0 拉低,再复位单片机,新程序就会运行起来。
Startup Code 可以译为启动代码。单片机上电或复位后最先执行的一段代码。一般主要会完成堆栈指针的设置,复位向量的获取和加载,然后初始化变量,最后跳转到用户代码。在详细看启动代码之前,我们先看一下 STM32F030 的内存映射。
STM32的启动过程主要包括以下几个关键步骤:
初始化堆栈指针和程序计数器:当STM32芯片上电或复位时,处理器会从特定的内存地址(通常是0x00000000)获取堆栈指针(MSP)的初始值,并将其加载到堆栈指针寄存器(SP)中。同时,处理器从0x00000004地址获取程序计数器(PC)的初始值,指向复位处理程序(Reset_Handler)的入口地址12。
复位处理程序:复位处理程序(Reset_Handler)是启动代码中的关键部分,负责初始化系统时钟、配置外设、设置中断相关参数等操作。完成这些初始化后,复位处理程序会跳转到用户定义的启动代码或主函数(main)13。
启动模式:STM32支持三种启动模式:
主闪存存储器启动:这是最常见的启动模式。处理器从内置的Flash启动,通常用于通过JTAG或SWD模式下载程序。
系统存储器启动:用于通过外部接口(如UART、CAN或USB)下载和更新程序。系统存储器中包含一个出厂预置的ISP(In-System Programming)代码,用于桥接外部代码到内置Flash。
内置SRAM启动:用于调试和修复固件,但SRAM中的代码在掉电后会丢失14。
内存映射:不同的启动模式会将不同的内存区域映射到0x00000000地址。例如,在主Flash启动模式下,内置Flash的起始地址(0x08000000)会被重映射到0x00000000地址12。
通过这些步骤,STM32芯片能够从特定的存储介质中加载和执行程序,完成初始化操作后进入用户代码的执行环境。
收起分享