ubuntu 相关
解决VMware Tools安装后不工作不生效问题和共享目录挂载后失效问题_安装完vmware tools没变化-CSDN博客
Ubuntu 18.04(代号 bionic)更换国内 APT 源完整步骤
Ubuntu 18.04 系统版本代号为 bionic,直接复制下面命令逐条执行即可。
第一步:先备份原始源文件(出错可一键恢复)
bash
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
第二步:写入阿里云源(商用网络首选,速度最稳)
直接整条复制粘贴到终端回车执行:
bash
sudo tee /etc/apt/sources.list <<EOF
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
EOF
备选:清华源(教育网 / 校园网更快)
bash
sudo tee /etc/apt/sources.list <<EOF
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
EOF
第三步:刷新软件源缓存
bash
sudo apt update
如果需要升级已安装全部软件包:
bash
sudo apt upgrade -y
顺带安装 VMware Tools(解决之前快捷键、拖拽问题)
bash
sudo apt install open-vm-tools open-vm-tools-desktop -y
# 启动并设置开机自启
sudo systemctl enable --now vmtoolsd
执行完成重启 Ubuntu 虚拟机,即可实现:
- 鼠标自由进出虚拟机窗口
- 宿主机与虚拟机双向复制粘贴
- 窗口自动适配分辨率
- 共享文件夹自动挂载到
/mnt/hgfs
故障还原(源配置出错时执行)
bash
sudo cp /etc/apt/sources.list.bak /etc/apt/sources.list
sudo apt update
安装 ssh
sudo apt install openssh-server -y
打开 Ubuntu 终端逐条执行:
1. 安装 openssh-server 服务
bash
sudo apt install openssh-server -y
2. 启动 SSH 并设置开机自启
bash
sudo systemctl start ssh
sudo systemctl enable ssh
3. 放行防火墙(如果开了 ufw)
bash
sudo ufw allow 22/tcp
4. 验证 SSH 是否正常运行
bash
sudo systemctl status ssh
看到 active (running) 即为服务就绪。
三、第二步:FileZilla 客户端修改配置(重点)
快速连接简易设置(推荐)
- 清空端口框里的
23,改成22 - 主机地址直接只填 IP:
192.168.237.129(删掉前面//) - 用户名:
user(你的 Ubuntu 登录账号),密码填登录密码 - 点击快速连接
更稳定的站点管理器配置(一劳永逸)
- 点击左上角「文件」→「站点管理器」→「新站点」
- 协议:选择 SFTP - SSH 文件传输协议
- 主机:
192.168.237.129 - 端口:
22 - 登录类型:正常
- 用户:
user,密码填系统密码 - 点击连接即可
四、排查如果还是连不上的附加检查
1. 虚拟机网卡模式必须是「桥接模式」
VMware 虚拟机设置 → 网络适配器 → 网络连接:桥接模式(复制物理网络连接状态) 重启虚拟机后用 ip addr 确认 IP 还是 192.168.237.129
2. 宿主机 ping 测试连通性
在 Windows CMD 执行:
cmd
ping 192.168.237.129
能 ping 通代表网络没问题,不通就是虚拟机网卡模式错误。
3. 确认 Ubuntu 22 端口监听
虚拟机内执行:
bash
sudo netstat -tlnp | grep ssh
看到 :22 端口监听就完全正常。
FileZilla 完整配置 SFTP 连接 Ubuntu(一步一步照着点)
方式一:站点管理器(最规范,推荐长期使用)
-
打开 FileZilla 顶部菜单栏 文件 → 站点管理器 (快捷键
Ctrl+S) -
点击左上角 新站点 ,随便起个名字,比如
Ubuntu18.04 -
在右侧填写参数(重点)
- 协议 :下拉选择
SFTP - SSH 文件传输协议 - 主机 :填写虚拟机 IP
192.168.237.129 - 端口 :固定填
22(SSH 默认端口,留空也自动用 22) - 登录类型 :选择
正常 - 用户 :
user(你的 Ubuntu 登录用户名) - 密码:Ubuntu 登录密码
- 点击底部 连接 即可。
Ubuntu 18.04 修改 root 密码两种方法
方法 1:当前普通用户有 sudo 权限(你现在的环境直接用)
打开 Ubuntu 终端执行:
bash
sudo passwd root
- 先输入你当前
user用户的密码(回车) - 输入新的 root 密码(看不见光标,正常输入)
- 再次确认 root 密码 提示
passwd: password updated successfully就修改完成。
测试登录 root
bash
su root
输入刚设置的密码即可切换到 root 管理员。
Make file
gcc -c input.c
gcc -c calcu.c
gcc -o main main.o input.o calcu.o
root@user-virtual-machine:/home/test/demo# ls
a.out calcu.h hello input.c input.o main.c Makefile
calcu.c calcu.o hello.c input.h main main.o
root@user-virtual-machine:/home/test/demo# ls
a.out calcu.h hello input.c input.o main.c Makefile
calcu.c calcu.o hello.c input.h main main.o
root@user-virtual-machine:/home/test/demo# cat Makefile
main: main.o input.o calcu.o
gcc -o main main.o input.o calcu.o
main.o: main.c
gcc -c main.c
input.o: input.c
gcc -c input.c
calcu.o: calcu.c
gcc -c calcu.c
clean:
rm -f *.o
rm -f main
root@user-virtual-machine:/home/test/demo#
NFS


实际是没有 linux 文件夾
一、先创建要求的目录结构
直接复制下面命令逐条执行:
bash
# 在当前用户家目录 ~ 下创建 linux 文件夹
mkdir ~/linux
# 在linux里面再创建nfs共享目录
mkdir ~/linux/nfs
验证是否创建成功:
bash
ls ~
ls ~/linux
二、配置 NFS 共享文件 /etc/exports
- 编辑配置文件
bash
sudo vi /etc/exports
- 在文件末尾添加一行(允许任意网段挂载,嵌入式开发最常用)
plaintext
/home/user/linux/nfs *(rw,sync,no_root_squash,no_subtree_check)
参数说明:
/home/user/linux/nfs:要共享的完整路径*:所有 IP 都可以访问rw:读写权限sync:同步写入磁盘no_root_squash:客户端 root 映射为服务端 root(驱动开发必备)
- 保存退出(vi 编辑器:按
ESC→ 输入:wq回车)
三、生效配置 + 重启 NFS 服务
bash
# 重新加载exports配置
sudo exportfs -rv
# 重启nfs服务
sudo systemctl restart nfs-kernel-server
# 设置开机自启
sudo systemctl enable nfs-kernel-server


四、防火墙放行 NFS 端口(可选,避免开发板挂载失败)
bash
sudo ufw allow nfs
sudo ufw allow rpcbind
五、测试本机是否能挂载(验证 NFS 是否正常)
bash
sudo mount -t nfs 127.0.0.1:/home/user/linux/nfs /mnt
无报错就是配置完成,后续嵌入式开发板直接用 Ubuntu IP 挂载这个路径即可。
补充小提示
- 你系统已经提示
nfs-kernel-server和rpcbind已是最新版,不用重复安装; - 如果后面挂载提示权限不足,给共享目录加最高权限:
bash
sudo chmod 777 ~/linux/nfs
VSCode 配置


问题原因
- 你打开的是搜索框(Find),不是命令面板;
- 输入关键词不全,完整命令是带括号的
C/C++: Edit Configurations (UI),简写搜索搜不到。
方法一:正确调出命令面板(推荐)
- 按下快捷键
Ctrl + Shift + P(这是「命令面板」,不是顶部搜索框) - 在弹出的顶部输入框里直接粘贴:
plaintext
C/C++: Edit Configurations (UI)
- 点击选中这一项,自动打开配置页面。
方法二:直接手动创建配置文件(绕开搜索)
- 在左侧资源管理器,点开你的
test1文件夹 - 新建文件夹:
.vscode(前面带小数点) - 在
.vscode里面新建文件c_cpp_properties.json - 把下面完整内容复制粘贴进去保存:
json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
方法三:从 C/C++ 插件入口进入
- 左侧点「扩展」图标(四个方块)
- 找到已安装的 C/C++ by Microsoft
- 点右下角齿轮 → Extension Settings
- 搜索框输入
Include Path,在C_Cpp: Include Path项添加两行:
plaintext
${workspaceFolder}/**
/usr/include


Ubuntu 下 ST 官方软件安装


STM32CubeProgrammer Linux 安装后无桌面图标完整解决
一、先执行原始安装命令(如果还没装好)
- 进入解压后的文件夹目录
bash
cd 你的解压文件夹路径
- 添加执行权限(Linux 必须做这一步,很多人漏了)
bash
chmod +x SetupSTM32CubeProgrammer-2.5.0.linux
- 运行安装程序
bash
./SetupSTM32CubeProgrammer-2.5.0.linux
一路默认下一步完成安装。

USB DFU 以及 STLink 驱动安装

实际

核心原因一句话总结
DFU in HS Mode 是 ST-Link 进入固件升级模式才会出现的设备,正常调试烧录工作模式下只会显示 STM32 STLink,你现在设备完全正常,不用管 DFU 消失。
1. 两种模式区别
① 正常工作模式(你当前状态)
USB 插入直接上电,ST-Link 进入调试 / 下载标准模式
- 设备管理器只出现:
STM32 STLink - 功能:给 STM32 芯片下载程序、在线 Debug 调试、读取芯片 Flash
- 指示灯:绿灯闪烁 / 常亮(不同版本 ST-Link 略有差异)
② DFU 高速固件升级模式(才会多出 DFU 设备)
需要手动触发硬件进入 DFU 升级模式:
- 按住 ST-Link 外壳上的 BOOT 按键 不放
- 再插入 USB 给下载器上电
- 松开 BOOT 键 此时设备管理器就会同时出现:
DFU in HS Mode+STM32 STLink这个 DFU 设备唯一作用:升级 ST-Link 本身内部固件版本,日常开发完全用不到。
2. 补充判断你的硬件状态
从截图看: 通用串行总线设备下已正确识别 STM32 STLink,说明: ✅ Windows 驱动安装完整 ✅ USB 通信链路通畅 ✅ ST-Link 硬件没有损坏 直接打开 STM32CubeProgrammer,选择 ST-Link 接口就能连接目标单片机烧录代码。
3. 什么时候需要调出 DFU?
只有遇到下面情况才需要进 DFU 刷固件:
- CubeProgrammer 提示 ST-Link 固件版本过低、不兼容新芯片
- 下载器频繁掉线、识别不稳定、报错通信失败
- 购买的山寨 ST-Link 固件有 bug 需要重刷官方固件
进入 DFU 升级简易步骤
- 长按 ST-Link 上的 BOOT 小按钮
- 插 USB 通电,松开按钮
- 打开 STM32CubeProgrammer,软件内执行 Firmware Upgrade 升级即可 升级完成拔插 USB,自动退回普通工作模式,DFU 设备再次消失。

要接上 OTG线!!!!!



Error: SWV is supported by ST-LINK\V2 with firmware version V2J13Sx and later!

报错完整解析与解决步骤
1. 报错核心含义
Error: SWV is supported by ST-LINK\V2 with firmware version V2J13Sx and later! 翻译:SWV 串行查看器功能,仅支持固件版本 ≥ V2J13Sx 的 ST-LINK V2 下载器 你当前固件版本:FW version : 0x0110 = V2J10(旧版固件),版本太低,不支持 SWV 实时日志打印。
同时日志能看到:你现在已经强制进入了 ST-LINK DFU 高速升级模式(DFU in HS Mode),正好用来升级固件。
补充小知识
- SWV:STM32 内核自带的 ITM 串口打印,不用占用硬件串口就能在调试窗口输出 printf 日志,做调试非常方便;
- 旧固件 V2J10 砍掉了对 SWV 的兼容,升级到 V2J13 及以上即可修复报错。
2. 一键升级 ST-LINK 固件操作(当前 DFU 模式直接操作)
步骤 1:保持硬件状态不变
ST-Link 依旧按住 BOOT 键上电(DFU 模式不要拔 USB),电脑已经识别 DFU 设备。
步骤 2:打开 STM32CubeProgrammer(Windows)
- 左上角下拉接口选择 ST-LINK;
- 点击界面上方菜单栏
ST-LINK→Firmware upgrade(固件升级); - 软件自动读取 DFU 里的旧固件,点击
Upgrade开始自动刷写官方新版固件; - 等待进度走完,提示升级成功后,拔掉 ST-LINK USB 重新插一次,自动退出 DFU 模式。
升级后验证
重新连接后查看固件版本会变成 V2J13 / V2J17 等高版本,再开启 SWV 就不会报这个错误。
3. 如果暂时不想升级固件(临时规避报错)
在 Keil / STM32CubeIDE 里关闭 SWV 功能即可屏蔽报错:
Keil MDK
- 打开工程魔术棒 →
Debug→ 点击右侧Settings; - 切换到
Trace标签页; - 取消勾选 Enable SWV,确定重新编译下载,报错直接消失。
STM32CubeIDE
调试配置里去掉 ITM/SWV 跟踪端口的勾选,只用普通断点调试。
4. 额外注意点
- 山寨 ST-LINK 风险:很多盗版 ST-LINK V2 刷高版本固件会直接变砖,若升级后无法识别设备,需要短接 BOOT 重新进 DFU 救回;原装 ST-LINK 无任何风险;
- USB 口尽量插电脑后置原生 USB-A 口,避免前置集线器供电不足导致升级失败;
- 固件升级只升级下载器本身,不会影响你 STM32 芯片内部程序,放心操作。

升级slink 固件



STM32MP157 开发板底板资源
正点原子 STM32MP157 开发板底板板载资源如下:
◆ 1 个核心板接口,支持 STM32MP157 核心板
◆ 1 个电源指示灯(蓝色)
◆ 2 个状态指示灯(红色和绿色,用户可以使用)
◆ 1 个六轴(陀螺仪+加速度)传感器芯片,ICM20608
◆ 1 个高性能音频编解码芯片,CS42L51
◆ 1 路 CAN FD 接口,采用 MCP2526FDT 芯片
◆ 1 路 485 接口,采用 SP3485 芯片
◆ 1 路 RS232 串口(母)接口,采用 SP3232 芯片
◆ 1 路 RS232 串口(公)接口,采用 SP3232 芯片
◆ 1 个 ATK 模块接口,支持正点原子蓝牙/GPS/MPU6050/手势识别等模块
◆ 1 个光环境传感器(光照、距离、红外三合一)
◆ 1 个摄像头模块接口
◆ 1 个 OLED 模块接口
◆ 1 个 USB 串口,可用于代码调试,Type-C 接口类型
◆ 1 个 USB OTG 接口,用于 USB 从机通信,Type-C 接口类型
◆ 6 个 USB HOST 接口,用连接 USB 设备
◆ 1 个有源蜂鸣器
◆ 1 个 RS232/RS485 选择接口
◆ 1 个 RS232/ATK 模块选择接口
◆ 1 个串口选择接口
◆ 1 个 TF 卡接口
◆ 1 个 10M/100M/1000M 以太网接口(RJ45)
◆ 1 个录音头(MIC/咪头)
◆ 1 路耳机接口,支持 4 段式耳机
◆ 1 个小扬声器(在板子背面)
◆ 1 组 5V 电源供应/接入口
◆ 1 组 3.3V 电源供应/接入口
◆ 1 个直流电源输入接口(输入电压范围:DC6~16V)
◆ 1 个启动模式选择配置接口
◆ 1 个 RTC 后备电池座,并带电池
◆ 1 个复位按钮,可用于复位 MPU 和 LCD
◆ 3 个功能按钮
◆ 1 个电源开关,控制整个板的电源
◆ 1 个 Mini PCIE 4G 模块接口
◆ 1 个 Nano SIM 卡接口
◆ 1 个 SDIO WIFI&BT 模块,板载
◆ 1 个 WIFI&BT 天线接口,板载
◆ 1 个 HDMI 接口
◆ 1 个 JTAG 调试接口,可以调试 M4 内核
◆ 1 个 SPDIF 光纤音频接收接口
◆ 1 个 SPDIF 光纤音频发送接口
◆ 1 个可调电位器,用于 ADC 测试
◆ 1 个 4P 的圆孔排座,可以接 DHT11 或 DS18B20 温湿度传感器
◆ 1 个 2×22P,2.54mm 间距的排针,引出 44 个 IO,用户可自行使用
STM32MP157-Mini 开发板底板资源

正点原子 STM32MP157-Mini 开发板底板板载资源如下:
◆ 1 个核心板接口,支持 STM32MP157 核心板
◆ 1 个电源指示灯(蓝色)
◆ 2 个状态指示灯(红色和绿色,用户可以使用)
◆ 1 路 CAN FD 接口,采用 MCP2526FDT 芯片
◆ 1 路 485 接口,采用 SP3485 芯片
◆ 1 个 ATK 模块接口,支持正点原子蓝牙/GPS/MPU6050/手势识别等模块
◆ 1 个摄像头模块接口
◆ 1 个 OLED 模块接口
◆ 1 个 USB 串口,可用于代码调试,Type-C 接口类型
◆ 1 个 USB OTG 接口,用于 USB 从机通信,Type-C 接口类型
◆ 2 个 USB HOST 接口,用连接 USB 设备
◆ 1 个有源蜂鸣器
◆ 1 个 TF 卡接口
◆ 1 个 10M/100M/1000M 以太网接口(RJ45)
◆ 1 组 5V 电源供应/接入口
◆ 1 组 3.3V 电源供应/接入口
◆ 1 个直流电源输入接口(输入电压范围:DC6~16V)
◆ 1 个启动模式选择配置接口
◆ 1 个 RTC 后备电池座,并带电池
◆ 1 个复位按钮,可用于复位 MPU 和 LCD
◆ 3 个功能按钮
◆ 1 个电源开关,控制整个板的电源
◆ 1 个 JTAG 调试接口,可以调试 M4 内核
◆ 1 个可调电位器,用于 ADC 测试
◆ 1 个 4P 的圆孔排座,可以接 DHT11 或 DS18B20 温湿度传感器
◆ 1 个 2×30P,2.54mm 间距的排针,引出 60 个 IO,用户可自行使用
STM32MP157 接口核心板资源图

正点原子 STM32MP157 核心板板载资源如下:
◆ CPU:STM32MP157DAA1,双核 A7+单核 M4,A7 主频 800MHz,M4 主频 209MH,LFBGA448 封装。
◆ 外扩 DDR3L:2 片 NT5CC256M16EP-EK,容量为 1GB(2×512MB),位宽 32 位(2×16)。
◆ EMMC:KLM8G1GETF,容量为 8GB 字节。
◆ 两个 2*50 的防反插 BTB 座,共引出 144 个 GPIO 以及 35 个其他功能引脚。
C语言
GPIO_TypeDef 结构体解析(STM32 标准外设库寄存器映射)
typedef struct
{
__IO uint32_t MODER;
__IO uint32_t OTYPER;
__IO uint32_t OSPEEDR; __IO uint32_t PUPDR;
/******此处省略部分代码 */ __IO uint32_t VERR;
__IO uint32_t IPIDR;
__IO uint32_t SIDR;
} GPIO_TypeDef;
关键字说明
-
__IO:宏定义#define __IO volatile
volatile:告诉编译器不要优化这个变量,寄存器硬件会自动改变,防止编译器缓存到寄存器,必须每次从内存地址读取。
uint32_t:32 位无符号整数,STM32 外设寄存器几乎全部 32bit。- 这个结构体直接映射 GPIO 外设寄存器地址,结构体首地址就是 GPIO 基地址。
例:
GPIOA->MODER=(*(GPIO_TypeDef *)GPIOA_BASE).MODER
- volatile
volatile 表示强制编译器减少优化,告诉编译器必须每次去内存中取变量值。 程序运行时数据是存储在主内存(物理内存)中的,每个线程先从主内存拷贝变量到对应 的寄存器中。对没有加 volatile 的变量进行读写时,为了提高读取速度,编译器进行优化时,会 先把主内存中的变量读取到一个寄存器中,以后,再读取此变量的值时,就直接从该寄存器中 读取,而不是直接从内存中读取了,这样的读写速度比较快。如果其它程序改变了内存中变量 的值,上面已经保存到寄存器中的值不会跟着改变,从而造成应用程序读取的值和实际的变量 值不一致。加了 volatile 以后的变量,表示不想被编译器优化掉,每次都要从内存中读取该变量 的数据,不会用寄存器里的值,这样确保了数据的准确性,但影响了效率
-
const const 叫常量限定符,用来限定特定变量为只读属性,如果修改此变量,编译器会报错。 const 修饰的变量存储在只读数据段,在程序结束时释放,而 const 局部变量存储在栈中,代码块结 束时释放。用 const 定义变量时就要初始化该变量: const int a = 4;
-
static static 关键字修饰的变量称为静态变量,如果该变量在声明时未赋初始值,则编译器自动 初始化为 0,静态变量存储在全局区(静态区) 。 在函数内被 static 声明的变量,仅能在本函数中使用,也叫静态局部变量。 在文件内(函数体外)被 static 声明的变量,仅能被本文件内的函数访问,不能被其他文 件中的函数访问,也叫静态全局变量。 静态全局变量和普通的全局变量不同,静态全局变量仅限于本文件中使用,在其它文件中 可以定义一个与静态全局变量名字相同的变量。普通的全局变量可以通过 extern 外部声明后被 其他文件使用,也就是整个工程可见,而且其他文件不能再定义一个与普通全局变量名字相同 的变量了。 用 static 修饰的函数和用 static 修饰的变量类似。
STM32MP157 存储系统
什么是寄存器?
寄存器(Register)是单片机内部一种特殊的内存,它可以实现对单片机各个功能的控制,简单的来说可以把寄存器当成一些控制开关,控制包括内核及外设的各种状态。所以无论是 51
单片机还是 STM32,都需要用寄存器来实现各种控制,以完成不同的功能。
由于寄存器资源非常宝贵,一般都是一个位或者几个位控制一个功能,对于 STM32 来说,其寄存器是 32 位的,一个 32 位的寄存器,可能会有 32 个控制功能,相当于 32 个开关
STM32 寄存器分为两类


STM32MP157 总线结构

AMBA (Advanced Microcontroller Bus Architecture) 高级处理器总线架构,是由 ARM 公司推出的一种通用的、开放的片上通信标准,用于片上系统中功能模块的连接和管理。其中,AHB、APB 和 AXI 总线是目前的 SOC 中经常用到的总线结构:
AXI(Advanced eXtensible Interface),即高级的可扩展接口,是一种面向高性能和高时钟频率的系统设计的总线,目前 AMBA4.0 包括 AXI4.0、AXI4.0-lite、ACE4.0、AXI4.0-stream
等。
AHB(Advanced High performance Bus),即高级高性能总线,主要用于高性能模块 (如 CPU、DMA 和 DSP 等)之间的连接,也可以称 AHB 为―系统总线‖。
APB(AdvancedPeripheral Bus),即高级外围总线,主要用于低带宽的周边外设(如 UART、USB、SPI、I2C 等)之间的连接,也称之为外围总线。
M 表示主端口,S 表示从端口。两根线交叉线相连有小圆点的地方表示可以进 行通信,没有小圆点的地方表示不能通信。在 AXI 互联矩阵中,M0~M10 共接了 11 个主机, S0~S11 共接了 12 个从机层。
STM32MP157内存映射

4GB以内的存储空间(2^32 = 4GB)数据字节以小端格式(小端模式)存放在存储器中,数据的高字节保存在内存的高地 址中,而数据的低字节保存在内存的低地址中。STM32MP157 整个 4GB 内存空间被分为 13 块,这 13 块存储区域对应不同的功能。
STM32 存储块功能及地址范围


BOOT存储区域,这是STM32MP157内部BOOT ROM,用来存储ST自己编写的启动代码,用户不可以使用。
SRAMs区域,这个区域里面一共有4块SRAM:SRAM1~SRAM4,这四块SRAM

SRAM1~SRAM4的地址空间是连续的,地址范围为0X10000000~0X1005FFFF,总大小为 384KB。STM32MP157 M4内核就使用这384KB内存来运行程序,RAM和ROM全部都在这384KB 内存范围内。
如果既要启动A7内核,又要启动M4内核,并且A7内核和M4内核之间又要进行通信, 那么M4就不能使用这全部的384KB内存。此时ST给出的SRAM1~SRAM4内存分配

STM32MP1 启动模式





系统烧写

STM32MP157 报错 virtual partition 0xF1 完整解决方案

一、报错本质
Error: an error occured while uploading data from the virtual partition 0xF1 这是 STM32MP1 系列 MPU 在 eMMC 批量 TSV 分区烧录时的 USB 通信超时 / 握手失败 ,0xF1 是 MP1 内部 U-Boot 虚拟服务分区,负责接收上位机下发的镜像文件,通信中断就会抛出该错误。 结合你的日志:ST-Link 固件版本0x0110(V2J10)老旧、USB 高速传输不稳定是核心诱因。
二、按优先级分步修复(正点原子 MP1 开发板专用)
1. 优先解决 USB 物理链路问题(最高概率根治)
- 移除所有 USB Hub / 扩展坞 STMP1 烧录大数据系统镜像对 USB 带宽、供电要求极高,集线器会导致高速 DFU 传输丢包,直接把开发板 OTG USB 线插到电脑机箱后置原生 USB3.0/USB2.0 A 口。
- 关闭虚拟机 USB 抢占 如果你电脑开了 VMware/VirtualBox,进入虚拟机 USB 设置,取消 "自动捕获 ST-Link/STM32MP1 USB 设备",让 USB 完全由 Windows 主机接管。
- 更换 USB 线材 使用带屏蔽的短数据线,劣质线会造成 480Mbps 高速传输误码。
2. 升级 ST-Link 固件(解决底层兼容性)
你当前 ST-Link 固件版本FW version : 0x0110 = V2J10版本过低,MP1 大容量分区烧录握手逻辑有 bug:
- ST-Link 按住 BOOT 按键插入 USB,进入 DFU 升级模式;
- 在 CubeProgrammer 顶部菜单
ST-LINK→Firmware upgrade一键升级到 V2J17/V2J27 最新固件; - 升级完成拔插 ST-Link 退出 DFU 模式,重新连接开发板。
3. 升级 STM32CubeProgrammer 软件版本
旧版本 CubeProgrammer 对 MP1 虚拟分区 0xF1 超时处理机制不完善:
- 卸载当前版本,安装 ST 官网 V2.17 及以上新版本;
- 新版本内置了 MP1 烧录超时重传机制,大幅降低 0xF1 报错概率。
4. 开发板硬件烧录模式复位操作
- 开发板拨码开关拨到 USB DFU 烧录模式(正点原子 MP1:BOOT0=1、BOOT1=1);
- 按下开发板
RST复位键断电重启,等待串口打印进入 U-Boot DFU 下载就绪状态; - 点击 CubeProgrammer 右上角
Disconnect断开重连,重新点击Download执行 TSV 批量烧录。
5. TSV 烧录超时参数兜底设置(命令行方式)
图形界面超时无法修改时,用 CLI 命令加长 U-Boot 等待超时时间: 打开 CMD 进入 CubeProgrammer 安装目录,执行:
cmd
STM32_Programmer_CLI.exe -c port=usb1 -w flashlayout.tsv -tm 30000
-tm 30000 代表超时 30 秒,给 eMMC 分区写入预留足够长时间。
6. 次要排查点
- 校验 TSV 文件路径:所有镜像文件路径不要包含中文、空格、特殊字符 (你当前路径
E:\data\嵌入式\含中文,建议整体迁移到纯英文路径如E:\stm32mp1_img\); - 校验镜像完整性:重新解压原子出厂系统镜像包,避免 bin/stm32 文件损坏导致分区解析失败;
- 关闭电脑后台占用 USB 的软件:串口助手、虚拟机、USB 监控工具等。
三、操作最简执行顺序(直接照做)
- 拔掉 USB 集线器,开发板直插电脑后置 USB 口,关闭虚拟机 USB 捕获;
- 升级 ST-Link 固件到最新版;
- 镜像文件夹改为纯英文无中文路径;
- 开发板复位重进 DFU 烧录模式,重新点击 Download 烧录。

解决方法 重启电脑 直接把开发板 OTG USB 线插到电脑机箱后置原生 USB3.0/USB2.0 A 口。

sd 卡

报错解析:MMC erase failed(SD 卡版本 TSV 烧录)
一、报错直译与含义
plaintext
Error: Message from Embedded Flash Loader : ssbl (0x6): MMC erase failed
- 核心翻译 :嵌入式加载器在执行 SSBL 二级引导程序(分区 0x6)时,SD 卡 MMC 存储设备擦除操作失败
- 场景区分:这次你加载的是
atk_sdcard版本 TSV,镜像要写入板载 SD 卡(mmc0),而非之前的 eMMC,芯片在调用 U-Boot 底层指令清空 SD 卡扇区时执行出错。
二、按优先级排查修复(正点原子 STM32MP157 SD 卡烧录专用)
1. 硬件 SD 卡本身问题(最高发原因)
- SD 卡损坏 / 接触不良
- 取出开发板 TF 卡,重新插拔按压到位;用读卡器插电脑格式化(推荐 FAT32 格式,4K 对齐);
- 老旧杂牌 SD 卡、扩容卡极易出现 MMC 擦除指令返回失败,直接更换一张正规 8G/16G 高速 TF 卡测试。
- SD 卡卡槽虚焊 / 异物 查看卡槽内部是否有灰尘、弹片下陷,MP1 开发板 SD 卡槽受力后容易接触不良。
2. 开发板 BOOT 启动模式与复位操作
SD 卡版本 DFU 烧录拨码必须严格设置:
- BOOT0 = 1,BOOT1 = 1(双位全部拨到 ON,进入 USB DFU 固件加载模式)
- 设置完成后长按 RST 复位键重启板子,等待 U-Boot 完全进入 DFU 就绪状态再点击 Download
若 U-Boot 未完全就绪,下发 MMC 擦除指令会直接返回失败。
3. USB 通信与底层固件老版本兼容问题
- ST-LINK 固件过低 依旧是
FW version : 0x0110(V2J10)旧固件,对 MP1 MMC 块设备指令集兼容性差: 按住 ST-LINK BOOT 键进 DFU → CubeProgrammer 顶部ST-LINK→Firmware upgrade升级到 V2J17 及以上。 - USB 物理链路优化 直插电脑后置 USB2.0 原生接口、移除 Hub / 延长线 / 虚拟机 USB 捕获,避免指令传输中断导致 MMC 操作超时报错。
4. 软件与文件路径坑
- 路径中文问题
E:\data\嵌入式\...路径包含中文,CubeProgrammer 解析 TSV 脚本时可能解析错乱,间接导致 MMC 操作指令异常; 整改:整个镜像文件夹迁移到全英文无空格路径 ,例如E:\stm32mp1_sd_img。 - CubeProgrammer 版本老旧 旧版对 SD 卡 MMC 擦除重试机制不完善,升级到 V2.17 及以上新版本。
5. 兜底命令行烧录(加长 MMC 操作超时)
图形界面超时太短,用 CLI 命令延长等待时间,给 SD 卡慢速擦除足够耗时:
- 管理员打开 CMD,进入程序 bin 目录
cmd
cd "C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin"
- 执行烧录命令(
-tm 6000060 秒超时)
cmd
STM32_Programmer_CLI.exe -c port=usb1 -w atk_sdcard-stm32mp157d-qt.tsv -tm 60000
三、最简执行操作顺序(直接照做)
- 取出 SD 卡,电脑格式化或直接换一张新 TF 卡,插紧开发板卡槽;
- 开发板拨码 BOOT0=1、BOOT1=1,按 RST 复位重启;
- 升级 ST-LINK 固件到最新版本;
- 镜像文件夹改成纯英文路径;
- 使用 CMD 命令行加长超时执行 SD 版 TSV 烧录。
补充小提示
atk_sdcard.tsv是系统烧录到外部 TF 卡,atk_emmc.tsv是烧录板载内置 eMMC,两个文件不要混用;- 如果更换 SD 卡后依然报 MMC erase failed,大概率是开发板 SD 卡槽硬件故障。
烧录 TF-A


tf-a.tsv
TF-A 启动 log 信息
~# NOTICE: CPU: STM32MP157DAA Rev.Z
NOTICE: Model: STMicroelectronics STM32MP157D eval daughter
INFO: Reset reason (0x14):
INFO: Pad Reset from NRST
INFO: Using EMMC
INFO: Instance 2
INFO: Boot used partition fsbl1
NOTICE: BL2: v2.2-r1.0(debug):
NOTICE: BL2: Built : 21:30:41, Aug 10 2026
INFO: Using crypto library 'stm32_crypto_lib'
INFO: BL2: Doing platform setup
INFO: RAM: DDR3-DDR3L 32bits 533000Khz
INFO: Memory size = 0x40000000 (1024 MB)
INFO: BL2 runs SP_MIN setup
INFO: BL2: Loading image id 4
INFO: Loading image id=4 at address 0x2ffed000
INFO: Image id=4 loaded: 0x2ffed000 - 0x2ffff000
INFO: BL2: Loading image id 5
INFO: Loading image id=5 at address 0xc0100000
INFO: STM32 Image size : 867196
INFO: Image id=5 loaded: 0xc0100000 - 0xc01d3b7c
WARNING: Skip signature check (header option)
NOTICE: ROTPK is not deployed on platform. Skipping ROTPK verification.
NOTICE: BL2: Booting BL32
INFO: Entry point address = 0x2ffed000
INFO: SPSR = 0x1d3
INFO: Cannot find st,stpmic1 node in DT
NOTICE: SP_MIN: v2.2-r1.0(debug):
NOTICE: SP_MIN: Built : 21:30:58, Aug 10 2026
INFO: ARM GICv2 driver initialized
INFO: stm32mp IWDG1 (12): Secure
INFO: ETZPC: CRYP1 (9) could be non secure
INFO: SP_MIN: Initializing runtime services
INFO: SP_MIN: Preparing exit to normal world
编译 ST 官方 TF-A 源码
编译 TF-A 在 6.1.2 小节我们已经准备好了 ST 官方的 TF-A 源码,我们另外新建一个名为"my-tfa"的 目录来存放并编译 ST 官方的 TF-A 源码

修改 Makefile.sdk 首先要修改图 9.1.2.1 中的 Makefile.sdk,因为此文件定义编译选项,包括交叉编译器,我 们要使用自己的交叉编译器,也就是 4.3.1 小节安装的 arm-none-linux-gnueabihf-gcc 编译器。用 VIM 编辑器打开 Makefile.sdk,找到"CROSS_COMPILE",将其改为"arm-none-linux-gnueabihf-"

修改完成以后保存退出,进入到图 9.1.2.1 中的 tf-a-stm32mp-2.2.r1 目录下,然后进行编译, 命令如下: cd tf-a-stm32mp-2.2.r1/ //进入到 tf-a 源码目录下 make -f ../Makefile.sdk all //编译 如果需要加快编译速度,可是使用多线程编译,线程数最好和自己给虚拟机分配的物理核 心一致,使用-j 来指定线程数,命令如下: make -f ../Makefile.sdk -j8 all //使用 8 线程编译 编译完成以后会在 tf-a-stm32mp-2.2.r1 文件夹的上层目录(也就是 Makefile.sdk 同级目录下) 下生成一个名为"build"的文件夹,build 文件夹下就是编译生成的所有可执行文件

烧写 ST 官方 TF-A 镜像



启动拨回 010


TF-A 移植
设备树
tf-a-stm32mp-2.2.r1\fdts 目录 TF-A 设备树文件

以
stm32mp157d-ev1.dts 为蓝本,添加正点原子 STM32MP157 开发板对应的设备树文件。
设备树文件:文件后缀为.dts 头文件:头文件 .dtsi
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/fdts$ cat stm32mp157d-ev1.dts
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
* Copyright (C) STMicroelectronics 2019 - All Rights Reserved
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
*/
/dts-v1/;
#include "stm32mp157d-ed1.dts"
#include "stm32mp15xx-evx.dtsi"
/ {
model = "STMicroelectronics STM32MP157D eval daughter on eval mother";
compatible = "st,stm32mp157d-ev1", "st,stm32mp157d-ed1", "st,stm32mp157";
chosen {
stdout-path = "serial0:115200n8";
};
aliases {
serial1 = &usart3;
};
};
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/fdts$
修改完成以后保存退出,然后执行如下命令编译一下 TF-A :
cd tf-a-stm32mp-2.2.r1/
// 进入到 tf-a 源码目录下
make -f ../Makefile.sdk all
// 编译
如果修改没有错误的话就会编译成功,编译完成以后进入 build/trusted 目录下,此时就会生
成以" tf-a-stm32mp157d-atk "开头的相关文件,
tf-a-bl2-trusted.elf tf-a-stm32mp157c-ed1.map tf-a-stm32mp157d-ev1.ld
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/build/trusted$ ls tf-a-stm32mp157d-atk* -l
-rwxrwxr-x 1 user user 241728 8月 11 22:47 tf-a-stm32mp157d-atk.bin
-rwxrwxr-x 1 user user 252056 8月 11 22:47 tf-a-stm32mp157d-atk.elf
-rw-rw-r-- 1 user user 1354 8月 11 22:47 tf-a-stm32mp157d-atk.ld
-rw-rw-r-- 1 user user 3540 8月 11 22:47 tf-a-stm32mp157d-atk.map
-rw-rw-r-- 1 user user 241984 8月 11 22:47 tf-a-stm32mp157d-atk.stm32
-rw-rw-r-- 1 user user 241984 8月 11 22:47 tf-a-stm32mp157d-atk-trusted.stm32
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/build/trusted$
就是我们以后要烧写的 TF-A 固件,其设备树 (dtb) 已经替换为我们上面新建的
stm32mp157d-atk.dts 了。但是由于我们并没有对 TF-A 源码做什么修改,所以 tf-a-stm32mp157d
atk-trusted.stm32 依旧是不可运行的,错误类型和图 9.1.3.1 中的一样,大家可以自行烧写测试。
就是我们以后要烧写的 TF-A 固件,其设备树 (dtb) 已经替换为我们上面新建的
stm32mp157d-atk.dts 了。但是由于我们并没有对 TF-A 源码做什么修改,所以 tf-a-stm32mp157d
atk-trusted.stm32 依旧是不可运行的,错误类型和图 9.1.3.1 中的一样,大家可以自行烧写测试。
相关配置。
打开 stm32mp157d-atk.dtsi 文件,找到如下所以代码:
电源管理修改
er@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa$ cd build/
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/build$ ls
optee serialboot trusted
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/build$ cd trusted/
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/build/trusted$ ls
bl2 romlib
bl2.bin stm32mp1.o
bl32 tf-a-bl2-trusted.elf
bl32.bin tf-a-bl32-trusted.elf
debug-tf-a-stm32mp157d-atk-trusted.stm32 tf-a-stm32mp157d-atk.bin
fdts tf-a-stm32mp157d-atk.elf
lib tf-a-stm32mp157d-atk.ld
libc tf-a-stm32mp157d-atk.map
libfdt tf-a-stm32mp157d-atk.stm32
libwrapper tf-a-stm32mp157d-atk-trusted.stm32
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/build/trusted$




root@ATK-DLMP157:~# NOTICE: CPU: STM32MP157DAA Rev.Z
NOTICE: Model: STMicroelectronics STM32MP157D eval daughter
INFO: Reset reason (0x15):
INFO: Power-on Reset (rst_por)
INFO: Using EMMC
INFO: Instance 2
INFO: Boot used partition fsbl1
NOTICE: BL2: v2.2-r1.0(debug):
NOTICE: BL2: Built : 23:55:29, Aug 11 2026
INFO: Using crypto library 'stm32_crypto_lib'
INFO: BL2: Doing platform setup
INFO: RAM: DDR3-DDR3L 32bits 533000Khz
INFO: Memory size = 0x40000000 (1024 MB)
INFO: BL2 runs SP_MIN setup
INFO: BL2: Loading image id 4
INFO: Loading image id=4 at address 0x2ffed000
INFO: Image id=4 loaded: 0x2ffed000 - 0x2ffff000
INFO: BL2: Loading image id 5
INFO: Loading image id=5 at address 0xc0100000
INFO: STM32 Image size : 867196
INFO: Image id=5 loaded: 0xc0100000 - 0xc01d3b7c
WARNING: Skip signature check (header option)
NOTICE: ROTPK is not deployed on platform. Skipping ROTPK verification.
NOTICE: BL2: Booting BL32
INFO: Entry point address = 0x2ffed000
INFO: SPSR = 0x1d3
INFO: Cannot find st,stpmic1 node in DT
NOTICE: SP_MIN: v2.2-r1.0(debug):
NOTICE: SP_MIN: Built : 23:55:29, Aug 11 2026
INFO: ARM GICv2 driver initialized
INFO: stm32mp IWDG1 (12): Secure
INFO: ETZPC: CRYP1 (9) could be non secure
INFO: SP_MIN: Initializing runtime services
INFO: SP_MIN: Preparing exit to normal world
xxx-serialboot.stm32 测试

原来的 :
EXTRA_OEMAKE_SERIAL= STM32MP_UART_PROGRAMMER=1 STM32MP_USB_PROGRAMMER=1
修改后
EXTRA_OEMAKE_SERIAL=$(filter-out STM32MP_SDMMC=1 STM32MP_EMMC=1 STM32MP_SPI_NOR=1 STM32MP_RAW_NAND=1 STM32MP_SPI_NAND=1,$(EXTRA_OEMAKE)) STM32MP_UART_PROGRAMMER=1 STM32MP_USB_PROGRAMMER=1

make -f ../Makefile.sdk TFA_DEVICETREE=stm32mp157d-atk TF_A_CONFIG=serialboot ELF_DEBUG_ENABLE='1' all
报错
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1$ make -f ../Makefile.sdk TFA_DEVICETREE=stm32mp157d-atk TF_A_CONFIG=serialboot ELF_DEBUG_ENABLE='1' all
make[1]: 对"all"无需做任何事。
for config in serialboot ; do \
# Init any extraoemake \
add_extraoemake= ; \
for fullconfig in trusted,"AARCH32_SP=sp_min" optee,"AARCH32_SP=optee" serialboot,"AARCH32_SP=sp_min" ; do \
extraconfig=$(echo $fullconfig | cut -d',' -f1) ; \
if [ "$extraconfig" = "$config" ]; then \
add_extraoemake=$(echo $fullconfig | cut -d',' -f2) ; \
fi ; \
done ; \
mkdir -p /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config ; \
if test -n "stm32mp157d-atk" ; then \
for dt in stm32mp157d-atk ; do \
if [ "serialboot" != "serialboot" ]; then \
make CROSS_COMPILE=arm-none-linux-gnueabihf- DEBUG=1 LOG_LEVEL=40 PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 STM32MP_SDMMC=1 STM32MP_EMMC=1 STM32MP_SPI_NOR=1 STM32MP_RAW_NAND=1 STM32MP_SPI_NAND=1 -C /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1 DTB_FILE_NAME=$dt.dtb BUILD_PLAT=/home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config $add_extraoemake ; \
else \
make EXTRA_OEMAKE_SERIAL=CROSS_COMPILE=arm-none-linux-gnueabihf- DEBUG=1 LOG_LEVEL=40 PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 STM32MP_UART_PROGRAMMER=1 STM32MP_USB_PROGRAMMER=1 -C /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1 DTB_FILE_NAME=$dt.dtb BUILD_PLAT=/home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config $add_extraoemake ; \
fi \
# Copy binary file with explicit name \
cp -f /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/tf-a-$dt.stm32 /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/tf-a-$dt-$config.stm32 ; \
if [ "1" = "1" ]; then \
# Generate wrapper for debugging \
stm32wrapper4dbg -s /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/tf-a-$dt.stm32 -d /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/debug-tf-a-$dt-$config.stm32 ; \
fi \
done ; \
else \
make CROSS_COMPILE=arm-none-linux-gnueabihf- DEBUG=1 LOG_LEVEL=40 PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 STM32MP_SDMMC=1 STM32MP_EMMC=1 STM32MP_SPI_NOR=1 STM32MP_RAW_NAND=1 STM32MP_SPI_NAND=1 -C /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1 BUILD_PLAT=/home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config $add_extraoemake; \
tf_version=$(find /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config -name tf-a*.stm32 -exec basename {} \; | sed "s/\.stm32//") ; \
# Copy binary file with explicit name \
cp -f /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/$tf_version.stm32 /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/$tf_version-$config.stm32 ; \
if [ "1" = "1" ]; then \
# Generate wrapper for debugging \
stm32wrapper4dbg -s /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/$tf_version.stm32 /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/debug-$tf_version-$config.stm32 ; \
fi \
fi ; \
# Copy elf files with explicit name \
if [ "1" = "1" ] ; then \
if [ -f /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/bl2/bl2.elf ] ; then \
cp -f /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/bl2/bl2.elf /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/tf-a-bl2-$config.elf ; \
fi ; \
if [ -f /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/bl32/bl32.elf ] ; then \
cp -f /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/bl32/bl32.elf /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/$config/tf-a-bl32-$config.elf ; \
fi ; \
fi ; \
done
make[1]: 进入目录"/home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1"
Including bl32/sp_min/sp_min.mk
CC lib/libfdt/fdt.c
gcc: warning: '-mcpu=' is deprecated; use '-mtune=' or '-march=' instead
gcc: error: unrecognized command line option '-mfpu=neon'
gcc: error: unrecognized command line option '-mthumb'; did you mean '-mtbm'?
gcc: error: unrecognized command line option '-mno-unaligned-access'; did you mean '-Wno-aligned-new'?
gcc: error: unrecognized command line option '-mfloat-abi=soft'
lib/libfdt/libfdt.mk:19: recipe for target '/home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/serialboot/libfdt/fdt.o' failed
make[1]: *** [/home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/serialboot/libfdt/fdt.o] Error 1
make[1]: 离开目录"/home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1"
cp: 无法获取'/home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/serialboot/tf-a-stm32mp157d-atk.stm32' 的文件状态(stat): 没有那个文件或目录
Can't open /home/user/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1/../build/serialboot/tf-a-stm32mp157d-atk.stm32: No such file or directory
user@user-virtual-machine:~/linux/atk-mp1/tf-a/my-tfa/tf-a-stm32mp-2.2.r1$
手动输入修改Makfefile 先备份Makfefile

原来的:

EXTRA_OEMAKE_SERIAL= STM32MP_UART_PROGRAMMER=1 STM32MP_USB_PROGRAMMER=1
修改后

#EXTRA_OEMAKE_SERIAL= STM32MP_UART_PROGRAMMER=1 STM32MP_USB_PROGRAMMER=1
EXTRA_OEMAKE_SERIAL=$(filter-out STM32MP_SDMMC=1 STM32MP_EMMC=1 STM32MP_SPI_NOR=1 STM32MP_RAW_NAND=1 STM32MP_SPI_NAND=1,$(EXTRA_OEMAKE)) STM32MP_UART_PROGRAMMER=1 STM32MP_USB_PROGRAMMER=1
编译:
输入如下命令编译: cd tf-a-stm32mp-2.2.r1/ //进入到 tf-a 源码目录下 make -f ../Makefile.sdk clean //清除以前的编译 make -f ../Makefile.sdk TFA_DEVICETREE=stm32mp157d-atk TF_A_CONFIG=serialboot ELF_DEBUG_ENABLE='1' all //编译 编译完成以后就会在../build/serialboot 目录下生成 tf-a-stm32mp157d-atk-serialboot.stm32




