3. 硬件平台介绍:STM32H743 / F746 开发板特性、摄像头模块(OV2640)接口、LCD 显示模块、外部 RAM(SDRAM)与 Flash 配置

做嵌入式AI,说白了就是要在资源受限的芯片上跑神经网络。选对硬件平台,项目就成功了一半。我个人习惯把硬件平台比作「舞台」——模型是演员,内存是道具,外设是灯光音响。舞台搭不好,戏就没法唱。

这一章,我们重点聊聊 STM32H743 和 F746 这两块板子。它们都是 ST 家的高性能 MCU,跑 TFLite Micro 完全够用。我会结合自己踩过的坑,把摄像头、LCD、SDRAM 和 Flash 的配置细节掰开揉碎了讲。

核心观点: 选 H743 还是 F746,取决于你的算力需求和预算。H743 主频更高、RAM 更大,适合复杂模型;F746 性价比突出,适合原型验证。

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 左右。

我的建议: 如果只是做图像分类(比如识别猫狗),F746 完全够用。但如果你要做目标检测或语义分割,建议直接上 H743,省得后面换平台重写代码。

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,稳定第一。

避坑指南: 我曾经在 F746 上调试 OV2640,图像一直花屏。查了两天才发现是 DCMI 的同步极性配置反了。VSYNC 和 HSYNC 的极性一定要和摄像头输出匹配,否则数据错位。建议用逻辑分析仪先抓一下波形,确认极性再配置。

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 设为半透明覆盖层。这样既能看到实时画面,又能叠加识别结果,用户体验很好。

小技巧: 如果 LCD 刷新率不够,可以尝试降低 LTDC 的 CLK 频率,或者把显示窗口缩小。比如只显示 320x240 的中心区域,帧率能提升不少。

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 的步骤大致如下:

  1. 初始化 FMC 控制器:设置时序参数(CAS 延迟、突发长度、刷新周期)
  2. 配置 SDRAM 寄存器:模式寄存器设置(突发模式、操作模式)
  3. 执行初始化序列:预充电、自动刷新、设置模式寄存器
  4. 测试读写:写一个模式,读回来验证

这里有个坑: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 的固定地址。运行时通过指针直接访问,零拷贝,速度很快。

注意: QSPI Flash 的擦写寿命有限(约 10 万次),调试阶段不要频繁擦写。建议在开发板上用 SD 卡或 USB 下载模型,定型后再烧到 Flash 里。

3.6 整体硬件架构图

下面这张图,把整个硬件系统的数据流画清楚了。你看一眼,就能明白摄像头数据怎么走、模型权重放哪儿、显示结果怎么刷。

STM32 AI 图像识别硬件架构图 STM32 AI 图像识别硬件架构图 OV2640 摄像头模块 DCMI 摄像头接口 SDRAM 帧缓冲区 Cortex-M7 CPU + TFLite Micro QSPI Flash 模型权重存储 LCD 显示屏 LTDC 驱动 数据流说明: ① OV2640 采集图像 → ② DCMI 接收并存入 SDRAM 帧缓冲区 → ③ CPU 从 SDRAM 读取图像数据 ④ CPU 从 QSPI Flash 加载模型权重 → ⑤ TFLite Micro 推理 → ⑥ 结果通过 LTDC 显示到 LCD

这张图里,数据流是单向的:摄像头 → DCMI → SDRAM → CPU → LCD。模型权重存在 QSPI Flash 里,CPU 按需读取。整个链路清晰,没有瓶颈。

3.7 开发板选型建议

最后,给几个选型建议,帮你少走弯路:

  • 预算充足,追求性能:选 STM32H743,主频高、RAM 大,跑 MobileNetV2 或 Tiny YOLO 都轻松
  • 原型验证,快速出活:选 STM32F746,资料多、社区活跃,遇到问题容易找到答案
  • 量产考虑:如果模型不大(比如 < 100KB),F746 性价比更高;模型大就上 H743
  • 外设扩展:两块板子都带以太网和 USB,方便和上位机通信,调试时很有用
我的经验: 刚开始学 TFLite Micro 时,我用的是 F746 开发板。等模型调通了,再移植到 H743 上做性能优化。这样既省钱又高效,推荐你也试试。