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(读)。初始化流程我总结成三步:
- 上电复位:拉低 RESET 引脚至少 1 ms,再释放
- 写初始化序列:配置输出格式、分辨率、时钟分频
- 等待稳定:至少等 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