学习文献:李慧敏,樊记明,杨笑.基于STM32和OV7670的图像采集与显示系统设计[J].传感器与微系统,2016,35(09):114-117.
摘要: 针对传统图像采集与显示方案存在成本高、便携性差等问题,设计了一种基于 STM32 和 OV7670的图像采集与显示系统。以 STM32F103ZET6 微控制器为主控单元,采用串行摄像机控制总线(SCCB)控制 OV7670 图像传感器输出 RGB565,QVGA 的图像数据,同时实时显示在 TFT LCD 上,并将图像以 BMP格式保存在 SD 卡中。实验结果表明:得到的图像清晰流畅,且该系统具有低成本、低功耗、小体积等优点,可满足图像处理与识别的需要。
关键词: STM32; OV7670; 图像采集与显示; 图像处理
一、元器件及名词解释
STM32F103 —— ST 公司生产的基于ARM Cortex — M3 内核的 32 位微控制器,主频可达 72 MHz,具有 高 性 能、低 功 耗、低 成 本、稳 定 等 诸 多 优 点.
OV7670 —— OmniVision 公司生产的一款 1/6 寸、有效像素30 万的互补金属氧化物半导体(CMOS)图像传感器,它通过美国 OmniVision 公司定制的 2 线/3 线制串行摄像头控制总线(serial camera control bus,SCCB)进行控制,输出并行的 8 位图像数据,VGA 图像输出最高可达 30 帧/s.
TFT(Thin Film Transistor)LCD——薄膜场效应晶体管LCD,是有源矩阵类型液晶显示器(AM-LCD)中的一种。 液晶平板显示器,特别TFT-LCD,是目前唯一在亮度、对比度、功耗、寿命、体积和重量等综合性能上全面赶上和超过CRT的显示器件,它的性能优良、大规模生产特性好,自动化程度高,原材料成本低廉,发展空间广阔,将迅速成为新世纪的主流产品,是21世纪全球经济增长的一个亮点.
QVGA & VGA——QVGA和VGA都是指的屏幕分辨率,也就是指屏幕在横向和纵向上,能够显示的点的数量。VGA的标准是640*480,即横向有640个点,纵向有480个点。QVGA是VGA的四分之一,即横向和纵向各小一半,即分辨率为320*240.
SCCB——串行摄像机控制总线协议的英文名简称,相当于一个简易的I2C协议。同时也代表软件配置控制委员会,常用的2线制SCCB总线是与总线类似的两线串行总线,仅需 SIO_C(串行时钟线)和 SIO_D(串行数据线)便能实现双向数据传输.
ACK (Acknowledgement)——是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方.
AHB——高级高性能总线,一种系统总线。主要用于高性能模块(如CPU、DMA和DSP等)之间的连接.
SD 卡——安全数码卡(secure digital memory card),是一种基于半导体快闪记忆器的新一代记忆设备,广泛使用在便携式装置上.
BMP——(Bitmap,位图文件)是 Windows 操作系统中的标准图像文件格式,图像深度可选,一般不压缩,没有失真,扫描顺序为自左到右、自下到上。BMP 文件一般由文件头、信息头、调色板、位图数据这 4部分组成。
二、系统总体方案
STM32 微控制器——整个系统的核心单元,负责图像数据的处理和各模块的控制等,STM32 通过对图像传感器寄存器的读写来控制它采集一帧的图像.
OV7670——负责图像数据的采集.
AL422B帧缓存——由于图像传感器的像素时钟高达 24 MHz,通过STM32 的 IO 口来直接采集数据比较困难,容易造成数据丢失,且对 CPU 会造成较大的负担,所以使用 AL422B 作为先入先出(FIFO),当一帧图像缓存完后,STM32 才将这一帧图像写入显存或暂存到内存中.
TFT LCD——选取2.8in(1in=2.54cm) 320*240分辨率的TFT实现图像的实时显示。控制器为 ILI9341,显示方式为 RGB565,接口为 16位 8080 并口.
外扩SRAM——由于一帧 RGB565 格 式、QVGA (320 × 240) 尺 寸 的 图 像 高 达150 KB,而 STM32F103ZET6 的内部 SRAM 只有 64 KB,故外扩 1MB 的 SRAM 实现图像处理中间数据的暂存.
SD 卡——可以将图像以 BMP 图片文件格式进行掉电存储,方便计算机等其他设备的查看。SD 卡支持 2 种操作模式:SD 卡模式和 SPI 模式。SD 卡模式具有更快的速度,而 SPI模式则具有更好的兼容性.
FATFS——一个免费开源、用标准 C 语言编写、专为小型嵌入式系统设计的 FAT 文件系统模块,用户不必理会 FATFS 的内部结构及复杂的 FAT 协议,只需调用它提供的一系列应用接口函数,如 f_open、f_close、f_read 和 f_write 等,就可轻易实现文件的读/写.
三、图像采集
1、SCCB驱动
STM32 通过 SCCB 对 OV7670 寄存器的读写实现图像数据的采集与输出。本系统使用 IO 口模拟 SCCB 来实现对 OV7670 的控制,SIO_C 口配置为推挽输出,SIO_D 口读数据时配置为上拉输入、写数据时配置为推挽输出,然后根据 SCCB 时序图来编写驱动程序。
2、图像数据输出
本系统采用 QVGA(320 × 240)模式、RGB565 格式输出图像数据,每帧图像 240 行,每行 320 个像素,刚好与 TFT LCD 的分辨率及颜色格式相匹配。
一帧图像的缓存(从OV7670 存储图像数据至 FIFO 的过程):等待 VSYNC 帧同步信号→复位 FIFO 写指针→使能 FIFO 写→等待第二个VSYNC 帧同步信号→禁止 FIFO 写.
完成帧缓存后需要将图像数据从 FIFO 读出过程:复位 FIFO 读指针→给 FIFO 读时钟→读第一个像素高字节→给 FIFO 读时钟→读第一个像素低字节并将高低字节组成 16 位数据→给 FIFO 读时钟→循环读取剩余像素至结束.
以上两步可获取一帧完整的图像数据,之后进行图像显示或暂存到外部SRAM中.
三、图像显示
1、LCD驱动
本系统使用 2.8 寸 320 ×240 分辨率的 TFT LCD 作为图像显示设备,控制器为 ILI9341,显示方式为 RGB565,接口为16位 8080 并口.
驱动LCD:采用STM32内部自带的静态存储控制器(flexible static memory controller,FSMC)总线。原因:由于一帧图像数据高达 150KB,为加快显示速度。具体做法:将 LCD 当作 16 位外部 SRAM 来控制,LCD 的RS(命令/数据标志)信号作为地址线以区分命令和数据,与 STM32 的 FSMC _ A10 相连接。LCD 和外扩的 1MBSRAM 均挂在 FSMC 总线上,它们使用不同的片选信号以进行区分,LCD 接 FSMC_NE4,SRAM 接 FSMC_NE3。
FSMC 的工作模式:由于对 LCD 控制器 ILI9341 的写操作比读操作快得多,工作模式配置为异步模式 A(ModeA),即读/写时间分别由不同的寄存器来控制.
STM32 FSMC HADDR和FSMC_A对应的问题
我们操作的是HADDR[25:0],那么如果我们要用8位的,那么就一一对应;而16位,我们需要每次从外部取16位数据,但是HADDR中每个地址对应取出来的数是8位,所以我们就让地址一次加2,那么这样就相当于第0位没用了,所以我们才16位 HADDR[25:1]与FSMC_A[24:0]对应相连。在 16 数据宽度时,STM32 内部 AHB 地址总线HADDR[25∶ 1]对应的外部存储器地址为 FSMC_A[24∶ 0],即右 移 了 一 位。故 LCD 写 命 令 ( 数 据) 时 的 地 址 为0x6C000000 + 0x07FE (0x0800),而 不 是 0x6C000000 +0x03FE(0x0400),即 FSMC_A10 对应 HADDR11.
2、图像显示
四、图像保存
1、SD卡
本系统使用 SPI 模式操作 SD卡,SD 卡与主机的通信采用发送应答机制,即主机每发送一个命令,SD 卡都会给出一个应答,以告知主机该命令的执行情况或返回主机需要的数据.
2、FATFS 文件系统
使用 FATFS 来管理 SD 卡,实现文件的读/写功能。FATFS层次结构如下:
用户需要编写的是FATFS 模块提供的底层接口,包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟。
3、BMP编码
将采集到的图像以 BMP 的图片文件格式保存在 SD 卡中,保存流程如下:
五、测试结果与分析
测试过程中,图像画面显示清晰流畅,QVGA(320 × 240)输出达到10 帧/s,从图片中可以清晰地看出扬声器焊点的位置.
最后遗留问题
1、时序图怎么看