第 2 章:全能开发环境与交叉编译工具链构建

在第一章中,我们理解了 M33 领航的硬件逻辑。现在,我们要搭建一套工业级的开发环境。

对于 STM32MP257 这种异构芯片,最忌讳的是在 Windows 下点点鼠标。因为后续的 Linux 内核编译、设备树修改、Yocto 镜像构建都必须在 Linux 环境下完成。为了保证 M33 代码和 A35 系统的无缝衔接,本章我们将手把手完成 Ubuntu 开发主机的配置。


2.1 宿主机环境准备

推荐使用 Ubuntu 22.04 LTS。你需要确保至少有 100GB 的磁盘空间(后续编译 Linux 内核和文件系统非常耗空间)。

1. 安装基础构建工具

sudo apt-get update

sudo apt-get install -y build-essential libncurses5-dev gawk git flex bison \

openssl libssl-dev tree u-boot-tools device-tree-compiler python3-pip

2.2 双架构编译器安装

这是异构开发的核心:我们需要两套不同的编译器。

1. M33 核心编译器 (Bare-metal)

针对 Cortex-M33 (ARMv8-M 架构),我们使用 arm-none-eabi-gcc

安装 GNU Arm Embedded Toolchain

sudo apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi

验证版本

arm-none-eabi-gcc --version

2. A35 核心编译器 (Linux)

针对 Cortex-A35 (64位 ARMv8-A 架构),我们使用 aarch64-linux-gnu-gcc

sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

验证版本

aarch64-linux-gnu-gcc --version

2.3 获取官方软件开发包 (SDK)

ST 为 MP257 提供了两套关键资源:

  1. STM32CubeMP2 Package:主要包含 M33 的 HAL 库、示例代码和底层驱动。

  2. OpenSTLinux SDK:包含 A35 侧的交叉编译环境、内核源码和文件系统。

实战操作: 从 ST 官网下载 en.stm32cubemp2-v1-1-0.zip(版本随时间更新),解压至 ~/STM32MP257_Project/Drivers/


2.4 深度实战:编写通用 Makefile 模版

既然要脱离 IDE 的束缚,我们需要一个强大的 Makefile。这个 Makefile 要能处理 M33 的启动文件、HAL 库以及你写的 main.c

在你的工程根目录下创建 Makefile,核心逻辑如下:

编译器设置

CC = arm-none-eabi-gcc

OBJCOPY = arm-none-eabi-objcopy

CPU 参数:Cortex-M33, 启用硬件浮点运算

CPU = -mcpu=cortex-m33 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16

宏定义

DEFS = -DSTM32MP257xx -DUSE_HAL_DRIVER

包含路径(指向你解压的 HAL 库)

INCLUDES = -I./Inc -I../Drivers/CMSIS/Device/ST/STM32MP2xx/Include \

-I../Drivers/STM32MP2xx_HAL_Driver/Inc

编译选项

CFLAGS = (CPU) (DEFS) $(INCLUDES) -O2 -Wall -fdata-sections -ffunction-sections

链接脚本

LDSCRIPT = STM32MP257F_M33_FLASH.ld

LDFLAGS = (CPU) -T(LDSCRIPT) -Wl,--gc-sections --specs=nano.specs

构建目标

all: project.bin

project.elf: main.o startup_stm32mp2xx.o

(CC) ^ (LDFLAGS) -o @

%.bin: %.elf

(OBJCOPY) -O binary < $@

clean:

rm -f *.o *.elf *.bin

2.5 关键配置:STM32Header 签名工具

这是 MP257 跑起来的终极秘籍 。STM32MP2 的 ROM Code 不识别裸的 .bin 文件。它要求文件头部必须有一个 STM32 Image Header

你需要使用 ST 提供的 STM32ImageAdd.py 脚本或 STM32CubeProgrammer 命令行工具来生成带头的镜像。

命令示例:

生成符合 MP25 启动协议的镜像 (针对 M33)

./STM32ImageAdd.py -i project.bin -o project.stm32 -t m33 -a 0x0E000000 -e 0x0E000000

  • -a: 镜像加载到内存的起始地址。

  • -e: 程序入口地址(Reset_Handler 的地址)。


2.6 Deploy:如何将固件部署到开发板?

在开发板还没跑 Linux 之前,我们主要通过以下两种方式部署:

  1. STM32CubeProgrammer (USB/UART) :将拨码开关拨至 000 (Recovery 模式) ,通过 Type-C 接口直接将 .stm32 镜像烧录进 SRAM 或 SD 卡。

  2. SD 卡手工部署 :如果你已经有一张现成的 OpenSTLinux 启动卡,你可以使用 dd 命令将 M33 的固件写入对应的 fsbl1fsbl2 分区。


2.7 避坑指南 (Debug Tips)

  • 问题 :编译报 Interrupt handler 找不到。

    • 解决 :检查汇编启动文件 .s 中的向量表命名是否与 C 代码中的 EXTI_IRQHandler 一致。
  • 问题arm-none-eabi-gcc 找不到。

    • 解决 :确保你执行了 export PATH=$PATH:/opt/gcc-arm-none-eabi/bin,或者将其写入 ~/.bashrc

总结: 到这一步,你已经拥有了一个完全自主可控的开发环境。你可以编译出带签名的 M33 固件,并知道如何将它送入开发板。

相关推荐
_探索_1 小时前
STM32U5F7VJT6Q (Cortex-M33, 160MHz) TouchGFX统计MCU占用率和FPS
stm32·单片机·嵌入式硬件
浩子智控1 小时前
zynq嵌入式开发(2)—基本开发测试实例
linux·嵌入式硬件·硬件架构
猫猫的小茶馆2 小时前
【Linux 驱动开发】Linux 内核启动过程详解
linux·c语言·arm开发·驱动开发·stm32·单片机·mcu
蜕变的小白2 小时前
Linux系统编程-->UDP编程:C/S模型实战详解
linux·运维·网络协议·udp
辰哥单片机设计2 小时前
STM32太阳能光伏板
stm32·单片机·嵌入式硬件
新缸中之脑2 小时前
Pinchtab: 通过 HTTP 控制浏览器
网络·网络协议·http
mftang2 小时前
MCU上应用的主流NVM技术: 嵌入式相变存储器(PCM) 和嵌入式磁阻随机存取存储器(MRAM)
单片机·嵌入式硬件·pcm
wangan0942 小时前
浏览器自动将http访问链接自动转化为https链接,解决办法
网络·网络协议·http
炸膛坦客2 小时前
Cortex-M3-STM32F1 开发:(五十四)CAN(车企会用),难但很重要
stm32·单片机·嵌入式硬件
willhuo2 小时前
RS485回响程序设计方案
单片机·lua