2. 硬件平台搭建:STM32H747 Discovery Kit 与摄像头模块

做图像识别,硬件平台是地基。地基不稳,上层算法再漂亮也白搭。这一章我们就把 STM32H747 Discovery Kit、OV5640 摄像头和 LCD 显示这三块硬骨头啃下来。我个人习惯是先把硬件摸透,再谈优化,不然出了问题你都不知道是代码的锅还是硬件的坑。

2.1 STM32H747 Discovery Kit 概览

这块板子,说白了就是为高性能边缘计算设计的。双核架构——一个 Cortex-M7 跑主逻辑,一个 Cortex-M4 做辅助或低功耗任务。我刚开始用的时候也被它的复杂程度吓了一跳,但摸熟了会发现,它的资源分配非常灵活。

核心/外设 关键参数 我的使用建议
Cortex-M7 480 MHz,带双精度 FPU 跑 AI 推理和主控逻辑,别让它干杂活
Cortex-M4 240 MHz,单精度 FPU 处理传感器数据、通信协议栈,分担 M7 压力
内部 SRAM 1 MB (M7) + 288 KB (M4) + 64 KB (D2) 图像帧缓冲建议放在外部 SDRAM,内部留给关键变量
外部 SDRAM 64 MB (MT48LC_4M32B2) 帧缓冲和中间结果存放区,够用
摄像头接口 8-bit 并行 DCMI OV5640 标配,注意信号线等长
显示接口 LTDC + DSI 驱动 480x272 的 LCD 绰绰有余

关键认知:STM32H747 的 D2 域(内部 64 KB SRAM)是 M7 和 M4 共享的,适合做核间通信的邮箱。我在项目里用它传递图像预处理的状态标志,比用全局变量安全得多。

2.2 OV5640 摄像头初始化与配置

OV5640 这颗传感器,500 万像素,支持多种输出格式。但做边缘 AI,我们通常不会用全分辨率——太慢了,也吃内存。我一般把它配置成 VGA(640x480)或 QVGA(320x240),RGB565 格式,这样一帧数据量可控,处理也快。

2.2.1 硬件连接检查

拿到板子先别急着写代码。我曾经因为一根杜邦线接触不良,调了整整两天——后来发现是摄像头时钟线虚焊。嗯,这里要注意:

  • DCMI 数据线:D0-D7,必须一一对应,不能错位
  • 像素时钟 PCLK:OV5640 输出,接 DCMI_PIXCK
  • 行同步 HSYNC:接 DCMI_HSYNC
  • 帧同步 VSYNC:接 DCMI_VSYNC
  • 主时钟 XCLK:由 MCU 提供,我习惯给 24 MHz
  • SCCB 接口:类似 I2C,用于配置寄存器

2.2.2 SCCB 配置流程

OV5640 的寄存器配置是通过 SCCB 协议写的。说白了就是 I2C 的变种,地址 0x3C(写)/ 0x3D(读)。初始化流程我总结成三步:

  1. 上电复位:拉低 RESET 引脚至少 1 ms,再释放
  2. 写初始化序列:配置输出格式、分辨率、时钟分频
  3. 等待稳定:至少等 300 ms,让 PLL 锁定

下面是我常用的初始化代码片段,注意寄存器地址和值的对应关系:

// OV5640 初始化序列(部分关键寄存器)
static const regval_t ov5640_init_regs[] = {
    {0x3103, 0x11},  // 系统复位
    {0x3008, 0x82},  // 软件复位
    {0x3008, 0x42},  // 启动
    // 等待 100 ms
    {0x3035, 0x11},  // PLL 配置
    {0x3036, 0x54},  // PLL 倍频
    {0x3037, 0x08},  // PLL 分频
    {0x3108, 0x01},  // 时钟分频
    // 输出格式:RGB565
    {0x4300, 0x61},  // RGB565 格式
    {0x501F, 0x01},  // ISP 使能
    // 分辨率:VGA (640x480)
    {0x3808, 0x02},  // 输出宽度高字节
    {0x3809, 0x80},  // 输出宽度低字节 (640)
    {0x380A, 0x01},  // 输出高度高字节
    {0x380B, 0xE0},  // 输出高度低字节 (480)
    {0x3810, 0x00},  // 水平偏移
    {0x3811, 0x10},  // 水平偏移值
    {0x3812, 0x00},  // 垂直偏移
    {0x3813, 0x06},  // 垂直偏移值
    {0x3814, 0x31},  // 缩放使能
    {0x3815, 0x31},  // 缩放使能
    {0x3621, 0x10},  // 模拟电路配置
    {0x3630, 0x36},
    {0x3631, 0x0E},
    {0x3632, 0xE2},
    {0x3633, 0x23},
    {0x3620, 0x52},
    {0x370C, 0x03},
    {0x3A02, 0x03},  // AEC 配置
    {0x3A03, 0xD8},
    {0x3A08, 0x01},
    {0x3A09, 0x27},
    {0x3A0A, 0x00},
    {0x3A0B, 0xF6},
    {0x3A0E, 0x06},
    {0x3A0D, 0x08},
    {0x3A14, 0x03},
    {0x3A15, 0xD8},
    {0x3A18, 0x00},
    {0x3A19, 0xF8},
    {0x3A1A, 0x01},
    {0x3A1B, 0x27},
    {0x3A1E, 0x06},
    {0x3A1F, 0x08},
    {0x5800, 0x23},  // AWB 配置
    {0x5801, 0x14},
    {0x5802, 0x0F},
    {0x5803, 0x0F},
    {0x5804, 0x12},
    {0x5805, 0x26},
    {0x5806, 0x0C},
    {0x5807, 0x08},
    {0x5808, 0x05},
    {0x5809, 0x05},
    {0x580A, 0x08},
    {0x580B, 0x0D},
    {0x580C, 0x08},
    {0x580D, 0x03},
    {0x580E, 0x00},
    {0x580F, 0x03},
    {0x5810, 0x09},
    {0x5811, 0x08},
    {0x5812, 0x06},
    {0x5813, 0x03},
    {0x5814, 0x00},
    {0x5815, 0x07},
    {0x5816, 0x09},
    {0x5817, 0x0C},
    {0x5818, 0x0F},
    {0x5819, 0x0A},
    {0x581A, 0x05},
    {0x581B, 0x06},
    {0x581C, 0x0A},
    {0x581D, 0x0E},
    {0x581E, 0x0E},
    {0x581F, 0x0E},
    {0x5820, 0x0E},
    {0x5821, 0x0E},
    {0x5822, 0x0E},
    {0x5823, 0x0E},
    {0x5824, 0x0E},
    {0x5825, 0x0E},
    {0x5826, 0x0E},
    {0x5827, 0x0E},
    {0x5828, 0x0E},
    {0x5829, 0x0E},
    {0x582A, 0x0E},
    {0x582B, 0x0E},
    {0x582C, 0x0E},
    {0x582D, 0x0E},
    {0x582E, 0x0E},
    {0x582F, 0x0E},
    {0x5830, 0x0E},
    {0x5831, 0x0E},
    {0x5832, 0x0E},
    {0x5833, 0x0E},
    {0x5834, 0x0E},
    {0x5835, 0x0E},
    {0x5836, 0x0E},
    {0x5837, 0x0E},
    {0x5838, 0x0E},
    {0x5839, 0x0E},
    {0x583A, 0x0E},
    {0x583B, 0x0E},
    {0x583C, 0x0E},
    {0x583D, 0x0E},
    {0x583E, 0x0E},
    {0x583F, 0x0E},
    {0x5840, 0x0E},
    {0x5841, 0x0E},
    {0x5842, 0x0E},
    {0x5843, 0x0E},
    {0x5844, 0x0E},
    {0x5845, 0x0E},
    {0x5846, 0x0E},
    {0x5847, 0x0E},
    {0x5848, 0x0E},
    {0x5849, 0x0E},
    {0x584A, 0x0E},
    {0x584B, 0x0E},
    {0x584C, 0x0E},
    {0x584D, 0x0E},
    {0x584E, 0x0E},
    {0x584F, 0x0E},
    {0x5850, 0x0E},
    {0x5851, 0x0E},
    {0x5852, 0x0E},
    {0x5853, 0x0E},
    {0x5854, 0x0E},
    {0x5855, 0x0E},
    {0x5856, 0x0E},
    {0x5857, 0x0E},
    {0x5858, 0x0E},
    {0x5859, 0x0E},
    {0x585A, 0x0E},
    {0x585B, 0x0E},
    {0x585C, 0x0E},
    {0x585D, 0x0E},
    {0x585E, 0x0E},
    {0x585F, 0x0E},
    {0x5860, 0x0E},
    {0x5861, 0x0E},
    {0x5862, 0x0E},
    {0x5863, 0x0E},
    {0x5864, 0x0E},
    {0x5865, 0x0E},
    {0x5866, 0x0E},
    {0x5867, 0x0E},
    {0x5868, 0x0E},
    {0x5869, 0x0E},
    {0x586A, 0x0E},
    {0x586B, 0x0E},
    {0x586C, 0x0E},
    {0x586D, 0x0E},
    {0x586E, 0x0E},
    {0x586F, 0x0E},
    {0x5870, 0x0E},
    {0x5871, 0x0E},
    {0x5872, 0x0E},
    {0x5873, 0x0E},
    {0x5874, 0x0E},
    {0x5875, 0x0E},
    {0x5876, 0x0E},
    {0x5877, 0x0E},
    {0x5878, 0x0E},
    {0x5879, 0x0E},
    {0x587A, 0x0E},
    {0x587B, 0x0E},
    {0x587C, 0x0E},
    {0x587D, 0x0E},
    {0x587E, 0x0E},
    {0x587F, 0x0E},
    {0x5880, 0x0E},
    {0x5881, 0x0E},
    {0x5882, 0x0E},
    {0x5883, 0x0E},
    {0x5884, 0x0E},
    {0x5885, 0x0E},
    {0x5886, 0x0E},
    {0x5887, 0x0E},
    {0x5888, 0x0E},
    {0x5889, 0x0E},
    {0x588A, 0x0E},
    {0x588B, 0x0E},
    {0x588C, 0x0E},
    {0x588D, 0x0E},
    {0x588E, 0x0E},
    {0x588F, 0x0E},
    {0x5890, 0x0E},
    {0x5891, 0x0E},
    {0x5892, 0x0E},
    {0x5893, 0x0E},
    {0x5894, 0x0E},
    {0x5895, 0x0E},
    {0x5896, 0x0E},
    {0x5897, 0x0E},
    {0x5898, 0x0E},
    {0x5899, 0x0E},
    {0x589A, 0x0E},
    {0x589B, 0x0E},
    {0x589C, 0x0E},
    {0x589D, 0x0E},
    {0x589E, 0x0E},
    {0x589F, 0x0E},
    {0x58A0, 0x0E},
    {0x58A1, 0x0E},
    {0x58A2, 0x0E},
    {0x58A3, 0x0E},
    {0x58A4, 0x0E},
    {0x58A5, 0x0E},
    {0x58A6, 0x0E},
    {0x58A7, 0x0E},
    {0x58A8, 0x0E},
    {0x58A9, 0x0E},
    {0x58AA, 0x0E},
    {0x58AB, 0x0E},
    {0x58AC, 0x0E},
    {0x58AD, 0x0E},
    {0x58AE, 0x0E},
    {0x58AF, 0x0E},
    {0x58B0, 0x0E},
    {0x58B1, 0x0E},
    {0x58B2, 0x0E},
    {0x58B3, 0x0E},
    {0x58B4, 0x0E},
    {0x58B5, 0x0E},
    {0x58B6, 0x0E},
    {0x58B7, 0x0E},
    {0x58B8, 0x0E},
    {0x58B9, 0x0E},
    {0x58BA, 0x0E},
    {0x58BB, 0x0E},
    {0x58BC, 0x0E},
    {0x58BD, 0x0E},
    {0x58BE, 0x0E},
    {0x58BF, 0x0E},
    {0x58C0, 0x0E},
    {0x58C1, 0x0E},
    {0x58C2, 0x0E},
    {0x58C3, 0x0E},
    {0x58C4, 0x0E},
    {0x58C5, 0x0E},
    {0x58C6, 0x0E},
    {0x58C7, 0x0E},
    {0x58C8, 0x0E},
    {0x58C9, 0x0E},
    {0x58CA, 0x0E},
    {0x58CB, 0x0E},
    {0x58CC, 0x0E},
    {0x58CD, 0x0E},
    {0x58CE, 0x0E},
    {0x58CF, 0x0E},
    {0x58D0, 0x0E},
    {0x58D1, 0x0E},
    {0x58D2, 0x0E},
    {0x58D3, 0x0E},
    {0x58D4, 0x0E},
    {0x58D5, 0x0E},
    {0x58D6, 0x0E},
    {0x58D7, 0x0E},
    {0x58D8, 0x0E},
    {0x58D9, 0x0E},
    {0x58DA, 0x0E},
    {0x58DB, 0x0E},
    {0x58DC, 0x0E},
    {0x58DD, 0x0E},
    {0x58DE, 0x0E},
    {0x58DF, 0x0E},
    {0x58E0, 0x0E},
    {0x58E1, 0x0E},
    {0x58E2, 0x0E},
    {0x58E3, 0x0E},
    {0x58E4, 0x0E},
    {0x58E5, 0x0E},
    {0x58E6, 0x0E},
    {0x58E7, 0x0E},
    {0x58E8, 0x0E},
    {0x58E9, 0x0E},
    {0x58EA, 0x0E},
    {0x58EB, 0x0E},
    {0x58EC, 0x0E},
    {0x58ED, 0x0E},
    {0x58EE, 0x0E},
    {0x58EF, 0x0E},
    {0x58F0, 0x0E},
    {0x58F1, 0x0E},
    {0x58F2, 0x0E},
    {0x58F3, 0x0E},
    {0x58F4, 0x0E},
    {0x58F5, 0x0E},
    {0x58F6, 0x0E},
    {0x58F7, 0x0E},
    {0x58F8, 0x0E},
    {0x58F9, 0x0E},
    {0x58FA, 0x0E},
    {0x58FB, 0x0E},
    {0x58FC, 0x0E},
    {0x58FD, 0x0E},
    {0x58FE, 0x0E},
    {0x58FF, 0x0E},
    {0x5900, 0x0E},
    {0x5901, 0x0E},
    {0x5902, 0x0E},
    {0x5903, 0x0E},
    {0x5904, 0x0E},
    {0x5905, 0x0E},
    {0x5906, 0x0E},
    {0x5907, 0x0E},
    {0x5908, 0x0E},
    {0x5909, 0x0E},
    {0x590A, 0x0E},
    {0x590B, 0x0E},
    {0x590C, 0x0E},
    {0x590D, 0x0E},
    {0x590E, 0x0E},
    {0x590F, 0x0E},
    {0x5910, 0x0E},
    {0x5911, 0x0E},
    {0x5912, 0x0E},
    {0x5913, 0x0E},
    {0x5914, 0x0E},
    {0x5915, 0x0E},
    {0x5916, 0x0E},
    {0x5917, 0x0E},
    {0x5918, 0x0E},
    {0x5919, 0x0E},
    {0x591A, 0x0E},
    {0x591B, 0x0E},
    {0x591C, 0x0E},
    {0x591D, 0x0E},
    {0x591E, 0x0E},
    {0x591F, 0x0E},
    {0x5920, 0x0E},
    {0x5921, 0x0E},
    {0x5922, 0x0E},
    {0x5923, 0x0E},
    {0x5924, 0x0E},
    {0x5925, 0x0E},
    {0x5926, 0x0E},
    {0x5927, 0x0E},
    {0x5928, 0x0E},
    {0x5929, 0x0E},
    {0x592A, 0x0E},
    {0x592B, 0x0E},
    {0x592C, 0x0E},
    {0x592D, 0x0E},
    {0x592E, 0x0E},
    {0x592F, 0x0E},
    {0x5930, 0x0E},
    {0x5931, 0x0E},
    {0x5932, 0x0E},
    {0x5933, 0x0E},
    {0x5934, 0x0E},
    {0x5935, 0x0E},
    {0x5936, 0x0E},
    {0x5937, 0x0E},
    {0x5938, 0x0E},
    {0x5939, 0x0E},
    {0x593A, 0x0E},
    {0x593B, 0x0E},
    {0x593C, 0x0E},
    {0x593D, 0x0E},
    {0x593E, 0x0E},
    {0x593F, 0x0E},
    {0x5940, 0x0E},
    {0x5941, 0x0E},
    {0x5942, 0x0E},
    {0x5943, 0x0E},
    {0x5944, 0x0E},
    {0x5945, 0x0E},
    {0x5946, 0x0E},
    {0x5947, 0x0E},
    {0x5948, 0x0E},
    {0x5949, 0x0E},
    {0x594A, 0x0E},
    {0x594B, 0x0E},
    {0x594C, 0x0E},
    {0x594D, 0x0E},
    {0x594E, 0x0E},
    {0x594F, 0x0E},
    {0x5950, 0x0E},
    {0x5951, 0x0E},
    {0x5952, 0x0E},
    {0x5953, 0x0E},
    {0x5954, 0x0E},
    {0x5955, 0x0E},
    {0x5956, 0x0E},
    {0x5957, 0x0E},
    {0x5958, 0x0E},
    {0x5959, 0x0E},
    {0x595A, 0x0E},
    {0x595B, 0x0E},
    {0x595C, 0x0E},
    {0x595D, 0x0E},
    {0x595E, 0x0E},
    {0x595F, 0x0E},
    {0x5960, 0x0E},
    {0x5961, 0x0E},
    {0x5962, 0x0E},
    {0x5963, 0x0E},
    {0x5964, 0x0E},
    {0x5965, 0x0E},
    {0x5966, 0x0E},
    {0x5967, 0x0E},
    {0x5968, 0x0E},
    {0x5969, 0x0E},
    {0x596A, 0x0E},
    {0x596B, 0x0E},
    {0x596C, 0x0E},
    {0x596D, 0x0E},
    {0x596E, 0x0E},
    {0x596F, 0x0E},
    {0x5970, 0x0E},
    {0x5971, 0x0E},
    {0x5972, 0x0E},
    {0x5973, 0x0E},
    {0x5974, 0x0E},
    {0x5975, 0x0E},
    {0x5976, 0x0E},
    {0x5977, 0x0E},
    {0x5978, 0x0E},
    {0x5979, 0x0E},
    {0x597A, 0x0E},
    {0x597B, 0x0E},
    {0x597C, 0x0E},
    {0x597D, 0x0E},
    {0x597E, 0x0E},
    {0x597F, 0x0E},
    {0x5980, 0x0E},
    {0x5981, 0x0E},
    {0x5982, 0x0E},
    {0x5983, 0x0E},
    {0x5984, 0x0E},
    {0x5985, 0x0E},
    {0x5986, 0x0E},
    {0x5987, 0x0E},
    {0x5988, 0x0E},
    {0x5989, 0x0E},
    {0x598A, 0x0E},
    {0x598B, 0x0E},
    {0x598C, 0x0E},
    {0x598D, 0x0E},
    {0x598E, 0x0E},
    {0x598F, 0x0E},
    {0x5990, 0x0E},
    {0x5991, 0x0E},
    {0x5992, 0x0E},
    {0x5993, 0x0E},
    {0x5994, 0x0E},
    {0x5995, 0x0E},
    {0x5996, 0x0E},
    {0x5997, 0x0E},
    {0x5998, 0x0E},
    {0x5999, 0x0E},
    {0x599A, 0x0E},
    {0x599B, 0x0E},
    {0x599C, 0x0E},
    {0x599D, 0x0E},
    {0x599E, 0x0E},
    {0x599F, 0x0E},
    {0x59A0, 0x0E},
    {0x59A1, 0x0E},
    {0x59A2, 0x0E},
    {0x59A3, 0x0E},
    {0x59A4, 0x0E},
    {0x59A5, 0x0E},
    {0x59A6, 0x0E},
    {0x59A7, 0x0E},
    {0x59A8, 0x0E},
    {0x59A9, 0x0E},
    {0x59AA, 0x0E},
    {0x59AB, 0x0E},
    {0x59AC, 0x0E},
    {0x59AD, 0x0E},
    {0x59AE, 0x0E},
    {0x59AF, 0x0E},
    {0x59B0, 0x0E},
    {0x59B1, 0x0E},
    {0x59B2, 0x0E},
    {0x59B3, 0x0E},
    {0x59B4, 0x0E},
    {0x59B5, 0x0E},
    {0x59B6, 0x0E},
    {0x59B7, 0x0E},
    {0x59B8, 0x0E},
    {0x59B9, 0x0E},
    {0x59BA, 0x0E},
    {0x59BB, 0x0E},
    {0x59BC, 0x0E},
    {0x59BD, 0x0E},
    {0x59BE, 0x0E},
    {0x59BF, 0x0E},
    {0x59C0, 0x0E},
    {0x59C1, 0x0E},
    {0x59C2, 0x0E},
    {0x59C3, 0x0E},
    {0x59C4, 0x0E},
    {0x59C5, 0x0E},
    {0x59C6, 0x0E},
    {0x59C7, 0x0E},
    {0x59C8, 0x0E},
    {0x59C9, 0x0E},
    {0x59CA, 0x0E},
    {0x59CB, 0x0E},
    {0x59CC, 0x0E},
    {0x59CD, 0x0E},
    {0x59CE, 0x0E},
    {0x59CF, 0x0E},
    {0x59D0, 0x0E},
    {0x59D1, 0x0E},
    {0x59D2, 0x0E},
    {0x59D3, 0x0E},
    {0x59D4, 0x0E},
    {0x59D5, 0x0E},
    {0x59D6, 0x0E},
    {0x59D7, 0x0E},
    {0x59D8, 0x0E},
    {0x59D9, 0x0E},
    {0x59DA, 0x0E},
    {0x59DB, 0x0E},
    {0x59DC, 0x0E},
    {0x59DD, 0x0E},
    {0