
前言FSBL是STM32N6微控制器引导过程中的“第一阶段引导加载程序”的简称,负责上电时系统的初始化、配置硬件,并将应用程序代码从外部Flash/ROM加载到内部或外部存储器中执行。当系统复位时,引导 ROM 遵循特定的步骤序列。 这段话似乎难以理解,我们接下来引用图解。(本文以介绍和猜测为主暂无代码验证) FSBL模式STM32N6的存储分布大体如图所示,其中地址0x18000000起至0x1801FFFF为BOOTRAM对应系统引导程序。 0x70000000之后为外部FLASH,FSBL的二进制文件从这里开始总共511KB。 这里的FSBL的二进制文件包含了代码部分以及签名头,FSBL的二进制文件必须经过签名之后才可以被STM32的BOOTROM引导程序启动。这缺少的1K空间就是给签名用的。 之后我会出文章演示使用STM32CubeProgram进行文件签名。 BOOTLoader会将FSBL代码复制到搬运至内部SRAM2,地址0x34180000中开始,因此这个地址非常的重要,代表着FSBL代码区,之后跳转到FSBL代码区运行。 这种方法的劣势很多,主要是FSBL的空间只有511KB,想要扩大空间就需要参考接下来的模式。 FSBL+Appli在此基础上,我们可以编写主要的程序代码,将其二进制文件烧录至外部FLASH。 该模式下启动步骤总共有四步:首先是BOOTLoader跳转到外部FSBL代码区,将外部存储的FSBL二进制文件拷贝到内部存储的0x34180000处。 FSBL开始执行,然后拷贝Application的完整内容到内部SRAM。然后跳转到APP代码进行执行。 这样子做的好处是可以解决FSBL只能存放最多511KB代码的问题。 因为内部存储的其他存储空间(不包括0x34180000开始的FSBL代码区)可以用来存放Application的代码,空间很大,在这种分配模式下,FSBL和Application的代码量可以达到2MB。 FSBL+XIP第三种FSBL的启动模式,FSBL+XiP(Execute in Place),顾名思义:就地执行。 与前一种方法对比,FSBL+XiP不再将外部Flash的App代码复制到内部Flash中,而是在FSBL执行后将程序指针设置为外部Flash中的APP代码中的第一条开始执行。当然这里是否能在外部Flash中存放多份代码,多份执行这里有待尝试。 由于博主暂时没试过这个功能,这里就不做过多赘述(博主需要仔细研究一下) 总结总而言之,FSBL的作用主要是负责引导程序,用户决定系统如何启动。其通过密码学算法校验应用程序的完整性和合法性,防止恶意代码或篡改后的固件运行。STM32在代码安全性中真的花了很大的功夫,不够博主在代码安全性方面真的概念不多,因此就只点一下。 应用FSBL之后可以应该实现引导程序的多样化并且有很多应用场景,例如无线升级之后,FSBL可以检测代码是否进行了升级决定启动方式,以及可以设置两份代码区,当主要代码损坏之后运行备份代码区等等功能。 当主程序超出内部Flash容量时,FSBL负责将代码从外部存储器加载到RAM中执行。 所以依据这些特性将FSBL理解足够深透的话应该可以实现很多很棒的功能,例如双系统(裸机+RTOS)类似当电脑装了双系统之后上机的引导程序那样子。 或者实现业务代码和启动逻辑的分离,修改FSBL而不影响主代码的内容。 当然更多的内容和使用方法还有待继续探索! |
Keil下的STM32N6之RAM运行工程配置说明
【STM32N6570-DK评测】5.驱动LCD
STM32N6坛友评测出炉,来围观(第二波预约继续)
【STM32N6570-DK评测】 烧写程序到外部存储器
【STM32N6570-DK评测】移植FreeRTOS系统
【STM32N6570-DK评测】 4. 使用TouchGFX 生成CubeMX文件的Bug
【STM32N6570-DK评测】摄像头video encoder
STM32N6570 OTP配置
【STM32N6570-DK评测】3.CubeMX关于DCMIPP和CSI的BUG整理及摄像头使用
【STM32N6570-DK评测】7.探索STM32 ISP IQTune
大佬是否已经拿到板子?开搞了了吗?
蛮早之前就拿到了,不过这块MCU和其他系列的MCU使用起来区别比较大,这两天在部署模型了
我的板子也快到了,希望大佬把教程写详细些,我好抄作业,要是有视频更好了,我去给你点赞😄
是不是只要程序不大于FSBL的空间,就不用APP跳转的事?
是的,主要是现在要塞模型进去,然后FSBL就不够用
如果不涉及加密,也不能jtag调试的话,那是不是放TF卡上,更方便测试?
感觉这玩意不像MCU,更像是一个简化的SOC