基于STM32的图像编码与采集系统

2018-04-07 19:10丁红胜
电子设计工程 2018年5期
关键词:内存嵌入式摄像头

王 坤,丁红胜

(1.北京科技大学数理学院,北京100083;2.北京科技大学北京市弱磁检测及应用工程技术研究中心,北京 100083)

随着机器视觉、模式识别等技术领域的发展,图像处理技术与人们的生活息息相关,在安防、医疗等各个领域都有着极其重要的作用。作为图像处理的第一个重要环节便是图像的显示、编码与采集工作。目前图像采集的方案多种多样,都有自己的适用领域。例如:采用ARM9+WinCE的图像采集方案[1],但是WinCE嵌入式系统近几年使用率逐渐下降;基于FPGA的高速图像采集系统[2-5],FPGA图像的采集速度快,效果好,但是FPGA开发难度相对大,硬件成本相对较高,对于一些消费电子类不合适。相比于ARM9与FPGA,STM32的成本降低,开发难度小。文献[6-7]基于2.4寸的显示屏设计了图像显示系统,对于清晰度要求较高的场合还存在一定的不足。文献[6]采用的摄像头是200万像素的OV2640摄像头,这对于摄像头模块的利用率存在较大的浪费。文中主要利用STM32F407单片机、OV2640摄像头模块和TFTLCD液晶作为主要硬件设备,设计了一款图像的编码、显示与采集系统,分析了整个系统硬件软件设计。

1 硬件设计

系统的硬件结构作为整个系统最重要,最核心的部分,决定了整个系统的图像处理能力与稳定运行及成本。

1.1 主控芯片

作为最核心的部件,芯片的选取非常关键。综合考虑处理能力、开发难度、芯片成本问题,我们选用STM32F407ZGT6作为整个系统的主控芯片,该芯片在STM32系列中综合性能较强。某些功能相对STM32F1来说进行了重大改进,比如FSMC的速度,F4刷屏速度可达3 300 W像素/秒,而F1的速度则只有500 W左右[8]。对于提高视频流的显示质量极为有利。

1.2 OV2640摄像头模块

OV2640是OV(OmniVision)公司生产的一颗1/4寸的CMOS UXGA(1632*1232)图像传感器。该传感器体积小、工作电压低,提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB总线控制,可以输出整帧、子采样、缩放和取窗口等方式的各种分辨率8/10位影像数据[9]。OV2640的图像数据格式,一般用两种输出方式:RGB565和JPEG。OV2640自带压缩引擎,可以将原始数据流压缩成JPEG格式输出,避免了编写JPEG编码算法。使用过程中通过软件编程控制输出格式,具有较好的操作性。

STM32F4自带了一个数字摄像头(DCMI)接口,该接口是一个同步并行接口,能够接收外部8位、10位、12位或14位CMOS摄像头模块发出的高速数据流。可支持不同的数据格式:YCbCr4:2:2/RGB565逐行视频和压缩数据(JPEG)。

本系统使用STM32F407ZGT6的DCMI接口连接OV2640摄像头模块,该模块采用8位数据输出接口,自带24M有源晶振,无需外部提供时钟,采用百万高清镜头,单独3.3 V供电即可正常使用。

1.3 外部SRAM

STM32F407ZGT6自带192K字节的SRAM,对一般应用来说已经足够,但是对于图像编码采集等对内存要求高的场合明显不够用。因此选择了一颗1M字节的SRAM芯片:IS62WV51216用来存储处理图像。所使用的是TSOP44封装的IS62WV51216芯片,可以直接与STM32F4的FSMC相连接。

1.4 SD卡

此系统需要大容量的外部存储设备,来存储图像数据。目前常用的外部存储设备有U盘,FLASH存储器,以及SD卡等。综合比较最终选择适合此套系统的SD卡。将此套系统设计上标准的SD卡接口,使用STM32F4自带的SDIO接口驱动。SDIO模式允许4线的高速传输,传输速率快[10],最高通信速度可达48 MHz(分频器旁路时),最高每秒可传输数据24M字节,能够满足系统的图像数据的传输速度。SDIO与DCMI接口有一部分是公用引脚,使用时要注意分时复用。

1.5 液晶模块

随着电子产品的不断更新,各种显示界面的开发越来越多,由于TFT彩屏的性价比高,因而被广泛用在各种电子设备上作为显示屏[11]。综合考虑性能和成本,本系统选用的液晶模块为4.3寸TFTLCD。最大分辨率为800*480。TFTLCD模块采用16位的并方式与外部连接,不采用8位的方式,是因为彩屏的数据量比较大,尤其是在显示图片的时候,如果用8位数据线,就会比16位方式慢一倍以上。液晶驱动芯片为NT35510,驱动芯片自带显存GRAM。当软件配置好驱动芯片各个寄存器后,可以直接向GRAM里面发送数据,便可以在液晶屏幕上显示相应的图像信息。

STM32F4系列芯片都带FSMC接口,STM32F4的FSMC将外部设备分为两类:NOR/PSRAM设备、NAND/PC卡设备。它们共用地址数据总线等信号,具有不同的CS以区分不同的设备。TFTLCD就是用的FSMC_NE4做片选,其实就是将TFTLCD当成SRAM来控制。其操作时序和SRAM的控制完全类似,唯一不同就是TFTLCD有RS信号,但是没有地址信号。

该系统除包含上述的几个重要硬件模块之外,还包括按键、LED、USB转串口、STlink接口线路等硬件模块。整体的硬件框图如图1所示。

图1 硬件结构图

2 软件设计

2.1 文件系统

应用SD卡必须要使用文件系统管理,本系统选择FATFS文件系统来管理SD卡。FATFS是一个完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计[12]。它完全用标准C语言编写,所以具有良好的硬件平台独立性。FATFS模块的层次结构分为应用层、FATFS模块、底层存储媒介接口及RTC。最顶层是应用层,使用者无需理会FATFS的内部结构和复杂的FAT协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write和f_close等,就可以像在PC上读/写文件那样简单[13]。在此系统中按FATFS的移植方法移植了FATFS文件系统。

2.2 数据处理

JPEG是 Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。

OV2640可以直接压缩数据为JPEG格式,当输出数据是JPEG数据的时候,输出的JPEG数据以:0XFF,0XD8开头,以0XFF,0XD9 结尾,且在0XFF,0XD8之前,或者0XFF,0XD9之后,会有不定数量的其他数据存在(一般是0),编写程序时直接忽略这些数据,将得到的0XFF,0XD8-0XFF,0XD9之间的数据,存储在SD卡中,保存为.jpg/.jpeg文件,然后可以直接在电脑上采集到的JPEG图像。

BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式[14]。它可以不作任何变换地保存图像像素域的数据。BMP文件是由文件头、位图信息头、颜色信息和图形数据等四部分组成。本系统采用16位深度的数据格式,因为OV2640模块可直接输出RGB565格式数据,而且液晶模块也可以直接显示RGB565格式的像素点,避免对不同深度的位图进行转换,减少芯片的运算复杂度。

将LCD的显存保存为BMP格式的图片文件的步骤设计如下:

1)创建BMP位图信息,并初始化各个相关信息。设置BMP图片的分辨率为LCD分辨率(800*480)、BMP图片的大小(整个BMP文件大小)、BMP的像素位数(16位)和掩码等信息。

2)将BMP位图信息保存到一个BMP文件中。创建新BMP文件,写入BMP位图信息,之后才开始BMP数据的写入。

3)保存位图数据。将位图数据保存到上一步所创建的BMP文件里,只需要从LCD的GRAM里面读取各点的颜色值,依次写入第二步创建的BMP文件即可。注意:保存顺序(即读GRAM顺序)是从左到右,从下到上。

4)关闭文件。使用FATFS,在文件创建之后,必须调用f_close,文件才会真正体现在文件系统里面,否则是不会写入。这个要特别注意,写完之后,一定要调用f_close函数将文件关闭。

2.3 数据流向

数据的合理流向是图像采集的关键部分。对于大量图像数据的传输,若数据的流向与各个设备的存储传送速度处理不好经常会造成数据丢失的现象,此处应该设定好图像的缓存。本系统通过按键判断是存储JPEG图像还是BMP图像。

针对JPEG图像数据的传输传输,用到了STM32的外设DMA控制器。DMA,全称为:Direct Memory Access,即直接存储器访问。DMA是一种快速传送数据的机制,由 DMA控制器(DMA controller,DMAC)实现。DMA的应用能够有效减轻处理器的负担,可以大大提高数据传输的效率,从而提高系统性能[15]。STM32系列单片机将DMA以外设的方式集成到 Cortex之内[16]。

本系统要用到内存管理,存储图像数据要用到大数组,其他地方也要用到一些数组,所以,因此内部RAM无法再定义这么大的数组了。并且这个数组不能使用外部SRAM(实测:DCMI接口使用DMA直接传输JPEG数据到外部SRAM会出现数据丢失,所以DMA接收JPEG数据只能用内部SRAM),解决方法是使用DMA的双缓冲机制来读取,DMA双缓冲读取JPEG数据的原理框图如图2所示。

图2 双缓冲原理图

DMA接收来自OV2640的JPEG数据流,首先使用M0AR(内存1)来存储,当M0AR满了之后,自动切换到M1AR(内存2),同时程序读取M0AR(内存1)的数据到外部SRAM;当M1AR满了以后,又切回M0AR,同时程序读取M1AR(内存2)的数据到外部SRAM;依次循环(此时的数据处理,是通过DMA传输完成中断实现的,在中断函数中处理),直到帧中断,结束一帧数据的采集,读取剩余数据到外部SRAM,完成一次JPEG数据的采集。

其中,M0AR,M1AR所指向的内存,必须是内部内存,由于采用双缓冲机制,因此不必定义一个很大的数组,一次性接收所有JPEG数据了,而是可以分批次接收。

最后,将通过双缓冲机制存储在外部SRAM的JPEG数据,保存为.jpg/.jpeg存放在SD卡,就完成了一次JPEG图片的存储。

对于BMP图片的存储,相对来说要简单一些,从LCD的GRAM里面读取各点的颜色值,依次写入创建的BMP文件即可(如2.2小节描述的步骤)

2.4 逻辑设计

在每一个接口函数及硬件配置完成后,系统的整体逻辑结构并不复杂。整体执行顺序为:开机的时候先检测字库,然后检测SD卡根目录是否存在PHOTO文件夹,如果不存在则创建,如果创建失败,则报错(提示功能不可用)。在找到SD卡的PHOTO文件夹后,开始初始化OV2640,在初始化成功之后,就一直在屏幕显示OV2640拍摄的内容。按下KEY0,可以保存BMP格式的图像文件,分辨率与LCD分辨率相同。按下KEY1可以保存JPEG格式的图像文件(分辨率为UXGA,即1600*1200)。图片保存成功之后,蜂鸣器“滴”声提示存储成功。同时设计了LED指示灯,DS0还是指示程序运行状态,DS1用于指示DCMI帧中断。

程序简要流程图如图3所示。

程序设计的伪代码如下:

图3 程序流程图

3 结束语

通过实验验证,将存储有图像的SD卡放到电脑,可以成功查看采集到的图像信息。本套系统成功采集存储1 600*1 200的JPEG图片与800*480的BMP图片,图像质量较好。

本文基于STM32F4与OV2640及其他硬件设备设计完成了图像编码与显示存储系统。硬件方面成本低廉,功耗小,适合长时间稳定运行,而且充分发挥了STM32与OV2640的最大功能;软件方面,各模块驱动完善,开发简单,应用方便,可以在本套系统基础上进行裁剪,适应特定的应用。由于BMP图像编码过程没有使用调色板,因此数据量较大,系统在BMP图像的编码存储方面,速度还稍慢,但是对于一些特定的应用已经完全可以满足。

参考文献:

[1]蔡卫明.ARM9+WinCE嵌入式图像采集系统开发技术研究与实现[D].重庆:重庆理工大学,2009.

[2]潘明,陈元枝,李强.基于FPGA的图像采集系统的设计[J].研究与开发,2012,31(3):58-61.

[3]侯广琦,魏平,白延柱.多通道嵌入式高速图像采集存储系统的研究[J].仪器仪表学报,2011,32(11):2543-2548.

[4]曹山.基于FPGA的实时图像采集和处理系统[D].西安:西安工业大学,2015.

[5]杨林森.高速智能图像采集系统的设计[D].哈尔滨:哈尔滨工业大学,2015.

[6]王建,梁振涛,郑文斌等.STM32和OV2640的嵌入式图像采集系统设计[J].单片机与嵌入式系统应用,2014(9):47-48.

[7]张勇强,阳泳,余建坤.基于STM32图像采集与显示系统的设计与实现[J].电子世界,2016(2):34-36.

[8]刘军,张洋.精通STM32库函数版本[M].北京:北京航空航天大学出版社,2015.

[9]黄健,罗国平,杜丽君.基于STM32F407平台OV2640驱动程序设计[J].通讯世界,2015(10):246-247.

[10]徐建功,赵杰.基于STM32F103XX微处理器的Micro SD卡读写[J].嵌入式技术,2010(5):27-32.

[11]汤莉莉,黄伟.基于STM32的FSMC接口驱动TFT彩屏设计[J].现代电子技术,2013(20):139-144.

[12]崔鹏伟,闫学文.基于SD卡的FATFS文件系统的研究与应用[J].工业控制计算机,2013,26(11):141-142.

[13]张涛,左谨平,马华玲.FatFs在32位控制器STM32上的移植[J].电子技术,2011:25-27.

[14]宋叶未,叶建芳.BMP格式位图文件的分析及显示方法[J].现代电子技术,2011,34(27):5-7.

[15]梁科,李国峰等.通用多通道高性能DMA控制器设计[J].天津大学学报,2008(5):621-626.

[16]张滔.基于STM32单片机DMA机制的多通道数据采集[J].科技论坛,2013(30):27.

猜你喜欢
内存嵌入式摄像头
浙江首试公路非现场执法新型摄像头
摄像头连接器可提供360°视角图像
外部高速缓存与非易失内存结合的混合内存体系结构特性评测
“春夏秋冬”的内存
搭建基于Qt的嵌入式开发平台
嵌入式软PLC在电镀生产流程控制系统中的应用
奔驰360°摄像头系统介绍
Altera加入嵌入式视觉联盟
倍福 CX8091嵌入式控制器
基于内存的地理信息访问技术