2. 开发环境搭建与交叉工具链

STM32MP 系列属于异构多核处理器:Cortex-A7 运行 Linux,Cortex-M4 运行实时固件。这种架构决定了开发主机不能像单片机开发那样“装个 IDE 就能跑”,而必须建立一套以 Ubuntu 为宿主、以交叉工具链为核心、以 Yocto/OpenSTLinux SDK 为系统镜像来源的完整环境。本节围绕这条主线,把主机配置、工具安装、SDK 使用和串口/网络调试环境一次讲清。

一、Ubuntu 开发主机的基础配置

官方推荐 Ubuntu 20.04 LTS 或 22.04 LTS,64 位,磁盘建议预留 120 GB 以上(Yocto 构建缓存非常占空间),内存 8 GB 起步、16 GB 更稳妥。先安装编译与构建依赖:

sudo apt update
sudo apt install -y build-essential git python3 python3-pip \
  gawk wget diffstat unzip texinfo gcc-multilib chrpath socat \
  cpio file zstd libssl-dev bc flex bison libncurses5-dev \
  libncursesw5-dev rsync locales
sudo locale-gen en_US.UTF-8

Yocto 对区域设置敏感,若 locale 未生成 en_US.UTF-8,构建时会出现字符编码相关报错。此外,串口调试需要把当前用户加入 dialout 组,否则访问 /dev/ttyUSB0 会提示权限不足:

sudo usermod -aG dialout $USER
# 重新登录后生效,可用 groups 命令确认

二、STM32CubeIDE 与 STM32CubeProgrammer

STM32CubeIDE 用于 Cortex-M4 固件开发与调试,STM32CubeProgrammer 用于烧写 eMMC/SD 卡中的系统镜像以及通过 UART/USB 进入 DFU 模式。两者都从 ST 官网下载 Linux 版本,解压后运行安装脚本即可:

tar -xzf en.st-stm32cubeide_*.tar.gz
cd st-stm32cubeide_*/
sudo ./st-stm32cubeide_*.sh

CubeProgrammer 安装后需把 bin 目录加入 PATH,并安装 udev 规则,否则 ST-LINK 与 DFU 设备无法被识别:

echo 'export PATH=$PATH:/opt/st/stm32cubeide_1.x/plugins/.../tools/bin' >> ~/.bashrc
sudo cp /path/to/STM32CubeProgrammer/bin/*.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger

验证方式:连接开发板 USB OTG 口,执行 STM32_Programmer_CLI -l usb,若列出 STM32MP15xx 设备即表示驱动与权限正常。

三、Yocto / OpenSTLinux SDK 与交叉工具链

交叉工具链的本质是“在 x86_64 主机上生成 ARM 目标代码”。OpenSTLinux 提供两种获取方式:一是直接下载官方预编译 SDK 安装包(.sh 自解压),二是用 Yocto 从源码构建。前者适合快速上手,后者适合需要裁剪内核或添加自定义配方(recipe)的场景。

# 方式一:安装预编译 SDK
./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-*.sh
source /opt/st/stm32mp1/4.x-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

# 验证
echo $CC
arm-ostl-linux-gnueabi-gcc --version

执行 environment-setup-* 脚本后,环境变量 CC、CXX、CFLAGS、SYSROOT 会被自动设置,此时直接 make 或 cmake 就会调用交叉编译器。注意:不要在同一个终端里混用主机 gcc 与交叉 gcc,建议为交叉编译单独开一个终端,或写一个 env.sh 脚本每次 source。

若选择 Yocto 构建,典型流程是:

git clone https://github.com/STMicroelectronics/oe-manifest.git
cd oe-manifest
repo init -u https://github.com/STMicroelectronics/oe-manifest.git -b refs/tags/openstlinux-5.15
repo sync
DISTRO=openstlinux-weston MACHINE=stm32mp1 source layers/meta-st/scripts/envsetup.sh
bitbake st-image-weston

首次构建通常需要数小时,产物位于 tmp-glibc/deploy/images/stm32mp1/,其中 .wic 是可直接烧写到 SD 卡或 eMMC 的完整镜像,FlashLayout 目录下的 .tsv 文件则配合 CubeProgrammer 使用。

Ubuntu 开发主机 (x86_64) 交叉工具链 (SDK) arm-ostl-linux-gnueabi-gcc CC / CXX / SYSROOT 环境变量 STM32CubeIDE Cortex-M4 固件 编译 / 调试 CubeProgrammer 镜像烧写 / DFU UART / USB / ST-LINK Yocto / OpenSTLinux bitbake st-image-weston 产出 .wic 镜像 + FlashLayout .tsv 串口与网络调试环境 minicom / picocom → /dev/ttyUSB0 115200 SSH / NFS / TFTP → 以太网调试 用户需加入 dialout 组 STM32MP1 目标板 Cortex-A7 (Linux) OpenSTLinux / Weston eMMC / SD 卡启动 运行 HMI 应用与系统服务 Cortex-M4 (RTOS) 实时控制 / 外设驱动 通过 IPCC 与 A7 通信 CubeIDE 编译调试 调试与烧写接口 UART4 (ST-LINK VCP) → 控制台 USB OTG → DFU 烧写 以太网 → SSH / NFS ST-LINK → SWD 调试 M4 交叉编译 M4 固件 镜像烧写 串口/网络 IPCC

四、串口与网络调试环境

串口是嵌入式开发最可靠的“生命线”。开发板上电后,U-Boot 和内核日志都从 UART4 输出,默认波特率 115200、8N1。主机端推荐使用 picocom 或 minicom:

# 查看串口设备
ls /dev/ttyUSB* /dev/ttyACM*
# 使用 picocom 连接
picocom -b 115200 /dev/ttyUSB0
# 退出:Ctrl+A 然后 Ctrl+X

若看到连续的 U-Boot SPL 或 NOTICE: CPU: STM32MP157FAC 字样,说明串口链路正常。网络调试方面,建议给开发板配置静态 IP 或通过 DHCP 获取地址后,用 SSH 登录:

# 开发板端(通过串口登录后)
ip addr add 192.168.1.100/24 dev eth0
ip link set eth0 up
# 主机端
ssh root@192.168.1.100

NFS 挂载可以避免反复烧写根文件系统,适合应用层快速迭代:

# 主机端导出
echo "/srv/nfsroot *(rw,sync,no_root_squash)" | sudo tee -a /etc/exports
sudo exportfs -ra
# 开发板端挂载
mount -t nfs 192.168.1.10:/srv/nfsroot /mnt
环境验证清单:① arm-ostl-linux-gnueabi-gcc --version 能输出版本号;② STM32_Programmer_CLI -l usb 能识别设备;③ 串口能打印 U-Boot 日志;④ 开发板能 ping 通主机;⑤ SSH 能登录。五项全部通过,说明开发环境已具备完整的“编译—烧写—调试—部署”能力。
常见坑:Yocto 构建时若报 Please use a locale setting which supports UTF-8,需检查 locale 输出并重新生成;若 CubeProgrammer 报 USB device not found,优先检查 udev 规则是否加载、当前用户是否在 plugdev 组;若交叉编译时链接报 cannot find -lxxx,通常是 SYSROOT 未正确设置,重新 source 环境脚本即可。