STM321MP157 笔记

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 客户端修改配置(重点)

快速连接简易设置(推荐)

  1. 清空端口框里的 23,改成 22
  2. 主机地址直接只填 IP:192.168.237.129(删掉前面//
  3. 用户名:user(你的 Ubuntu 登录账号),密码填登录密码
  4. 点击快速连接

更稳定的站点管理器配置(一劳永逸)

  1. 点击左上角「文件」→「站点管理器」→「新站点」
  2. 协议:选择 SFTP - SSH 文件传输协议
  3. 主机:192.168.237.129
  4. 端口:22
  5. 登录类型:正常
  6. 用户:user,密码填系统密码
  7. 点击连接即可

四、排查如果还是连不上的附加检查

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(一步一步照着点)

方式一:站点管理器(最规范,推荐长期使用)

  1. 打开 FileZilla 顶部菜单栏 文件 → 站点管理器 (快捷键 Ctrl+S

  2. 点击左上角 新站点 ,随便起个名字,比如 Ubuntu18.04

  3. 在右侧填写参数(重点)

  • 协议 :下拉选择 SFTP - SSH 文件传输协议
  • 主机 :填写虚拟机 IP 192.168.237.129
  • 端口 :固定填 22(SSH 默认端口,留空也自动用 22)
  • 登录类型 :选择 正常
  • 用户user(你的 Ubuntu 登录用户名)
  • 密码:Ubuntu 登录密码
  1. 点击底部 连接 即可。

Ubuntu 18.04 修改 root 密码两种方法

方法 1:当前普通用户有 sudo 权限(你现在的环境直接用)

打开 Ubuntu 终端执行:

bash

复制代码
sudo passwd root
  1. 先输入你当前 user 用户的密码(回车)
  2. 输入新的 root 密码(看不见光标,正常输入)
  3. 再次确认 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

  1. 编辑配置文件

bash

复制代码
sudo vi /etc/exports
  1. 在文件末尾添加一行(允许任意网段挂载,嵌入式开发最常用)

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(驱动开发必备)
  1. 保存退出(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-serverrpcbind 已是最新版,不用重复安装;
  • 如果后面挂载提示权限不足,给共享目录加最高权限:

bash

复制代码
sudo chmod 777 ~/linux/nfs

VSCode 配置

问题原因

  1. 你打开的是搜索框(Find),不是命令面板;
  2. 输入关键词不全,完整命令是带括号的 C/C++: Edit Configurations (UI),简写搜索搜不到。

方法一:正确调出命令面板(推荐)

  1. 按下快捷键 Ctrl + Shift + P(这是「命令面板」,不是顶部搜索框)
  2. 在弹出的顶部输入框里直接粘贴:

plaintext

复制代码
C/C++: Edit Configurations (UI)
  1. 点击选中这一项,自动打开配置页面。

方法二:直接手动创建配置文件(绕开搜索)

  1. 在左侧资源管理器,点开你的 test1 文件夹
  2. 新建文件夹:.vscode(前面带小数点)
  3. .vscode 里面新建文件 c_cpp_properties.json
  4. 把下面完整内容复制粘贴进去保存:

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++ 插件入口进入

  1. 左侧点「扩展」图标(四个方块)
  2. 找到已安装的 C/C++ by Microsoft
  3. 点右下角齿轮 → Extension Settings
  4. 搜索框输入 Include Path,在 C_Cpp: Include Path 项添加两行:

plaintext

复制代码
${workspaceFolder}/**
/usr/include

Ubuntu 下 ST 官方软件安装

STM32CubeProgrammer Linux 安装后无桌面图标完整解决

一、先执行原始安装命令(如果还没装好)

  1. 进入解压后的文件夹目录

bash

复制代码
cd 你的解压文件夹路径
  1. 添加执行权限(Linux 必须做这一步,很多人漏了)

bash

复制代码
chmod +x SetupSTM32CubeProgrammer-2.5.0.linux
  1. 运行安装程序

bash

复制代码
./SetupSTM32CubeProgrammer-2.5.0.linux

一路默认下一步完成安装。

实际

核心原因一句话总结

DFU in HS Mode 是 ST-Link 进入固件升级模式才会出现的设备,正常调试烧录工作模式下只会显示 STM32 STLink,你现在设备完全正常,不用管 DFU 消失。


1. 两种模式区别

① 正常工作模式(你当前状态)

USB 插入直接上电,ST-Link 进入调试 / 下载标准模式

  • 设备管理器只出现:STM32 STLink
  • 功能:给 STM32 芯片下载程序、在线 Debug 调试、读取芯片 Flash
  • 指示灯:绿灯闪烁 / 常亮(不同版本 ST-Link 略有差异)

② DFU 高速固件升级模式(才会多出 DFU 设备)

需要手动触发硬件进入 DFU 升级模式:

  1. 按住 ST-Link 外壳上的 BOOT 按键 不放
  2. 再插入 USB 给下载器上电
  3. 松开 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 升级简易步骤

  1. 长按 ST-Link 上的 BOOT 小按钮
  2. 插 USB 通电,松开按钮
  3. 打开 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 及以上即可修复报错。

步骤 1:保持硬件状态不变

ST-Link 依旧按住 BOOT 键上电(DFU 模式不要拔 USB),电脑已经识别 DFU 设备。

步骤 2:打开 STM32CubeProgrammer(Windows)

  1. 左上角下拉接口选择 ST-LINK
  2. 点击界面上方菜单栏 ST-LINKFirmware upgrade(固件升级);
  3. 软件自动读取 DFU 里的旧固件,点击 Upgrade 开始自动刷写官方新版固件;
  4. 等待进度走完,提示升级成功后,拔掉 ST-LINK USB 重新插一次,自动退出 DFU 模式。

升级后验证

重新连接后查看固件版本会变成 V2J13 / V2J17 等高版本,再开启 SWV 就不会报这个错误。


3. 如果暂时不想升级固件(临时规避报错)

在 Keil / STM32CubeIDE 里关闭 SWV 功能即可屏蔽报错:

Keil MDK

  1. 打开工程魔术棒 → Debug → 点击右侧 Settings
  2. 切换到 Trace 标签页;
  3. 取消勾选 Enable SWV,确定重新编译下载,报错直接消失。

STM32CubeIDE

调试配置里去掉 ITM/SWV 跟踪端口的勾选,只用普通断点调试。


4. 额外注意点

  1. 山寨 ST-LINK 风险:很多盗版 ST-LINK V2 刷高版本固件会直接变砖,若升级后无法识别设备,需要短接 BOOT 重新进 DFU 救回;原装 ST-LINK 无任何风险;
  2. USB 口尽量插电脑后置原生 USB-A 口,避免前置集线器供电不足导致升级失败;
  3. 固件升级只升级下载器本身,不会影响你 STM32 芯片内部程序,放心操作。

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

  1. volatile

volatile 表示强制编译器减少优化,告诉编译器必须每次去内存中取变量值。 程序运行时数据是存储在主内存(物理内存)中的,每个线程先从主内存拷贝变量到对应 的寄存器中。对没有加 volatile 的变量进行读写时,为了提高读取速度,编译器进行优化时,会 先把主内存中的变量读取到一个寄存器中,以后,再读取此变量的值时,就直接从该寄存器中 读取,而不是直接从内存中读取了,这样的读写速度比较快。如果其它程序改变了内存中变量 的值,上面已经保存到寄存器中的值不会跟着改变,从而造成应用程序读取的值和实际的变量 值不一致。加了 volatile 以后的变量,表示不想被编译器优化掉,每次都要从内存中读取该变量 的数据,不会用寄存器里的值,这样确保了数据的准确性,但影响了效率

  1. const const 叫常量限定符,用来限定特定变量为只读属性,如果修改此变量,编译器会报错。 const 修饰的变量存储在只读数据段,在程序结束时释放,而 const 局部变量存储在栈中,代码块结 束时释放。用 const 定义变量时就要初始化该变量: const int a = 4;

  2. 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 物理链路问题(最高概率根治)

  1. 移除所有 USB Hub / 扩展坞 STMP1 烧录大数据系统镜像对 USB 带宽、供电要求极高,集线器会导致高速 DFU 传输丢包,直接把开发板 OTG USB 线插到电脑机箱后置原生 USB3.0/USB2.0 A 口
  2. 关闭虚拟机 USB 抢占 如果你电脑开了 VMware/VirtualBox,进入虚拟机 USB 设置,取消 "自动捕获 ST-Link/STM32MP1 USB 设备",让 USB 完全由 Windows 主机接管。
  3. 更换 USB 线材 使用带屏蔽的短数据线,劣质线会造成 480Mbps 高速传输误码。

你当前 ST-Link 固件版本FW version : 0x0110 = V2J10版本过低,MP1 大容量分区烧录握手逻辑有 bug:

  1. ST-Link 按住 BOOT 按键插入 USB,进入 DFU 升级模式;
  2. 在 CubeProgrammer 顶部菜单 ST-LINKFirmware upgrade 一键升级到 V2J17/V2J27 最新固件;
  3. 升级完成拔插 ST-Link 退出 DFU 模式,重新连接开发板。

3. 升级 STM32CubeProgrammer 软件版本

旧版本 CubeProgrammer 对 MP1 虚拟分区 0xF1 超时处理机制不完善:

  • 卸载当前版本,安装 ST 官网 V2.17 及以上新版本
  • 新版本内置了 MP1 烧录超时重传机制,大幅降低 0xF1 报错概率。

4. 开发板硬件烧录模式复位操作

  1. 开发板拨码开关拨到 USB DFU 烧录模式(正点原子 MP1:BOOT0=1、BOOT1=1);
  2. 按下开发板RST复位键断电重启,等待串口打印进入 U-Boot DFU 下载就绪状态;
  3. 点击 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. 次要排查点

  1. 校验 TSV 文件路径:所有镜像文件路径不要包含中文、空格、特殊字符 (你当前路径E:\data\嵌入式\含中文,建议整体迁移到纯英文路径如E:\stm32mp1_img\);
  2. 校验镜像完整性:重新解压原子出厂系统镜像包,避免 bin/stm32 文件损坏导致分区解析失败;
  3. 关闭电脑后台占用 USB 的软件:串口助手、虚拟机、USB 监控工具等。

三、操作最简执行顺序(直接照做)

  1. 拔掉 USB 集线器,开发板直插电脑后置 USB 口,关闭虚拟机 USB 捕获;
  2. 升级 ST-Link 固件到最新版;
  3. 镜像文件夹改为纯英文无中文路径;
  4. 开发板复位重进 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
  1. 核心翻译 :嵌入式加载器在执行 SSBL 二级引导程序(分区 0x6)时,SD 卡 MMC 存储设备擦除操作失败
  2. 场景区分:这次你加载的是 atk_sdcard 版本 TSV,镜像要写入板载 SD 卡(mmc0),而非之前的 eMMC,芯片在调用 U-Boot 底层指令清空 SD 卡扇区时执行出错。

二、按优先级排查修复(正点原子 STM32MP157 SD 卡烧录专用)

1. 硬件 SD 卡本身问题(最高发原因)

  1. SD 卡损坏 / 接触不良
    • 取出开发板 TF 卡,重新插拔按压到位;用读卡器插电脑格式化(推荐 FAT32 格式,4K 对齐);
    • 老旧杂牌 SD 卡、扩容卡极易出现 MMC 擦除指令返回失败,直接更换一张正规 8G/16G 高速 TF 卡测试。
  2. SD 卡卡槽虚焊 / 异物 查看卡槽内部是否有灰尘、弹片下陷,MP1 开发板 SD 卡槽受力后容易接触不良。

2. 开发板 BOOT 启动模式与复位操作

SD 卡版本 DFU 烧录拨码必须严格设置:

  • BOOT0 = 1,BOOT1 = 1(双位全部拨到 ON,进入 USB DFU 固件加载模式)
  • 设置完成后长按 RST 复位键重启板子,等待 U-Boot 完全进入 DFU 就绪状态再点击 Download

若 U-Boot 未完全就绪,下发 MMC 擦除指令会直接返回失败。

3. USB 通信与底层固件老版本兼容问题

  1. ST-LINK 固件过低 依旧是FW version : 0x0110(V2J10)旧固件,对 MP1 MMC 块设备指令集兼容性差: 按住 ST-LINK BOOT 键进 DFU → CubeProgrammer 顶部ST-LINKFirmware upgrade升级到 V2J17 及以上。
  2. USB 物理链路优化 直插电脑后置 USB2.0 原生接口、移除 Hub / 延长线 / 虚拟机 USB 捕获,避免指令传输中断导致 MMC 操作超时报错。

4. 软件与文件路径坑

  1. 路径中文问题 E:\data\嵌入式\... 路径包含中文,CubeProgrammer 解析 TSV 脚本时可能解析错乱,间接导致 MMC 操作指令异常; 整改:整个镜像文件夹迁移到全英文无空格路径 ,例如 E:\stm32mp1_sd_img
  2. CubeProgrammer 版本老旧 旧版对 SD 卡 MMC 擦除重试机制不完善,升级到 V2.17 及以上新版本。

5. 兜底命令行烧录(加长 MMC 操作超时)

图形界面超时太短,用 CLI 命令延长等待时间,给 SD 卡慢速擦除足够耗时:

  1. 管理员打开 CMD,进入程序 bin 目录

cmd

复制代码
cd "C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin"
  1. 执行烧录命令(-tm 60000 60 秒超时)

cmd

复制代码
STM32_Programmer_CLI.exe -c port=usb1 -w atk_sdcard-stm32mp157d-qt.tsv -tm 60000

三、最简执行操作顺序(直接照做)

  1. 取出 SD 卡,电脑格式化或直接换一张新 TF 卡,插紧开发板卡槽;
  2. 开发板拨码 BOOT0=1、BOOT1=1,按 RST 复位重启;
  3. 升级 ST-LINK 固件到最新版本;
  4. 镜像文件夹改成纯英文路径;
  5. 使用 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

相关推荐
XMAIPC_Robot1 小时前
RK3588+STM32:高性能机器人运动控制解决方案,兼顾实时性与AI算力
人工智能·stm32·嵌入式硬件·算法·fpga开发·机器人·arm+fpga
天吾cc1 小时前
RTT-MQTT
网络·单片机·嵌入式硬件·算法
国科安芯1 小时前
星上能源管家:AS32S601辐射加固MCU在卫星电源管理中的性能解析
单片机·嵌入式硬件·能源·抗辐射加固
茯苓gao1 小时前
无感FOC核心原理:没有编码器,电机如何获得转子电角度?
笔记·嵌入式硬件·学习
单片机杂货铺2 小时前
【单片机毕业设计选题】基于单片机的西瓜大棚控制
stm32·单片机·嵌入式硬件·51单片机·硬件工程
西城微科方案开发3 小时前
SIC8P370D2L:高集成低功耗8位通用OTP MCU
单片机·嵌入式硬件
LCG元3 小时前
STM32F103 ADC 多通道 DMA 采集与滤波算法对比:从滑动平均到卡尔曼滤波
stm32·嵌入式硬件·算法
@松4 小时前
STM32F103C8-GPIO—位带操作学习
stm32·嵌入式硬件·学习
鹿屿二向箔4 小时前
keil5.39版本使用AC6编译器不能位域操作的BUG使用STM32U385系列MCU
stm32·单片机·bug