MPU
什么是MPU
MPU(Microprocessor Unit,微处理器单元)是现代计算机系统的运算核心。与传统的单片机不同,它的设计初衷是追求强大的性能,专门用于处理复杂的算法和应对多任务并发的场景。
MPU的技术特征
- 高性能计算能力:为复杂的算法和数据处理提供了充足的算力支持。
- 多任务处理:能够高效地同时运行多个任务,是运行操作系统(如Linux)的基础。
- 外部扩展性:MPU通常不集成或只集成少量存储器,需要外接RAM、Flash等来构建完整的系统,这带来了更高的设计灵活性。
- 灵活的系统架构:开发者可以根据具体的应用需求(性能、接口、成本)来搭配不同的外围芯片。
- 丰富的指令集:支持更复杂的编程模型和软件生态。
MPU与CPU、MCU的区别
概念比较
| 特性 |
CPU |
MPU |
MCU |
| 定义 |
中央处理单元,计算机的运算和控制核心 |
微处理器单元,包含CPU核心的芯片 |
微控制器单元,集成CPU、存储器和外设 |
| 组成 |
仅包含处理核心 |
CPU + 基本接口 |
CPU + 存储器 + 外设 |
| 存储器 |
需要外部存储器 |
需要外部存储器 |
内置Flash和RAM |
| 外设 |
需要外部外设 |
需要外部外设 |
内置丰富外设 |
| 性能 |
高性能 |
高性能 |
中等性能 |
| 功耗 |
高功耗 |
中等功耗 |
低功耗 |
| 成本 |
高成本 |
中等成本 |
低成本 |
| 开发复杂度 |
高 |
中等 |
低 |
应用场景对比
CPU应用场景
- 服务器:数据中心、云计算
- 工作站:高性能计算、图形设计
- 桌面电脑:办公、娱乐、游戏
MPU应用场景
- 嵌入式系统:需要高性能的嵌入式应用,如工业HMI、高级网关。
- 工业控制:复杂的工业自动化系统。
- 网络设备:路由器、交换机等需要处理TCP/IP协议栈的设备。
- 汽车电子:ADAS(高级驾驶辅助系统)、车载娱乐系统。
MCU应用场景
- 家电控制:洗衣机、空调、冰箱的简单逻辑控制。
- 传感器节点:物联网终端设备,负责数据采集和上传。
- 简单控制:LED调光、电机驱动等实时性要求高的场景。
- 消费电子:遥控器、电子玩具等低成本设备。
如何选择
选择MPU的情况
- 需要高性能计算:运行人脸识别、音视频编码等复杂算法。
- 多任务处理:需要运行Linux、Android等完整的操作系统来管理多个应用和服务。
- 丰富的外设接口:项目需要连接多种外部设备,如显示器、摄像头、高速以太网等。
- 网络功能:设备需要作为网络节点,具备完整的TCP/IP协议栈支持。
- 图形处理:需要显示复杂的用户界面或进行图像处理。
选择MCU的情况
- 成本敏感:对物料成本有非常严格的控制要求。
- 功耗要求:设备由电池供电,需要极低的运行功耗和待机功耗。
- 简单控制:功能相对固定和简单,逻辑不复杂。
- 实时性要求:需要确定性的、微秒级的实时响应,例如电机控制。
STM32MP系列MPU
STM32MP131/133概述
STM32MP131和STM32MP133是意法半导体(STMicroelectronics)推出的高性能MPU产品。它们基于广为人知的ARM Cortex-A7架构,专门为那些需要平衡性能、功耗和成本的嵌入式应用而设计。
STM32MP131特性
- CPU核心:单核ARM Cortex-A7 @ 800MHz
- 内存:支持DDR3/DDR3L/LPDDR2/LPDDR3
- 外设接口:丰富的GPIO、UART、SPI、I2C等
- 图形处理:2D图形加速器
- 安全特性:硬件加密引擎、安全启动
STM32MP133特性
- CPU核心:双核ARM Cortex-A7 @ 800MHz
- 内存:支持DDR3/DDR3L/LPDDR2/LPDDR3,最大支持1GB
- 外设接口:与MP131相同,包含USB、以太网、CAN等
- 图形处理:3D图形加速器(GPU),支持OpenGL ES 2.0
- 安全特性:增强的安全功能,包括硬件加密、安全启动
- 实时性:支持实时操作系统(RTOS)和Linux双系统运行
- 功耗管理:多种低功耗模式,支持动态电压频率调节
系统架构
整体架构图
┌─────────────────────────────────────────┐
│ 应用层 (Linux/Android) │
├─────────────────────────────────────────┤
│ 中间件层 │
├─────────────────────────────────────────┤
│ 硬件抽象层 (HAL) │
├─────────────────────────────────────────┤
│ ARM Cortex-A7 核心 │
├─────────────────────────────────────────┤
│ 内存控制器 + 外设控制器 │
├─────────────────────────────────────────┤
│ 外部存储器 + 外设接口 │
└─────────────────────────────────────────┘
详细功能模块图
┌─────────────────────────────────────────────────────────────┐
│ STM32MP133 功能模块图 │
├─────────────────────────────────────────────────────────────┤
│ Cortex-A7 Core 0 │ Cortex-A7 Core 1 │ Cortex-M4 Core │
│ (Linux/Android) │ (Linux/Android) │ (RTOS) │
├─────────────────────────────────────────────────────────────┤
│ L1 I-Cache (32KB) │ L1 I-Cache (32KB) │ L1 I-Cache │
│ L1 D-Cache (32KB) │ L1 D-Cache (32KB) │ L1 D-Cache │
├─────────────────────────────────────────────────────────────┤
│ L2 Cache (256KB) - 共享 │
├─────────────────────────────────────────────────────────────┤
│ GPU (3D) │ VPU (Video) │ DSP │
├─────────────────────────────────────────────────────────────┤
│ DDR Controller │ USB 2.0/3.0 │ Ethernet │
│ SD/MMC │ CAN-FD │ SPI/I2C/UART │
│ GPIO │ ADC/DAC │ Timer/PWM │
└─────────────────────────────────────────────────────────────┘
开发环境
1. 软件开发工具
- STM32CubeIDE:ST官方提供的免费集成开发环境,支持Cortex-A和Cortex-M核的软件开发。
- STM32CubeMX:图形化引脚配置与项目初始化工具,可以直观地配置时钟、外设,并生成基础代码。
- Yocto Project:用于构建定制化嵌入式Linux系统的强大框架,STM32MP的OpenLinux方案基于此。
- Buildroot:另一款轻量级、易于上手的Linux系统构建工具。
2. 开发板支持
- STM32MP157C-DK2:功能完整的官方评估板,适合深度开发和学习。
- STM32MP157A-DK1:入门级开发板,性价比高。
- 第三方开发板:市面上有很多基于STM32MP1设计的行业定制板卡。
OpenLinux方案使用
OpenLinux概述
STM32MP OpenLinux是ST为STM32MP系列MPU量身打造的开源Linux解决方案。它基于Yocto Project构建,提供从内核、驱动到文件系统和基础软件的完整支持。如果你需要在嵌入式设备上运行一个功能齐全、稳定可靠的Linux系统,OpenLinux是一个非常理想的起点。
OpenLinux核心特性
- 完整的Linux内核:基于Linux 5.15+ 长期支持(LTS)版本,稳定且有持续维护。
- 丰富的驱动支持:包含了STM32MP所有外设的Linux驱动,开箱即用。
- 图形系统支持:集成了Wayland/Weston显示服务器,可充分利用GPU进行图形加速。
- 网络协议栈:提供完整的TCP/IP协议栈支持。
- 文件系统:支持ext4、UBIFS等多种嵌入式场景常用的文件系统。
- 包管理:支持opkg包管理系统,方便安装和管理软件。
- 开发工具:提供完整的交叉编译工具链,方便在PC上为ARM架构编译程序。
OpenLinux架构
系统启动流程
BootROM → FSBL → SSBL → Linux Kernel → RootFS → Applications
↓ ↓ ↓ ↓ ↓ ↓
ROM U-Boot U-Boot Kernel Initramfs Apps
Code SPL U-Boot Image RootFS Services
内存布局
┌─────────────────────────────────────────┐
│ 0x00000000 - 0x0000FFFF │ BootROM │
├─────────────────────────────────────────┤
│ 0x00010000 - 0x0001FFFF │ FSBL (SPL) │
├─────────────────────────────────────────┤
│ 0x00020000 - 0x0003FFFF │ SSBL (U-Boot) │
├─────────────────────────────────────────┤
│ 0x00040000 - 0x0007FFFF │ Device Tree │
├─────────────────────────────────────────┤
│ 0x00080000 - 0x001FFFFF │ Linux Kernel │
├─────────────────────────────────────────┤
│ 0x00200000 - 0x00FFFFFF │ Initramfs │
├─────────────────────────────────────────┤
│ 0x01000000 - 0xFFFFFFFF │ RootFS │
└─────────────────────────────────────────┘
OpenLinux构建系统
1. Yocto Project环境搭建
# 安装依赖包
sudo apt-get update
sudo apt-get install -y gawk wget git-core diffstat unzip texinfo \
gcc-multilib build-essential chrpath socat cpio python3 \
python3-pip python3-pexpect xz-utils debianutils iputils-ping \
python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
pylint3 xterm python3-subunit mesa-common-dev zstd liblz4-tool
# 克隆STM32MP1 Yocto层
git clone https://github.com/STMicroelectronics/meta-st-stm32mp.git
cd meta-st-stm32mp
git checkout kirkstone-4.0.0
# 初始化构建环境
source layers/meta-st/scripts/envsetup.sh
2. 构建配置
# 选择STM32MP133配置,构建带图形界面的系统
MACHINE=stm32mp133f-dk DISTRO=openstlinux-weston \
bitbake st-image-weston
# 或者构建最小系统(无图形界面)
MACHINE=stm32mp133f-dk DISTRO=openstlinux-weston \
bitbake st-image-core
3. 自定义构建
# 创建自定义层
bitbake-layers create-layer ../meta-custom
# 添加自定义配方
cat > ../meta-custom/recipes-example/example/example_1.0.bb << EOF
SUMMARY = "Example application"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=..."
SRC_URI = "file://example.c"
S = "\${WORKDIR}"
do_compile() {
\${CC} \${CFLAGS} \${LDFLAGS} example.c -o example
}
do_install() {
install -d \${D}\${bindir}
install -m 0755 example \${D}\${bindir}/
}
EOF
实际应用案例
边缘AI推理应用
STM32MP133的双核A7和GPU使其非常适合运行轻量级AI模型。以下是一个在OpenLinux环境下使用TensorFlow Lite进行图像分类的C++示例。
// edge_ai.c - 边缘AI推理示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <opencv2/opencv.hpp>
#include <tensorflow/lite/interpreter.h>
#include <tensorflow/lite/kernels/register.h>
class EdgeAI {
private:
std::unique_ptr<tflite::Interpreter> interpreter;
TfLiteTensor* input_tensor;
TfLiteTensor* output_tensor;
public:
bool loadModel(const char* model_path) {
// 加载TensorFlow Lite模型
std::unique_ptr<tflite::FlatBufferModel> model =
tflite::FlatBufferModel::BuildFromFile(model_path);
if (!model) {
fprintf(stderr, "Failed to load model\n");
return false;
}
// 创建解释器
tflite::ops::builtin::BuiltinOpResolver resolver;
tflite::InterpreterBuilder builder(*model, resolver);
builder(&interpreter);
if (!interpreter) {
fprintf(stderr, "Failed to create interpreter\n");
return false;
}
// 分配张量
if (interpreter->AllocateTensors() != kTfLiteOk) {
fprintf(stderr, "Failed to allocate tensors\n");
return false;
}
// 获取输入输出张量
input_tensor = interpreter->input_tensor(0);
output_tensor = interpreter->output_tensor(0);
return true;
}
bool processImage(const char* image_path) {
// 加载图像
cv::Mat image = cv::imread(image_path);
if (image.empty()) {
fprintf(stderr, "Failed to load image\n");
return false;
}
// 预处理图像
cv::resize(image, image, cv::Size(224, 224));
cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
image.convertTo(image, CV_32F, 1.0/255.0);
// 复制数据到输入张量
memcpy(input_tensor->data.f, image.data,
input_tensor->bytes);
// 运行推理
if (interpreter->Invoke() != kTfLiteOk) {
fprintf(stderr, "Failed to invoke interpreter\n");
return false;
}
// 处理输出结果
float* output_data = output_tensor->data.f;
int max_index = 0;
float max_value = output_data[0];
for (int i = 1; i < output_tensor->dims->data[1]; i++) {
if (output_data[i] > max_value) {
max_value = output_data[i];
max_index = i;
}
}
printf("Prediction: Class %d, Confidence: %.2f\n",
max_index, max_value);
return true;
}
};
int main(int argc, char* argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <model.tflite> <image.jpg>\n", argv[0]);
return -1;
}
EdgeAI ai;
if (!ai.loadModel(argv[1])) {
return -1;
}
if (!ai.processImage(argv[2])) {
return -1;
}
return 0;
}
希望这篇关于STM32MP MPU的开发指南能为你项目选型和开发入门提供清晰的路线图。在实际开发中遇到的问题,也欢迎到云栈社区与更多开发者交流探讨。