保姆级教程:在Ubuntu 20.04上搞定STM32MP157的SDK安装与环境配置
保姆级教程Ubuntu 20.04下STM32MP157开发环境全栈配置指南当一块崭新的STM32MP157开发板摆在面前时80%的开发者会卡在环境配置的第一步。不同于传统MCU的简单IDE安装这款融合了Cortex-A7和M4内核的MPU需要更专业的工具链支持。本文将彻底解决从系统准备到SDK部署的12个关键痛点特别针对Ubuntu 20.04的LTS特性进行优化适配。1. 系统级准备构建稳定基础环境在Ubuntu 20.04上配置开发环境前需要特别注意这个LTS版本与Python 3.8的绑定关系。许多开发者遇到的第一个陷阱就是默认Python版本冲突# 强制设置python3为默认解释器 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1硬件支持包安装需要以下关键组件已排除所有非必要依赖包名称作用描述版本要求build-essential基础编译工具链≥ 12.4libncurses5-dev内核菜单配置界面支持≥ 6.2device-tree-compiler设备树编译工具≥ 1.5.1u-boot-toolsU-Boot镜像处理工具≥ 2020.04注意执行sudo apt update后若出现Release file expired错误需手动修改/etc/apt/sources.list中的archive.ubuntu.com为old-releases.ubuntu.com2. SDK安装的三大核心步骤2.1 工具链获取与验证从ST官网下载的SDK包通常命名为en.SDK-x86_64-stm32mp1-openstlinux-version.tar.xz使用以下命令验证下载完整性sha256sum en.SDK-*.tar.xz | grep -i 官方提供的校验值2.2 非交互式安装技巧通过添加-y参数实现无人值守安装chmod x *.sh ./st-image-*.sh -d ~/stm32mp1-sdk -y安装完成后检查关键目录结构~/stm32mp1-sdk/ ├── environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi ├── sysroots │ ├── cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi │ └── x86_64-ostl_sdk-linux └── version.txt2.3 环境变量永久化方案修改~/.bashrc实现环境变量持久化echo source ~/stm32mp1-sdk/environment-setup-* ~/.bashrc echo export PATH\$PATH:~/stm32mp1-sdk/sysroots/x86_64-ostl_sdk-linux/usr/bin ~/.bashrc验证工具链生效arm-ostl-linux-gnueabi-gcc --version3. 典型问题排查手册3.1 Python模块缺失错误当出现ImportError: No module named pexpect时python3 -m pip install --upgrade pip pip3 install pexpect jinja2 pyyaml3.2 库路径冲突解决如果遇到cannot find -lssl等链接错误export LD_LIBRARY_PATH~/stm32mp1-sdk/sysroots/x86_64-ostl_sdk-linux/usr/lib3.3 多版本工具链管理使用update-alternatives管理交叉编译器sudo update-alternatives --install /usr/bin/arm-linux-gcc arm-linux-gcc \ ~/stm32mp1-sdk/sysroots/x86_64-ostl_sdk-linux/usr/bin/arm-ostl-linux-gnueabi-gcc 1004. 开发实战从编译到部署4.1 裸机程序开发示例创建helloworld.c并编译#include stdio.h int main() { printf(STM32MP157 Cortex-A7\n); return 0; }编译命令arm-ostl-linux-gnueabi-gcc helloworld.c -o helloworld -static4.2 内核模块开发流程示例模块代码#include linux/module.h static int __init demo_init(void) { printk(MP1 module loaded\n); return 0; } module_init(demo_init);对应的Makefileobj-m : demo.o KDIR : ~/linux-stm32mp-5.10.61 all: make -C $(KDIR) M$(PWD) modules4.3 设备树覆盖技术创建stm32mp157c-myboard.dts/dts-v1/; #include stm32mp157.dtsi / { my_device { compatible custom,device; status okay; }; };编译命令dtc -I dts -O dtb -o stm32mp157c-myboard.dtbo stm32mp157c-myboard.dts开发板上加载覆盖mkdir /configfs mount -t configfs none /configfs mkdir /configfs/device-tree/overlays/myboard cat stm32mp157c-myboard.dtbo /configfs/device-tree/overlays/myboard/dtbo