STM32启动流程

STM32单片机一种是直接将程序下载到内部的Flash中,上电后直接运行内部的Flash的程序;

STM32MP1单片机另外一种是将系统存在外部的Flash中,比如EMMC,NAND,上电需要从外部Flash加载程序到内存中执行,支持多种方式启动。

1 STM32MP1启动模式

STM32MP1包括A7和M4两个内核。支持多种设备启动,比如EMMC,SD,NAND,NOR,USB,UART等,内部会有一段ROM存放ST自己的code,不对外开放。ROM代码上电自动执行,从电路中获取启动模式的信息,从对应的启动模式中获取相关程序。

2 ROM功能

1)安全启动,不管是串行启动还是从Flash设备启动。

2)工程启动,直接通过调试工具访问内核,调试内核代码。

3)第二个内核启动,复位之后,A7内核都会启动,并且运行相同的指令,内部的ROM代码会分离执行流,只有Core0才能执行ROM代码,Core1内核处于死循环状态,等待应用程序发生信号进行下一步操作。这个信号是SGI(软中断),和两个寄存器(MAGIC_NUMBER、BRANCH_ADDRESS)。

启动Core1 的条件:将跳转地址写入BRANCH_ADDRESS;将0xCA7FACE1的值写入MAGIC_NUMBER,向Core1发生软中断。

4)RMA Boot。

5)低功耗唤醒。

6)提供安全相关服务。

上电或者复位启动流程:

1)检查当前的CPU是不是CPU0,如果不是就启动CPU1,正常上电启动CPU0运行。

2)如果是CPU0在运行,检查复位原因。

3)检查是否是推出Standby导致的复位,如果不是进入RMA检查。

4)检查是否是RMA启动,是否是ENG1启动。

5)如果不是ENG1启动,直接进入冷启动。

6)进入冷启动后,从Flash加载系统,并进行鉴权,鉴权成功后,运行系统。

3 安全启动

         FSBL:第一阶段启动文件。

         SSBL:第二阶段启动文件。

     1)ROM代码从选择的Flash设备中加载FSBL镜像文件,FSBL镜像是ROM加载的第一个用户编写的可执行的代码,一般是TF-A镜像,FSBL的镜像是需要在bin文件添加头部信息,使ROM知道如何处理这个镜像文件根据头部信息。

    2)FSBL镜像加载需要对其进行鉴权。

    3)鉴权成功后,需跳转到FSBL镜像入口地址,开始运行FSBL固件。

          由于辞职DDR并没有初始化完成,镜像的文件在RAM中运行,内部有256KB的SYSRAM。

          FSBL镜像成功后,ROM代码会boot的上下文的起始地址保存到R0寄存器,然后跳转到FSBL镜像的入口地址,boot的上下文会保存到SYSRAM前512个字节里。

4 FLash 设备启动

   最终文件系统镜像组成:linux(uboot,kernel,rootfs)和STM32MP1(TF-A,TEE,vendorfs)。

1)fsbl:256Kb~512Kb,第一阶段启动代码,存放TF-A或者Uboot的SPL部分,也可以写A7裸机代码。

2)ssbl:2Mb,第二阶段启动代码,一般是uboot,uboot使用设备树,设备树添加在后面。

3)bootfs:64Mb,init ram文件系统,可以将文件系统拷贝到RAM中,在linux内核挂在正式文件系统之前使用init ram文件系统;linux内核设备树,linux内核,uboot显示启动界面,uboot发行配置文件。

4)vendorfs:16Mb,存放第三方的版权信息。

5)rootfs:768Mb,linux根文件系统。

7)userfs:用户使用剩余空间。

5 STM32MP1linux 系统启动过程

   1)ROM Code:

           初始化基本时钟;从选定的启动设备中加载FSBL代码;启动FSBL代码。

         ROM Code --FSBL--SSBL--Linux kernel -- rootfs,每个节点对下个节点进行鉴权,直到设备正确启动,其中FSBL在RAM中执行的。

   2)FSBL:

           完成整个时钟树初始化,初始化DDR,从选定的驱动设备中加载SSBL代码,启动SSDL代码。FSBL代码是TF-A或者Uboot的SPL代码。

   3)SSBL:

         从外部设备或者网络中加载linux系统,通过启动画面向用户反馈启动过程,启动linux内核。

  SSBL代码在DDR中运行,空间足够大,可以使能USB,网络,显示等功能,SSBL一般是Uboot。

   4)Linux内核:

          linux内核初始化,挂在文件系统,启动用户空间的init程序。内核的启动过程会初始化板子上各种外设。

   5)Linux用户空间:

             用户空间,存放根文件系统。系统启动的时候通过init进程切换到用户空间,整个过程初始化根文件系统各种框架和服务。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值