搭建知睿 STM32MP135 的交叉编译环境

张开发
2026/4/16 19:18:55 15 分钟阅读

分享文章

搭建知睿 STM32MP135 的交叉编译环境
前言过程思路很简单核心就是先配好环境然后做交叉编译最后用 U 盘把编译完的文件放进文件导入到板子里面运行但是作为新手还是稍微记录一下~环境主机系统Win11虚拟机VMware® Workstation Pro 25H2u1 25.0.1.25219725LinuxUbuntu 24.04.4 LTS开发板知睿-MP135-嵌入式学习系统 STM32MP135板载系统Buildroot 2022.02.3配置交叉编译器准备工作根据《知睿-MP135-嵌入式学习系统—实验指南》先装上各种依赖库和常用工具sudoaptupdatesudoaptinstallgawkwgetgitdiffstatunziptexinfo gcc-multilib chrpath socat cpio python3 python3-pip python3-pexpect libssl-dev libgmp-dev libmpc-dev lz4 zstdsudoaptinstallbuild-essential libncurses-dev libyaml-dev libssl-devsudoaptinstallcoreutils bsdmainutilssedcurlbclrzsz corkscrew cvs subversion mercurial nfs-common nfs-kernel-server libarchive-zip-perl dos2unix texi2html libxml2-utils然后根据文档必须安装其他配置才能支持每个 MMC 最多 16 个分区。 默认情况下在 Linux 系统上MMC 上最多允许 8 个分区。 所有软件包入门软件包等都需要 10 个以上的分区供存储设备使用。为了将每个设备的分区数扩展到 16必须将以下选项添加到 modprobeechooptions mmc_block perdev_minors16/tmp/mmc_block.confsudomv/tmp/mmc_block.conf /etc/modprobe.d/mmc_block.conf然后下载 SDKen.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz在 Linux 系统中解压注意不要直接在共享文件夹解压。下载SDK安装 SDK解压 SDK然后一路点进去找到脚本st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh开权限运行脚本设定好你想要放 SDK 的路径——当然就按照他的默认路径也行记得提前记录一下他的路径然后等他解压。安装成功后进入 SDK 的安装路径应该会看到这些文件environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi site-config-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi sysroots version-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi之后安装包就没用了可以删了省空间。配置 SDK 环境SDK 的路径下其中一个文件看开头叫做 environment-setup这就是初始化环境所需要的文件。在这个文件夹下启动命令行开始敲命令source./environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi然后检查一下各个变量看看有没有成功$echo$ARCHarm $echo$CROSS_COMPILEarm-ostl-linux-gnueabi- $echo$CCarm-ostl-linux-gnueabi-gcc-mthumb-mfpuneon-vfpv4 -mfloat-abihard-mcpucortex-a7--sysroot/opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi $$CC--versionarm-ostl-linux-gnueabi-gcc(GCC)9.3.0 Copyright(C)2019Free Software Foundation, Inc. This isfreesoftware;see thesourceforcopying conditions. There is NO warranty;not evenforMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.CC 是什么是 Cross-Compiler交叉编译器记住后面要考哦这样我们在同一个控制台中就可以编译文件了。注意我们每次要启动交叉编译的时候都要重复这个步骤——这么看这个流程还是太麻烦了也许我们可以稍微简化一下。可以用符号链接在自己平时的工作区做一个快捷方式语法ln-s[link-target][link-name]比如在我的工作区ln-s/opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24 /home/felix/embedded/sdk-base这样我们在上一级目录可以直接用符号链接等效地进入前面那一堆乱七八糟的路径。还可以给那个 setup 脚本做个副本取一个简单的名字——直接 cp 一下就好了。注意如果不是在 home要有管理员权限sudocpenvironment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi setup然后下次启动 SDK 就简单了直接用快捷方式简化比如从符号链接的上一层开始cdsdk-basesource./setup就能够成功启动环境了。交叉编译然后我们准备一个 C 语言的 demo比如 hello world然后启动 SDK按照 gcc 的语法开始编译$CC-g/your/src/dir/hello.c-o/your/target/dir/hello控制台没有输出目标路径生成文件那就是成功了至此SDK 中的交叉编译就已经完成了我们有了一个可以在板子上运行的二进制可执行文件。minicom 配置在开启串口前首先把 brltty 卸载掉否则看不到我们需要的设备然后安装 minicomsudoaptremove brlttysudoaptinstallminicom卸载 brltty 之后要重启一下 Linux。然后我们把有串口的 USB 线从板子引出来连接电脑接入虚拟机紧接着查一下/dev路径看看有没有名称中包含 USB 的设备检查电脑是否识别到串口ls/dev|grepUSB如果查到了ttyUSB0或者其他数字那就是连上了这时候就可以管理员启动 minicom连接板子sudominicom-D/dev/ttyUSB0默认的比特率是 115200我在跑的时候也是115200不用给参数就能连上如果要换其他比特率就加上-b 9600。如果到这里一切正常应该就能在串口中与板子的命令行交互了。导入文件U盘法这个是我最开始尝试成功的。准备一个U盘确定这个U盘的文件系统是 FAT32可以在主机上查看属性如果不是的话去问问 AI 看看对应的兼容性和命令然后把刚才编译好的可执行文件拷贝进去然后把U盘插进板子。如果仔细观察板子的/dev能够注意到插入U盘的时候会出现 sdasda1 ——这就是U盘对应的设备。接下来把他挂载到系统中。注意接下来的操作都是通过串口在从机上操作的。首先创建一个拿来挂载用的路径mkdir-p/mnt/udisk-p的含义自己去查感觉是挺有用的然后把 sda1 挂载到刚才做好的路径下mount-tvfat /dev/sda1 /mnt/udisk如果没有报错就是成功了接下来可以 cd 进挂载好的路径ls 一下看看能不能读到U盘中的文件。如果一切正常就可以试着跑一下。在嵌入式平台中建议不用exec启动可执行文件直接用文件名运行就好比如./hello_arm如果一切顺利的话——文本发送法对于我们用来demo的这种小文件这个方法会快很多。思路就是把整个可执行文件变成一大串字符串通过串口方便地发送到从机然后再转回文件。在主机上把编译好的可执行文件转化为 base64 编码输出到文件中base64 hellohello_base64注意接下来的操作都是通过串口在从机上操作的。然后打开文件把这堆代码复制一下接着进入串口把这堆文字发送到从机上。这段文字包含了换行因此最好的方法是用 catcatEOFhello_base64这个 EOF 是指定的文件末尾标记把刚才的那一堆文字复制进来最后一行写上 EOF这样刚才的字符串就成功保存到从机上的文件里面了。紧接着解码重新生成可执行文件给权限base64-dhello_base64hellochmodx hello然后同上一个方法运行即可是激动人心的hello world补网络 NFS 法这个方法也非常快但是绕了很久而且网络协议我不了解就做个简单的记录。用网线连接板子和电脑然后先去 VMWare 的 Edit - Virtual Network Editor进入编辑然后把桥接的那一个选项删掉比如 VMnet0重新建立在直连的对象中找到疑似网口的选项选中保存然后去虚拟机设置里面也把桥接设置好当然可以多开一个 NAT 保证联网。然后去串口中查一下板子的 IPipaddr然后进入虚拟机进入到网络的设置界面。我的 Ubuntu 可以建立多个预设因此新建一个预设把 IP 设置成和板子前三位相同的固定值比如192.168.1.66子网掩码照常255.255.255.0网关和IP前三个数字相同最后一位是1比如192.168.1.1。这些设置完成后插上网线如果系统显示正常就可以用从机 ping 一下虚拟机了。接着在主机上确定 NFS 共享的文件夹。首先安装nfs-kernel-server然后创建好文件夹开777权限然后去/etc/exports里面加一句/dir/to/folder *(rw,sync,no_root_squash,no_subtree_check)具体怎么设置权限自行查命令。然后加载配置重启服务exportfs 应该能查到你刚才的设置项sudoexportfs-arvsudosystemctl restart nfs-kernel-server然后关掉防火墙如果一股脑全关掉就是sudo ufw disable想要细化可以以后再说。接着去/etc/nfs.conf中解除掉这句注释[nfsd] ... vers4y到这步之后上位机的权限就放开了进行一轮重启sudosystemctl restart rpcbindsudosystemctl restart rpc-statdsudosystemctl restart nfs-server然后去下位机创建好文件夹跑命令mount-tnfs-overs4192.168.1.66:/home/felix/embedded/board /mnt/nfs正常的话这里应该就可以完成文件夹的共享了。由于我进行了大量的回档因此这些记录可能不全面仅做记录。总结思路很清晰配置交叉编译环境与下位机建立通讯把文件发送过去能这么轻松从机上自己的标准化 Linux 环境还是立了大功的。流程挺长的但是上板子毕竟还是和在模拟空间里面跑不一样更有乐趣了毕竟这样就可以在板子里面大闹天宫了嘛bushi

更多文章