2. 开发环境搭建与交叉工具链
STM32MP 系列(如 STM32MP157、STM32MP135)属于异构多核处理器:Cortex-A7/A35 运行 Linux,Cortex-M4/M33 运行裸机或 RTOS 固件。这种架构决定了开发主机不能只装一个本地编译器,而必须建立一套“宿主机—交叉工具链—目标板”的完整链路。本节围绕 Ubuntu 开发主机配置、STM32MP 官方 SDK 安装、ARM 交叉编译器、调试工具以及串口与网络连接配置展开,目标是让读者能够从零搭建出一台可编译、可下载、可调试 STM32MP 的 Linux 开发主机。
一、Ubuntu 开发主机的选择与基础配置
ST 官方推荐使用 Ubuntu 20.04 LTS 或 22.04 LTS 作为开发主机,原因是 SDK 中的脚本、依赖包和 Yocto 构建环境在这些版本上验证最充分。建议主机配置为:CPU 4 核以上、内存 16 GB 以上、磁盘预留 200 GB 以上(Yocto 构建 OpenSTLinux 时中间产物较大)。若使用虚拟机,需开启虚拟化加速,并确保 USB 直通可用,以便串口和 ST-LINK 被虚拟机识别。
基础依赖安装是后续所有步骤的前提。以下命令安装编译、打包、设备树编译和调试所需的核心工具:
sudo apt update
sudo apt install -y build-essential git python3 python3-pip \
gawk wget diffstat unzip texinfo gcc-multilib \
chrpath socat cpio flex bison libssl-dev \
libncurses5-dev libncursesw5-dev libelf-dev \
minicom picocom screen net-tools openssh-server \
gdb-multiarch device-tree-compiler
其中 gcc-multilib 用于兼容 32 位构建依赖,device-tree-compiler 提供 dtc 用于设备树反编译与检查,gdb-multiarch 是后续跨架构调试的关键。安装完成后可用 git --version、dtc --version 验证。
二、STM32MP 官方 SDK 的获取与安装
ST 为 STM32MP 提供两类 SDK:一类是 OpenSTLinux SDK(含交叉工具链、sysroot、Qt/GTK 等库),用于应用与内核模块开发;另一类是 STM32CubeProgrammer,用于通过 USB/串口烧录镜像。OpenSTLinux SDK 可从 ST 官网下载对应版本的安装包,例如 en.SDK-x86_64-stm32mp1-openstlinux-6.1-yocto-mickledore-x86_64-toolchain-5.0.0.sh。
安装时建议指定独立目录,避免污染系统路径:
chmod +x en.SDK-x86_64-stm32mp1-*.sh
./en.SDK-x86_64-stm32mp1-*.sh -d /opt/st/stm32mp1/5.0.0
source /opt/st/stm32mp1/5.0.0/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
执行 source 后,环境变量 CC、CXX、SDKTARGETSYSROOT 会被自动设置。可用 echo $CC 查看交叉编译器路径,用 $CC --version 确认版本。注意:每次新开终端都需要重新 source,建议写入 ~/.bashrc 或使用独立脚本管理。
三、ARM 交叉编译器与调试工具
交叉编译器的核心作用是“在 x86_64 主机上生成 ARM 目标代码”。OpenSTLinux SDK 内置的是 arm-ostl-linux-gnueabi-gcc,针对 Cortex-A7 带 NEON 与硬浮点。编译一个简单程序验证:
$CC hello.c -o hello
file hello
# 输出应包含: ELF 32-bit LSB executable, ARM, EABI5
若 file 显示 ARM 架构,说明交叉编译链路正常。调试工具方面,目标板运行 gdbserver,主机使用 gdb-multiarch 连接:
# 目标板
gdbserver :1234 ./hello
# 主机
gdb-multiarch ./hello
(gdb) target remote 192.168.1.100:1234
(gdb) continue
对于 Cortex-M4 固件,则使用 ST-LINK 配合 OpenOCD 或 STM32CubeIDE 调试。主机需安装 openocd 与 stlink-tools,通过 openocd -f interface/stlink.cfg -f target/stm32mp1x.cfg 启动调试服务。
四、串口与网络连接配置
串口是 STM32MP 启动阶段最重要的观察窗口。开发板通常通过 USB Type-C 或 micro-USB 提供 ST-LINK 虚拟串口,Linux 下识别为 /dev/ttyACM0。使用 minicom 连接:
sudo minicom -D /dev/ttyACM0 -b 115200
若权限不足,可将用户加入 dialout 组:sudo usermod -aG dialout $USER,重新登录后生效。串口参数固定为 115200-8-N-1,无流控。上电后应能看到 U-Boot 与内核启动日志。
网络连接推荐两种方式:一是通过板载以太网口连接路由器,使用 DHCP 获取 IP;二是通过 USB RNDIS/CDC 虚拟网卡与主机直连。以 USB 虚拟网卡为例,主机侧会出现 usb0 接口,配置静态地址:
sudo ip addr add 192.168.7.1/24 dev usb0
sudo ip link set usb0 up
ssh root@192.168.7.2
目标板默认 IP 常为 192.168.7.2,主机为 192.168.7.1。使用 ping 与 ssh 验证连通性后,即可通过 scp 传输编译产物,或使用 NFS 挂载根文件系统加速开发迭代。
五、常见问题与验证要点
搭建过程中最容易出现三类问题。第一类是串口无输出:先确认 /dev/ttyACM* 是否存在,再检查波特率与流控,最后确认板子是否真正上电启动。第二类是交叉编译报错“找不到头文件”:通常是忘记 source environment-setup-*,或 SDKTARGETSYSROOT 未生效,可用 echo $SDKTARGETSYSROOT 检查。第三类是 SSH 连不上:先用 ping 确认网络层,再检查目标板 sshd 是否运行,最后确认主机与目标板是否在同一网段。
env.sh 脚本,把 SDK 的 source 命令、常用别名(如 alias scp-target='scp -r ./bin root@192.168.7.2:/opt/app')集中管理,每次打开终端执行一次即可,避免重复输入长路径。