1. 项目概述
最近在做一个基于STM32F407的摄像头图像采集项目,需要将OV7670摄像头采集的图像实时显示在ILI9341驱动的TFTLCD屏幕上。这个方案在工业检测、智能门禁等领域都有广泛应用。下面我会详细记录整个开发过程,包括硬件选型、环境搭建、代码实现和调试经验。
这个项目最核心的技术点在于如何高效地处理图像数据流。OV7670输出的是RGB565格式的QVGA(320x240)图像,每帧有153600字节的数据量。STM32F407的主频虽然能达到168MHz,但直接处理这么大的数据流还是有不少挑战。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件准备
2.1 硬件清单
我选择的硬件配置如下:
- 主控板:STM32F407ZGT6开发板(带SWD调试接口)
- 摄像头模块:OV7670带FIFO版本(AL422B芯片)
- 显示屏:2.8寸TFTLCD(ILI9341驱动,8080并行接口)
- 辅助工具:
- USB-TTL模块(用于调试输出)
- 杜邦线若干(建议使用不同颜色区分信号类型)
- 5V/2A电源(给开发板供电)
- ST-Link V2烧录器
选择带FIFO的OV7670模块非常重要。AL422B FIFO可以缓存一整帧图像,解决了STM32直接读取摄像头数据时的时序问题。不带FIFO的版本需要精确的时序控制,实现难度大很多。
2.2 硬件连接
2.2.1 OV7670接线
| OV7670模块引脚 | STM32F407引脚 | 功能说明 |
|---|---|---|
| VCC | 3.3V | 电源 |
| GND | GND | 地线 |
| SDA | PB7 | I2C1数据线 |
| SCL | PB6 | I2C1时钟线 |
| RESET | PC0 | 硬件复位 |
| PWDN | PC1 | 掉电控制 |
| VS | PE0 | 场同步信号 |
| HREF | PE1 | 行同步信号 |
| PCLK | PE2 | 像素时钟 |
| D0-D7 | PD0-PD7 | 数据总线 |
| XCLK | PA8 | 摄像头时钟输入 |
| WR | PE3 | FIFO写使能 |
| RD | PE4 | FIFO读使能 |
| CS | PE5 | FIFO片选 |
| RST | PE6 | FIFO复位 |
特别注意:OV7670的工作电压是3.3V,绝对不能接5V,否则会烧毁模块。数据总线D0-D7连接时要注意顺序,D0对PD0,D1对PD1,以此类推。
2.2.2 ILI9341接线
| ILI9341引脚 | STM32F407引脚 | 功能说明 |
|---|---|---|
| VCC | 3.3V | 电源 |
| GND | GND | 地线 |
| CS | PA4 | 片选信号 |
| DC | PA5 | 数据/命令选择 |
| SCL | PA6 | SPI时钟线 |
| SDA | PA7 | SPI数据线 |
| RST | PA3 | 硬件复位 |
| BL | PA2 | 背光控制 |
这里我选择使用SPI接口驱动屏幕,虽然速度比并行接口慢,但节省了大量IO口。如果对刷新率要求高,可以考虑使用FSMC接口的并行方式。
3. 软件环境搭建
3.1 STM32CubeMX配置
-
时钟配置:
- HSE选择外部8MHz晶振
- PLL倍频到168MHz系统时钟
- APB1时钟42MHz,APB2时钟84MHz
-
I2C1配置:
- 模式:I2C主机模式
- 引脚:PB6(SCL),PB7(SDA
