STM32MP1xx的启动流程
https://wiki.st.com/stm32mpu/wiki/Boot_chain_overview
根据提供的知识库内容,以下是STM32 MPU启动链的详细解析:
1. 通用启动流程
STM32 MPU启动分为多阶段,逐步初始化外设和内存,并建立信任链:
1.1 ROM代码(BootROM)
作用:首个执行的代码,选择启动设备(串口/闪存),加载FSBL到内部RAM。
安全:验证FSBL的完整性,建立信任链的起点。
存储:固化在芯片ROM中,体积小(几十KB)。
1.2 第一级引导程序(FSBL)
功能:初始化时钟树、DDR控制器,加载SSBL到外部RAM。
实现:STM32MP13/15使用TF-A BL2(Trusted Firmware-A)作为FSBL。
安全:可选认证,支持解密和验证后续组件。
1.3 第二级引导程序(SSBL)
功能:复杂外设驱动(USB/以太网/显示),加载内核到内存。
常用工具:U-Boot(支持灵活启动方式,如网络/USB)。
安全:可选认证下一阶段组件(如内核)。
1.4 内核空间
功能:初始化外设驱动,启动用户空间。
安全:内核运行在非安全上下文(Nonsecure)。
1.5 用户空间
启动:内核启动init进程,执行根文件系统(rootfs)中的初始化脚本。
应用:最终暴露用户界面(如GUI)。
2. 安全与协处理器管理
2.1 安全监控器(Secure Monitor)
作用:管理安全与非安全上下文切换,支持用户认证、密钥存储。
实现:基于Arm TrustZone技术,运行在Cortex-A安全模式(EL3)。
2.2 协处理器(Cortex-M)
启动时机:
早期启动:由SSBL(如U-Boot的rproc命令)加载。
运行时启动:由Linux remoteproc框架管理。
安全认证:
STM32MP2系列:通过OP-TEE可信应用(TA)验证协处理器固件,确保完整性。
STM32MP15:可选通过TF-A或U-Boot认证。
3. 各系列差异
3.1 STM32MP13/15系列
FSBL:TF-A BL2。
SSBL:U-Boot。
协处理器:Cortex-M4(MP15)支持实时/低功耗任务。
安全启动:可选认证,支持信任链扩展。
3.2 STM32MP2系列
主核:Cortex-A35,启动时协处理器(Cortex-M33)保持复位。
安全架构:
OP-TEE:管理安全服务,隔离内存区域。
协处理器固件:可包含安全(TF-M)和非安全(STM32Cube)部分。
认证流程:通过OP-TEE TA验证Cortex-M33固件,确保运行时完整性。
4. 工具与配置
STM32CubeMX:配置启动组件(如时钟树、外设初始化)。
TF-A/U-Boot:开源引导程序,支持定制启动流程。
OP-TEE:提供安全执行环境(TEE),支持可信应用开发。
5. 典型问题解答
Q1: 如何选择启动设备?
A1: BootROM根据引脚状态(如BOOT0/1)或OTP配置选择启动源(eMMC、SD卡、UART等)。
Q2: 安全启动如何实现?
A2: BootROM验证FSBL签名,FSBL验证SSBL,逐级建立信任链。STM32MP2还可通过OP-TEE TA认证协处理器固件。
Q3: 协处理器何时启动?
A3: 可在SSBL阶段(快速启动)或Linux运行时(动态加载),通过remoteproc管理。
Q4: 如何优化启动时间?
A4: 减少SSBL功能(如禁用网络/USB)、提前启动协处理器、使用压缩内核镜像。
如需进一步探讨具体配置或安全实现细节,可提供更具体的问题方向。
https://wiki.st.com/stm32mpu/wiki/TF-A_overview
根据您提供的知识库内容,以下是关键信息整理及常见问题解答方向:
一、TF-A 引导流程要点
STM32MPU专用调整:
移除了BL1阶段(因STM32自带ROM Bootloader)
直接从BL2启动,负责加载安全/非安全镜像
AArch32架构下:BL2 → BL32(OP-TEE)→ BL33(U-Boot)
AArch64架构下:BL2 → BL31(EL3运行时)→ BL32/BL33
安全服务:
Armv7使用OP-TEE作为BL32,替代旧版SP_MIN
提供安全监控调用(SMC)和PSCI电源管理接口
设备树配置:
BL2/BL31阶段使用精简设备树
可通过STM32CubeMX工具配置
二、开发任务指南方向
1. 存储设备扩展
Yocto添加NAND闪存:
# 示例:修改Yocto层配置文件
MACHINE_FEATURES += "nand"
IMAGE_INSTALL_append = " mtd-utils"
需调整内核设备树,添加NAND控制器及分区表。
2. 显示驱动开发
低分辨率慢速接口驱动:
使用Linux DRM框架
实现struct drm_panel_funcs中的enable/disable时序控制
注意配置pixel-clock和display-timings节点
3. 性能优化
TensorFlow Lite硬件加速:
// 启用STM32 NPU Delegation
std::unique_ptr<tflite::TfLiteDelegate, decltype(&free)>
delegate(TfLiteNpuDelegateCreate(&options), free);
interpreter->ModifyGraphWithDelegate(delegate.get());
需在编译时启用--define tflite_with_stm32_npu=true
4. 系统配置
256MB DDR映射配置:
// 修改TF-A设备树内存节点
memory@c0000000 {
device_type = "memory";
reg = <0xc0000000 0x10000000>; // 起始地址0xC000_0000,大小256MB
};
三、调试技巧
STM32CubeIDE调试Cortex-M33:
创建STM32MP25xx_CM33目标配置
在Debug Configurations中启用Secure Debug模式
使用Semihosting输出调试日志
四、数据一致性管理
Cache与MMU协同:
// 使用MPU API维护缓存一致性
SCB_EnableICache();
SCB_EnableDCache();
HAL_MMU_ConfigRegion(DEVICE_nGnRnE); // 配置外设内存属性
如需具体某个问题的分步指南,请告知具体应用场景(如正在调试哪类外设或遇到何种报错),我将结合知识库给出详细方案。
基于两个STM32MPU知识库链接(Boot Chain Overview 和 TF-A Overview),以下是关键知识整合及常见问题解答方向:
1. STM32MPU启动流程核心阶段
阶段 组件 功能 安全角色
BootROM ROM代码 初始化基础硬件,选择启动设备(eMMC/SD/UART),加载FSBL到SRAM。 验证FSBL签名,信任链起点。
FSBL TF-A BL2 初始化DDR、时钟树,加载SSBL(U-Boot)到DDR。 可选验证SSBL,支持加密镜像。
SSBL U-Boot 初始化复杂外设(USB/以太网),加载内核和设备树。 可选验证内核/设备树,传递安全状态。
OS Kernel Linux/RTOS 启动用户空间,管理硬件资源。 非安全上下文运行。
协处理器 Cortex-M4/M33 实时任务处理(如电机控制),通过remoteproc或U-Boot bootaux启动。 STM32MP2需通过OP-TEE验证固件。
2. TF-A在STM32MPU中的关键作用
(1) 架构差异
STM32MP15(AArch32):
BL2 → BL32(OP-TEE) → BL33(U-Boot)
OP-TEE提供安全服务(如密钥存储)。
STM32MP2(AArch64):
BL2 → BL31(EL3运行时) → BL32/BL33
BL31管理安全监控(Secure Monitor)。
(2) 安全启动流程
BootROM 验证FSBL(BL2)的RSA签名。
BL2 验证BL32/BL33的哈希或签名。
BL32(OP-TEE) 验证协处理器固件(如STM32MP2的Cortex-M33固件)。
(3) 关键配置
# 启用加密镜像支持
STM32MP_USE_ENCRYPTED_BOOT = 1
# 选择BL32实现(OP-TEE或SP_MIN)
BL32 = optee
3. 常见问题解答
(1) 如何配置STM32MP15从UART启动?
硬件配置:设置BOOT引脚(BOOT0=1, BOOT1=0)。
TF-A修改:
// 修改plat/st/stm32mp1/stm32mp1_def.h
#define STM32MP_BOOT_DEVICE_UART 1
**使用STM32CubeProgrammer通过UART加载FSBL。
(2) 如何在U-Boot中启动协处理器?
加载固件到内存:
=> load mmc 0:1 0x48000000 m4_fw.elf
启动协处理器:
=> bootaux 0x48000000
验证状态:
=> rproc list
(3) 如何启用安全启动?
生成密钥:
openssl genrsa -out private.pem 2048
签名镜像:
tools/cert_create/cert_create -n --key private.pek --tb-fw BL2.bin
烧写密钥哈希到OTP:
stm32key -k public_key.bin -a write
4. 调试技巧
(1) TF-A日志调试
启用串口输出:
# 修改TF-A编译选项
DEBUG = 1
LOG_LEVEL = 40 # 最高详细级别
查看BL2日志:UART输出BL2初始化过程。
(2) 协处理器故障排查
检查内存映射:确保协处理器固件加载地址不冲突(如SRAM区域)。
验证固件格式:使用readelf -h m4_fw.elf检查ELF头是否有效。
5. 性能优化
(1) 缩短启动时间
禁用非必要功能:
# U-Boot配置中禁用网络/USB
# CONFIG_CMD_NET=n
# CONFIG_USB=n
启用压缩内核:
make zImage # 生成压缩内核镜像
总结
以上内容整合了STM32MPU启动链和TF-A的核心知识点,涵盖安全配置、协处理器管理及调试技巧。如需针对具体开发场景(如自定义BL2、优化启动流程)的逐步指南,请提供更详细的需求。
相关文章:
STM32MP1xx的启动流程
https://wiki.st.com/stm32mpu/wiki/Boot_chain_overview 根据提供的知识库内容,以下是STM32 MPU启动链的详细解析: 1. 通用启动流程 STM32 MPU启动分为多阶段,逐步初始化外设和内存,并建立信任链: 1.1 ROM代码&…...
wgcloud-server端部署说明
Wgcloud 是一款开源的轻量级服务器监控系统,支持多平台,可对服务器的 CPU、内存、磁盘、网络等指标进行实时监控。 以下是 Wgcloud Server端的详细部署步骤: 环境准备 服务器: 至少准备两台服务器,一台作为监控端&a…...
大模型Agent:人工智能的崭新形态与未来愿景
在人工智能技术高歌猛进的当下,大模型 Agent 作为 AI 领域的关键研究方向,正日益彰显出其独有的魅力以及广阔无垠的应用前景。大模型 Agent 不但具备对环境的感知、自主的理解、决策的制定以及行动的执行能力,而且能够游刃有余地应对繁杂任务…...
专题二最大连续1的个数|||
1.题目 题目分析: 给一个数字k,可以把数组里的0改成1,但是只能改k次,然后该变得到的数组能找到最长的子串且都是1。 2.算法原理 这里不用真的把0变成1,因为改了比较麻烦,下次用就要改回成1,这…...
【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824
背景 最近在某客户的ORACLE开发环境(oracle 19.10)中,发现一个非常奇怪情况, 开发人员反馈,有一条SQL,查询了两个sum函数作为两个字段, select sum(c1),sum(c2) from ...当两个sum一起出现时,第一个sum的结果不对&am…...
2025国家护网HVV高频面试题总结来了03(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 0x1 高频面试题第一套 0x2 高频面试题第二套 0x3 高频面试题第三套 0x4高频面试题第四套 0x1 高频面试题…...
CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南20250302
CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南 引言 在 Linux 服务器操作系统领域,CentOS 和 Ubuntu 是广泛采用的发行版。它们在命令集、默认工具链及生态系统方面各有特点。本文深入剖析 CentOS 与 Ubuntu 在常用命令层面的异同,并结合实践案例…...
SQL命令详解之常用函数
目录 1 简介 2 字符串函数 2.1 字符串函数语法 2.2 字符串函数练习 3 数学函数 3.1 数学函数语法 3.2 数学函数练习 4 日期时间函数 4.1 日期时间函数语法 4.2 日期时间函数练习 5 条件函数 5.1 条件函数语法 5.2 条件函数练习 6 总结 1 简介 在SQL中我们经常会用…...
IndexError: index 0 is out of bounds for axis 1 with size 0
IndexError: index 0 is out of bounds for axis 1 with size 0 欢迎来到英杰社区,这里是博主英杰https://bbs.csdn.net/topics/617804998 报错原因 数组或数据结构为空 如果数组或 DataFrame 在指定的维度上没有任何元素(例如,没有列&#x…...
C++学习之C++初识、C++对C语言增强、对C语言扩展
一.C初识 1.C简介 2.第一个C程序 //#include <iostream> //iostream 相当于 C语言下的 stdio.h i - input 输入 o -output 输出 //using namespace std; //using 使用 namespace 命名空间 std 标准 ,理解为打开一个房间,房间里有我们所需…...
k8s面试题总结(八)
1.K8s部署服务的时候,pod一直处于pending状态,无法部署,说明可能的原因 Node节点的资源不足,yaml文件资源限制中分配的内存,cpu资源太大,node宿主机资源没那么大,导致无法部署。部署pod的yaml文…...
《今日-AI-编程-人工智能日报》
一、AI行业动态 荣耀发布“荣耀阿尔法战略” 荣耀在“2025世界移动通信大会”上宣布,将从智能手机制造商转型为全球领先的AI终端生态公司,并计划未来五年投入100亿美元建设AI设备生态。荣耀展示了基于GUI的个人移动AI智能体,并推出多款AI终端…...
Koupleless 2024 年度报告 2025 规划展望
Koupleless 2024 年度报告 & 2025 规划展望 赵真灵 (花名:有济) Koupleless 负责人 蚂蚁集团技术专家 Koupleless 社区的开发和维护者,曾负责基于 K8s 的应用研发运维平台、Node/Pod 多级弹性伸缩与产品建设,当前主…...
C与C++中inline关键字的深入解析与使用指南
文章目录 引言一、历史背景与设计哲学1.1 C中的inline1.2 C中的inline 二、核心机制对比2.1 编译行为2.2 链接模型2.3 存储类说明符(详细解析)C的灵活组合C的限制原理 补充说明: 三、典型应用场景3.1 C中的使用场景3.2 C中的使用场景 四、现代…...
记录linux安装mysql后链接不上的解决方法
首先确保是否安装成功 systemctl status mysql 如果没有安装的话,执行命令安装 sudo apt install mysql-server 安装完成后,执行第一步检测是否成功。 通常初始是没有密码的,直接登陆 sudo mysql -u root 登录后执行以下命令修改密码&…...
Java 大视界 -- Java 大数据在智能金融反欺诈中的技术实现与案例分析(114)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
01_NLP基础之文本处理的基本方法
自然语言处理入门 自然语言处理(Natural Language Processing, 简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域,主要目标是让机器能够理解和生成自然语言,这样人们可以通过语言与计算机进行更自然的互动。 …...
(十 六)趣学设计模式 之 责任链模式!
目录 一、 啥是责任链模式?二、 为什么要用责任链模式?三、 责任链模式的实现方式四、 责任链模式的优缺点五、 责任链模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
动态规划/贪心算法
一、动态规划 动态规划 是一种用于解决优化问题的算法设计技术,尤其适用于具有重叠子问题和最优子结构性质的问题。它通过将复杂问题分解为更简单的子问题,并保存这些子问题的解以避免重复计算,从而提高效率。 动态规划的核心思想 最优子结…...
PH热榜 | 2025-03-04
1. MGX 标语:第一支人工智能开发团队 介绍:MGX(MetaGPT X)是一个基于真实软件标准操作程序(SOP)的多代理人工智能平台。在这里,你可以随时与AI团队的领导、产品经理、架构师、工程师和数据分析…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
