当前位置: 首页 > news >正文

保姆级教程:在Ubuntu 20.04上搞定STM32MP157双核开发环境(A7+M4,含SDK和CubeIDE避坑指南)

保姆级教程:Ubuntu 20.04下STM32MP157双核开发环境全攻略

拿到STM32MP157开发板的第一天,我就被它双核架构的潜力所吸引——Cortex-A7负责运行Linux系统,Cortex-M4实时处理传感器数据,这种组合在工业控制、智能家居等领域有着广泛应用。但当我按照官方文档开始搭建开发环境时,各种依赖问题、配置错误接踵而至,整整两天时间都耗在了环境配置上。如果你也正在经历这种痛苦,那么这篇从实战中总结的指南正是为你准备的。

不同于网络上零散的教程,本文将基于Ubuntu 20.04 LTS系统,完整呈现A7核Linux开发环境和M4核实时系统环境的搭建过程,特别针对这个较新系统版本中可能遇到的坑点提供解决方案。从SDK安装、依赖包管理到CubeIDE配置,每个步骤都经过实测验证,确保你能一次性成功搭建起开发环境。

1. 准备工作与系统配置

在开始之前,我们需要做好一些基础准备工作。STM32MP157的开发环境对系统资源有一定要求,建议至少准备:

  • 100GB可用存储空间:SDK、工具链和示例工程会占用大量空间
  • Ubuntu 20.04 LTS 64位系统:本文所有操作都基于此版本测试
  • 稳定的网络连接:需要下载大量软件包和工具

首先更新系统软件源并安装基础工具:

sudo apt update && sudo apt upgrade -y sudo apt install -y wget curl git vim

1.1 解决Ubuntu 20.04特有依赖问题

Ubuntu 20.04默认使用Python 3.8,而STM32MP157的SDK对Python环境有特定要求。我们需要额外安装一些兼容性包:

sudo apt install -y python3-distutils python3-dev python3-pip

对于图形界面开发,还需要安装以下依赖:

sudo apt install -y libsdl1.2-dev libegl1-mesa xterm

常见问题:如果在后续步骤中遇到libncurses相关错误,可能是因为Ubuntu 20.04的默认版本与SDK要求不符。可以安装兼容版本:

sudo apt install -y libncurses5 libncurses5-dev libncursesw5-dev

1.2 配置MMC分区支持

STM32MP157开发板通常使用MMC存储,默认的8个分区可能不够用。我们需要修改系统配置支持16个分区:

echo 'options mmc_block perdev_minors=16' | sudo tee /etc/modprobe.d/mmc_block.conf sudo update-initramfs -u

2. A7核开发环境搭建

STM32MP157的A7核用于运行Linux系统,我们需要安装ST提供的SDK来进行交叉编译和系统开发。

2.1 安装必备工具链

首先安装交叉编译所需的工具链和依赖包:

sudo apt install -y gcc-multilib build-essential chrpath socat cpio \ texinfo gawk diffstat unzip pylint3 pylint xz-utils debianutils \ iputils-ping python3-git python3-jinja2 libssl-dev bison flex \ g++ libyaml-dev libmpc-dev libgmp-dev u-boot-tools device-tree-compiler \ repo coreutils bsdmainutils sed curl bc lrzsz corkscrew cvs \ subversion mercurial nfs-common nfs-kernel-server libarchive-zip-perl \ dos2unix texi2html diffstat libxml2-utils

注意:在Ubuntu 20.04上,部分包名与旧版本不同。如果遇到找不到包的情况,可以尝试替换为python3-前缀的版本。

2.2 下载并安装SDK

从ST官网下载最新版SDK(当前版本为3.1.11):

mkdir -p ~/STM32MPU_workspace/tmp cd ~/STM32MPU_workspace/tmp wget https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-mpu-openstlinux-distribution/stm32mp1dev.html#getsoftware

下载完成后解压并安装:

tar xvf en.SDK-x86_64-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17.tar.xz ./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1.11-openstlinux-5.10-dunfell-mp1-21-11-17.sh

安装过程中会提示安装路径,建议使用默认的/usr/local/oecore-x86_64

2.3 配置环境变量

安装完成后,需要设置环境变量才能使SDK工具链生效:

. /usr/local/oecore-x86_64/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

为了使环境变量在每次打开终端时自动生效,可以将以下内容添加到~/.bashrc文件末尾:

# STM32MP1 SDK environment if [ -f /usr/local/oecore-x86_64/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi ]; then . /usr/local/oecore-x86_64/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi fi

2.4 验证SDK安装

执行以下命令验证SDK是否安装成功:

echo $ARCH # 应输出arm echo $CROSS_COMPILE # 应输出arm-ostl-linux-gnueabi- $CC --version # 应显示交叉编译器版本信息 echo $OECORE_SDK_VERSION # 应显示SDK版本号

如果一切正常,你将看到类似以下输出:

arm arm-ostl-linux-gnueabi- arm-ostl-linux-gnueabi-gcc (GCC) 9.3.0 3.1.11-openstlinux-5.10-dunfell-mp1-21-11-17

3. M4核开发环境搭建

STM32MP157的M4核通常用于实时任务处理,我们使用STM32CubeIDE进行开发。

3.1 安装STM32CubeIDE

从ST官网下载最新版STM32CubeIDE(当前版本为1.8.0):

cd ~/STM32MPU_workspace wget https://www.st.com/en/development-tools/stm32cubeide.html#get-software

下载完成后解压并安装:

unzip en.st-stm32cubeide_1.8.0_11526_20211125_0815_amd64.sh_v1.8.0.zip chmod +x st-stm32cubeide_1.8.0_11526_20211125_0815_amd64.sh ./st-stm32cubeide_1.8.0_11526_20211125_0815_amd64.sh

安装过程中会提示安装路径,建议使用默认的~/STM32CubeIDE

常见问题:如果在Ubuntu 20.04上运行安装程序时遇到GLIBC版本错误,可以尝试以下解决方案:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install -y libstdc++6

3.2 安装STM32CubeMP1 Package

STM32CubeMP1包含了M4核开发所需的驱动、中间件和示例代码。下载并解压到开发目录:

cd ~/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package wget https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32cube-mpu-packages/stm32cubemp1.html#getsoftware unzip en.STM32Cube_FW_MP1_V1-5-0_v1.5.0.zip

3.3 配置STM32CubeIDE工程

启动STM32CubeIDE并导入示例工程:

  1. 打开STM32CubeIDE
  2. 选择工作空间为~/STM32MPU_workspace
  3. 点击"File" → "Import" → "Existing Projects into Workspace"
  4. 浏览到~/STM32MPU_workspace/STM32MP15-Ecosystem-v3.1.0/Developer-Package/STM32Cube_FW_MP1_V1.5.0/Projects/STM32MP157C-DK2/Applications/OpenAMP/OpenAMP_TTY_echo/STM32CubeIDE
  5. 选择"OpenAMP_TTY_echo"工程并导入

4. 双核通信与调试

STM32MP157的最大特点就是A7和M4双核可以协同工作,通过OpenAMP框架实现核间通信。

4.1 配置OpenAMP环境

在STM32CubeIDE中,我们需要配置OpenAMP相关参数:

  1. 打开工程属性(右键工程 → Properties)
  2. 选择"C/C++ Build" → "Settings"
  3. 在"Tool Settings"选项卡中配置:
    • MCU GCC Compiler→ Preprocessor:添加USE_HAL_DRIVERSTM32MP157Cxx
    • MCU GCC Linker→ Libraries:添加openampmetal

4.2 建立双核通信

OpenAMP_TTY_echo示例工程已经实现了基本的核间通信功能。编译并下载到开发板后,可以通过串口终端测试:

  1. 连接开发板的串口到PC
  2. 打开终端工具(如minicom或picocom)配置波特率为115200
  3. 在终端中输入字符,M4核会将字符回显

调试技巧:如果通信不成功,可以检查以下方面:

  • 确保设备树中正确配置了RPMsg和Mailbox
  • 检查/sys/bus/rpmsg/devices/下是否有rpmsg设备节点
  • 使用dmesg | grep rpmsg查看内核日志中的相关消息

4.3 性能优化建议

当双核协同工作时,需要注意资源竞争和性能平衡:

  1. 内存分配:为M4核保留足够的内存空间,在设备树中配置reserved-memory节点
  2. 中断处理:将实时性要求高的中断分配给M4核处理
  3. 通信频率:合理控制核间通信频率,避免影响系统整体性能

5. 常见问题解决方案

在实际开发中,我遇到了许多官方文档没有提及的问题。以下是几个最常见的问题及其解决方法:

5.1 SDK安装失败

问题现象:执行SDK安装脚本时提示"Permission denied"或"Command not found"

解决方案

  1. 确保安装脚本有可执行权限:chmod +x *.sh
  2. 使用完整路径执行脚本:./path/to/script.sh
  3. 如果提示依赖缺失,根据错误信息安装相应包

5.2 CubeIDE无法识别开发板

问题现象:连接开发板后CubeIDE无法识别或下载失败

解决方案

  1. 检查USB连接是否正常,尝试更换USB线或端口
  2. 确保安装了正确的USB驱动:
    sudo apt install -y libusb-1.0-0-dev sudo cp ~/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.linux64_2.0.0.202111251410/tools/bin/49-stlinkv2-1.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules
  3. 重启CubeIDE和开发板

5.3 双核通信不稳定

问题现象:核间通信时断时续或数据错误

解决方案

  1. 检查共享内存区域是否正确定义和映射
  2. 确保双方使用相同的协议和数据结构
  3. 添加校验机制,如CRC校验或序列号
  4. 在通信关键点添加日志输出,便于定位问题

6. 进阶开发技巧

掌握了基础环境搭建后,下面分享几个提升开发效率的实用技巧:

6.1 使用VSCode作为辅助编辑器

虽然CubeIDE功能强大,但结合VSCode可以获得更好的代码编辑体验:

  1. 安装C/C++插件和STM32插件
  2. 配置include路径和宏定义:
    { "configurations": [ { "includePath": [ "${workspaceFolder}/**", "/usr/local/oecore-x86_64/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/include/**" ], "defines": [ "USE_HAL_DRIVER", "STM32MP157Cxx" ] } ] }
  3. 使用Remote-SSH插件进行远程开发

6.2 自动化构建脚本

为了提高效率,可以编写自动化构建脚本:

#!/bin/bash # Build A7 application source /usr/local/oecore-x86_64/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi cd ~/projects/a7_app make clean make # Build M4 application cd ~/projects/m4_app ~/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.linux64_2.0.0.202111241426/tools/bin/make clean ~/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.linux64_2.0.0.202111241426/tools/bin/make

6.3 性能监控工具

开发过程中可以使用以下工具监控系统性能:

  1. A7核:使用Linux自带工具如topvmstatperf
  2. M4核:使用STM32CubeMonitor工具实时监控运行状态
  3. 核间通信:通过/sys/kernel/debug/remoteproc//sys/kernel/debug/rpmsg/调试接口查看通信状态

在项目后期,我们团队发现M4核的实时性能对系统响应速度至关重要。通过优化内存访问模式和中断处理流程,最终将关键任务的延迟降低了30%。这种双核架构的优势在需要同时处理复杂UI和实时控制的场景中表现得尤为明显。

http://www.jsqmd.com/news/973170/

相关文章:

  • mysql之udf提权
  • OPRD:蒸馏不只学答案,还要偷看老师的“脑内活动“
  • mvc---- 前端校验
  • 计算机界的“高考“:软考高项是一场持久战
  • 从安装到实战:手把手教你用Nsight Systems (nsys) 优化一个向量加法CUDA程序
  • Unity游戏翻译神器:XUnity.AutoTranslator新手入门到精通
  • 深圳公明眼镜店哪个好
  • 2026年众智商学院400热线怎么核对?报名咨询和班期确认入口 - 众智商学院职业教育
  • Hadoop 3.x 数据安全实战:手把手教你配置HDFS透明加密与KMS(附避坑指南)
  • 哪家南昌全屋定制品牌靠谱?2026年6月推荐TOP5对比空间利用评测案例选择指南 - 品牌推荐
  • STC89C52等51单片机直连DHT22的可烧录工程合集(含DHT11/DHT21兼容代码)
  • 多维聚合实战:ROLAP下数据立方体的切片、钻取与动态计算
  • 2025-2026年北京管道疏通公司推荐:五大评测专业指南市政管网养护选择指南价格 - 品牌推荐
  • R语言实战:用lm()和手动计算两种方法搞定回归模型的MSE评估(附mtcars数据集案例)
  • 视频理解新范式:TimeSformer如何用‘分而治之’的注意力机制,在Something-Something数据集上超越CNN?
  • 这款免费AI工具,让你轻松成为编程大师
  • 从PCIe 5.0到SR-IOV:一张图看懂现代数据中心网卡的硬件虚拟化原理
  • 2026年石家庄空调移机公司推荐 大为搬家16年专业经验值得信赖 - 本地品牌推荐
  • 你的Docker容器初始化慢?可能是没搞懂/docker-entrypoint-initdb.d目录的正确用法
  • 中医粉常见八大逻辑误区 – 爱自然 爱科技
  • 千万不能错过!这家两联供产品厂家为何让同行都震惊了?
  • TensorFlow 2深度学习操作系统:从API调用到系统掌控
  • 2026 年五款免费 PDF 转换器无水印实测与选型指南
  • 给自动驾驶算法工程师的仿真利器:用MATLAB Simulink控制UE4虚拟环境完整流程
  • 从一次金额计算Bug说起:手把手教你用BigDecimal.compareTo()做安全的数值比较
  • 2026 安徽马鞍山市|本地人必选旧房改造・墙面刷新・局部装修 3 家正规企业精选 + 避坑攻略 - 本地便民网
  • 哪家北京房产纠纷律师靠谱?2026年6月推荐TOP5对比合同陷阱评测案例适用场景专业 - 品牌推荐
  • C51单片机驱动TM1628控制多位数码管的完整工程包(含Keil可编译源码与调试文件)
  • 打卡信奥刷题(3369)用C++实现信奥题 P9691 [GDCPC 2023] Base Station Construction
  • 从词性标注到命名实体识别:手把手教你用pyltp的Postagger和NamedEntityRecognizer构建信息提取小工具