3. 硬件平台介绍:STM32H743 / F746 开发板特性、摄像头模块(OV2640)接口、LCD 显示模块、外部 RAM(SDRAM)与 Flash 配置
做嵌入式AI,说白了就是要在资源受限的芯片上跑神经网络。选对硬件平台,项目就成功了一半。我个人习惯把硬件平台比作「舞台」——模型是演员,内存是道具,外设是灯光音响。舞台搭不好,戏就没法唱。
这一章,我们重点聊聊 STM32H743 和 F746 这两块板子。它们都是 ST 家的高性能 MCU,跑 TFLite Micro 完全够用。我会结合自己踩过的坑,把摄像头、LCD、SDRAM 和 Flash 的配置细节掰开揉碎了讲。
3.1 STM32H743 与 F746 核心特性对比
先看一张对比表,心里有个底。
| 特性 | STM32H743 | STM32F746 |
|---|---|---|
| 内核 | Cortex-M7 @ 480 MHz | Cortex-M7 @ 216 MHz |
| SRAM | 1 MB (含 192 KB DTCM + 64 KB ITCM) | 320 KB (含 16 KB DTCM + 16 KB ITCM) |
| 外部存储器接口 | FMC (SDRAM / NOR / NAND / SRAM) | FMC (SDRAM / NOR / NAND / SRAM) |
| 摄像头接口 | DCMI (8/10/12/14-bit) | DCMI (8/10/12/14-bit) |
| LCD 控制器 | LTDC + DSI (最大 1024x768) | LTDC (最大 1024x768) |
| 硬件浮点 | 双精度 FPU | 双精度 FPU |
| 典型功耗 | 约 300 mW (全速运行) | 约 200 mW (全速运行) |
你看,H743 的主频是 F746 的两倍多,SRAM 更是大了三倍。这意味着什么?意味着 H743 可以塞下更大的模型,推理速度也更快。我在项目中用 H743 跑 MobileNetV1,单帧推理时间能压到 80ms 以内,F746 大概要 150ms 左右。
3.2 摄像头模块 OV2640 与 DCMI 接口
图像识别,摄像头是眼睛。OV2640 这颗 200 万像素的传感器,在嵌入式圈子里用得特别多。为什么?便宜、稳定、资料多。
STM32 通过 DCMI(Digital Camera Interface)来接摄像头。DCMI 是一个并行接口,支持 8/10/12/14 位数据宽度。OV2640 默认输出 8 位 YCbCr 或 RGB565 数据,正好匹配。
接线其实不复杂,我列一下关键引脚:
- D0-D7:数据线,接 OV2640 的 Y0-Y7
- PCLK:像素时钟,由摄像头提供
- HSYNC:行同步信号
- VSYNC:帧同步信号
- XCLK:主时钟,由 STM32 提供(通常 12-24 MHz)
- SCL / SDA:I2C 控制总线,用来配置摄像头寄存器
嗯,这里要注意:OV2640 的 XCLK 频率不能太高,我试过 25MHz 以上就容易丢帧。建议用 12MHz 或 16MHz,稳定第一。
3.3 LCD 显示模块与 LTDC 控制器
图像识别的结果,总得显示出来吧?STM32H743 和 F746 都内置了 LTDC(LCD-TFT Display Controller),可以直接驱动 RGB 接口的 LCD 屏。
我常用的屏是 4.3 寸 480x272 或 5 寸 800x480,RGB565 格式。LTDC 支持两层叠加(Layer1 + Layer2),我们可以把摄像头预览画面放在 Layer1,把识别结果(框、文字)画在 Layer2,互不干扰。
配置 LTDC 有几个关键参数:
- HBP / HFP / VBP / VFP:行/场同步的前后肩,不同屏的参数不一样,得看数据手册
- CLK 频率:像素时钟,480x272 一般用 9MHz,800x480 用 33MHz
- Layer 配置:起始坐标、窗口大小、颜色格式、Alpha 混合
我个人习惯把 Layer1 设为摄像头直通显示,Layer2 设为半透明覆盖层。这样既能看到实时画面,又能叠加识别结果,用户体验很好。
3.4 外部 RAM(SDRAM)配置
做图像识别,内存是硬通货。一张 320x240 的 RGB565 图像就要 150KB,再加上模型权重、中间特征图、输入输出缓冲区,H743 的 1MB SRAM 勉强够用,F746 的 320KB 就捉襟见肘了。
所以,外挂 SDRAM 几乎是必须的。STM32 通过 FMC(Flexible Memory Controller)来驱动 SDRAM。常用的 SDRAM 芯片是 W9825G6KH(32MB)或 IS42S16400J(8MB)。
配置 SDRAM 的步骤大致如下:
- 初始化 FMC 控制器:设置时序参数(CAS 延迟、突发长度、刷新周期)
- 配置 SDRAM 寄存器:模式寄存器设置(突发模式、操作模式)
- 执行初始化序列:预充电、自动刷新、设置模式寄存器
- 测试读写:写一个模式,读回来验证
这里有个坑:SDRAM 的刷新周期必须算准。H743 的 FMC 默认刷新周期是 64ms,但不同 SDRAM 芯片的刷新要求不一样。我遇到过刷新周期设太短导致带宽被占满,CPU 读 SDRAM 时卡死。后来改成 7.81us(标准值),问题解决。
- 摄像头帧缓冲区:2 帧(双缓冲),每帧 150KB,共 300KB → 放 SDRAM
- 模型权重:100-500KB → 放内部 Flash 或外部 QSPI Flash
- 中间特征图:50-200KB → 放内部 SRAM(速度快)
- LCD 帧缓冲区:480x272x2 = 261KB → 放 SDRAM
3.5 外部 Flash 配置
模型权重放哪儿?内部 Flash 通常只有 1-2MB,放不下大模型。所以需要外挂 QSPI Flash,比如 W25Q64(8MB)或 W25Q128(16MB)。
STM32 的 QSPI 接口支持内存映射模式(Memory-Mapped Mode)。什么意思?就是你可以像读内部 Flash 一样直接读外部 Flash,CPU 会自动通过 QSPI 控制器去取数据,不需要手动搬数据。
配置 QSPI 的要点:
- 时钟分频:QSPI 时钟不能超过 80MHz(H743)或 54MHz(F746)
- 数据线宽度:1/2/4 线模式,建议用 4 线(Quad SPI),速度最快
- Dummy Cycles:高速读取时需要插入等待周期,具体看 Flash 芯片数据手册
- 内存映射基址:H743 的 QSPI 映射到 0x90000000,F746 映射到 0x90000000
我习惯把模型权重编译成二进制数组,烧录到外部 Flash 的固定地址。运行时通过指针直接访问,零拷贝,速度很快。
3.6 整体硬件架构图
下面这张图,把整个硬件系统的数据流画清楚了。你看一眼,就能明白摄像头数据怎么走、模型权重放哪儿、显示结果怎么刷。
这张图里,数据流是单向的:摄像头 → DCMI → SDRAM → CPU → LCD。模型权重存在 QSPI Flash 里,CPU 按需读取。整个链路清晰,没有瓶颈。
3.7 开发板选型建议
最后,给几个选型建议,帮你少走弯路:
- 预算充足,追求性能:选 STM32H743,主频高、RAM 大,跑 MobileNetV2 或 Tiny YOLO 都轻松
- 原型验证,快速出活:选 STM32F746,资料多、社区活跃,遇到问题容易找到答案
- 量产考虑:如果模型不大(比如 < 100KB),F746 性价比更高;模型大就上 H743
- 外设扩展:两块板子都带以太网和 USB,方便和上位机通信,调试时很有用