news 2026/6/22 12:13:29

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:在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和实时控制的场景中表现得尤为明显。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 6:28:18

向量搜索在RAG中的核心作用与实战避坑指南

1. 这不是“加个向量库”就完事的黑盒子——RAG和生成式AI里,向量搜索到底在替你扛什么活?你肯定见过这样的场景:给大模型喂了一堆PDF、Excel、内部文档,再问“上季度华东区销售Top3产品是什么”,它居然能精准定位到某…

作者头像 李华
网站建设 2026/6/14 6:28:19

中医粉常见八大逻辑误区 – 爱自然 爱科技

中医粉常见八大逻辑误区 引言 b 站可以去找这个视频,我是把内容提取出来,方便文字阅读。 你有没有这种感觉 —— 每次在家族群里聊到中医,总有人跳出来说:“中医传承五千年,老祖宗的东西能有错?” “我邻居…

作者头像 李华
网站建设 2026/6/14 6:28:16

Flutter Android 打包完全指南

Flutter Android 打包完全指南 Flutter Android打包虽然比iOS简单,但也有不少坑。这篇文章我把Android打包讲透,包括签名配置、生成APK/AAB、上传Google Play、常见错误。 Android打包流程概述 配置应用基本信息(包名、版本号等) 生成签名证书(keystore) 配置gradle签名…

作者头像 李华
网站建设 2026/6/14 6:33:22

别再死记硬背了!用‘放回取球’和‘不放回取球’彻底搞懂马尔可夫链的‘无记忆性’

从袋中取球实验看马尔可夫链的无记忆性本质 1. 概率论中的两种经典实验设计 概率论初学者常常会遇到两类看似相似、实则本质迥异的实验场景—— 放回取球 与 不放回取球 。这两种实验设计在数学建模中代表着完全不同的随机过程特性,尤其对理解马尔可夫链的&quo…

作者头像 李华