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 使用。
四、串口与网络调试环境
串口是嵌入式开发最可靠的“生命线”。开发板上电后,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 能登录。五项全部通过,说明开发环境已具备完整的“编译—烧写—调试—部署”能力。
Please use a locale setting which supports UTF-8,需检查 locale 输出并重新生成;若 CubeProgrammer 报 USB device not found,优先检查 udev 规则是否加载、当前用户是否在 plugdev 组;若交叉编译时链接报 cannot find -lxxx,通常是 SYSROOT 未正确设置,重新 source 环境脚本即可。