基于STM32F407的图像采集系统设计*
2016-07-13任志敏
任志敏
(常州纺织服装职业技术学院机电工程系,江苏 常州 213164)
基于STM32F407的图像采集系统设计*
任志敏
(常州纺织服装职业技术学院机电工程系,江苏 常州 213164)
摘要:为了解决工业产品表面缺陷检测等需求,需要设计一款低成本的,具有普遍使用价值的数字图像采集系统。以Cortex-M4为内核的STM32F407VG控制器以其特有的DCMI接口无缝连接OV7725图像传感器,采集的图像源数据通过USB接口传输到PC等上位机。
关键词:图像采集;STM32F407;OV7725;USB
随着互联网+技术和工业4.0技术的不断推进,对于自动化技术,工业机器人技术的要求越来越高,需求越来越多。对于一些工业产品的检测,比如产品表面是否有缺陷,传统的做法通常是人工检测,在现有条件下,设计出一款高效,低成本,可靠性有保障的自动检测系统替代人工检测系统具有现实的需求。要实现自动检测系统,首先要解决的就是图像的采集和识别,本文正是基于这一需求尝试解决和实现一款低成本的,有益的,具有普遍使用价值的图像采集系统。
1总体结构设计
本文的设计需求是下位机采集摄像头的像素信号,通过USB接口传送到PC端上位机显示并处理。单从需求的角度出发,首先需要选择目前主流使用的控制器和图像感光元件,使之符合低成本、具有普遍使用价值等特点。
通过比较研究,控制器使用基于Cortex-M4内核的ST公司的STM32F407VG。32位的Cortex-M4内核处理器除了具备低功耗、低成本和易于使用的优点外,还强化了运算能力,增加了浮点、DSP、并行计算等,用于满足控制和信号处理混合处理的需求。STM32F407VG控制器是有ST(意法半导体)公司推出的基于Cortex-M4内存的32位嵌入式CPU,其最高主频可达168 MHz,集成1 024 KByte的Flash,192 Kbyte的SRAM,具有DCMI(数字摄像头接口)和USB OTG FS接口[2]。
OV7725是Omnivision(美国豪威)公司生产的CMOS感光芯片,其最大分辨率为640×480,30万像,可以设置不同分辨率。OV7725支持YUV,RGB等不同图像格式的数据输出。OV7725主要有三类引脚:一是D0~D9十个数字信号输出引脚,本文使用D9~D2八个数字信号引脚;二是VSYNC(帧输出),HREF(行输出),PCLK(像素信号输出)三个控制引脚;三是SCCB_D,SCCB_C两个寄存器配置引脚[1]。
不管是STM32F407VG还是OV7725都是目前主流使用的控制器和图像传感器,而且STM32F407集成了DCMI接口、I2C接口和USB接口,DCMI接口可以无缝对接OV7725的数据和控制引脚,I2C接口可以用来连接OV7725的SCCB引脚,USB接口可以作为与PC上位机通信的接口。因此结合需求和选型,本文设计了如图1所示的总体设计方案。
2软件设计
2.1软件构思
整个图像采集系统的数据流程是PC端上位机程序通过USB接口发起采集信号,然后STM32F407VG控制OV7725获取一帧图像数据,最后通过USB接口传输回PC端并显示。
软件设计主要分成三个部分:一是STM32F407VG通过DCMI接口采集OV7725的图像信号;二是采集的信号通过USB传输到PC端;三是PC端上位机程序控制和显示程序。
图像采集首先需要考虑的问题是输出数据的格式和分辨率大小。为了使得本图像采集系统更具有通用性,因此PC端上位机程序设计接收YUV和RGB Raw Bayer两种图像格式数据输出。输出图像分辨率的大小由需求和STM32F407VG本身的SRAM大小决定。STM32F407VG的SRAM由可供所有AHB主控总线访问的(112+16)Kbyte和只供CPU通过数据总线访问的64 Kbyte组成,结合实际需求,本文设计的OV7725一帧图像数据输出分辨率大小为128×120。OV7725 YUV输出的格式之一是Y U Y V Y U Y V…,RGB Raw Bayer输出格式为R G R G…,G B G B…,因此一帧YUV数据占据128×120×2=30 720 Byte内存空间,而一帧RGB Raw Bayer数据占据128×120=15 360 Byte内存空间。
2.2下位机程序设计
STM32F407VG通过DCMI接口采集OV7725图像信号比较简单,主要就是配置和设置等初始化工作,程序流程如图2所示。
如前文所述,一帧YUV数据的存储空间需要30 720 Byte,因此首先声明一个全局数组用于存放图像数据,需要注意的是,这个全局数组需要用4个对齐的方式声明:
__align(4) u8 rawpixel[30720];
SCCB初始化用到STM32F407VG的PB10和PB11两个引脚,可以用通用IO模拟SCCB时序和STM32F407VG I2C自带的库函数实现SCCB两种方式与OV7725寄存器配置引脚通信。OV7725寄存器配置主要包括配置YUV和RGB Raw Bayer格式输出,以及分辨率设置。配置成YUV,输出顺序为Y U Y V…的寄存器配置是:
SCCB_WriteReg(0x12,0x40);
SCCB_WriteReg(0x0C,0x10);
配置成RGB Raw Bayer的寄存器配置是:
SCCB_WriteReg(0x12,0x43);
配置分辨率为128x120输出的寄存器配置是:
// ((int)0x20 << 2) | (0x00 & 0x03) = 128
SCCB_WriteReg(0x29,0x20);
// ((int)0x3C << 1) | ( (0x00 & 0x04) >> 2) = 120
SCCB_WriteReg(0x2C,0x3C);
SCCB_WriteReg(0x2A,0x00);
根据OV7725的说明文档,图像宽度输出的像素大小是由0x29号寄存器值左移两位与0x2A号寄存器值的低两位进行位或运算,图像高度输出的像素值是由0x0C号寄存器值左移一位与0x2A号寄存器值的第2位进行位或运算。
DCMI接口初始化主要是把STM32F407VG连接OV7725的引脚设置成数字和控制引脚功能,需要特别注意的是默认情况下,OV7725的帧信号VSYNC是低电平有效,行信号HREF是高电平有效,但是在DCMI初始化时,要求设置的是VSYNC和HREF无效时电平信号状态。
DCMI的DMA传输初始化设置DMA的参数,主要是把DMA存储地址设置成图像数据存储数组的首地址。所有初始化工作完成后就等待上位机发出开始采集的命令。
下位机第二部分程序是通过USB接口接收上位机命令,以及传输图像采集数据到PC端。STM32F407VG支持USB主机和从机功能,完全符合USB2.0规范的On-The-Go补充标准,主机支持LS(低速)和FS(全速)收发器,从机支持FS(全速)收发器,本文把STM32F407VG的USB接口设置成USB从机功能,接受PC端USB主机控制。STM32F407VG支持控制、大块数据、中断和同步四种传输方式。考虑到本文一帧图像数据量不是很大,因此文本USB采用控制传输方式。虽然ST公司提供的丰富的USB驱动库函数,程序设计时调用相应的库函数即可,但是需要用户自定义USB参数,包括USB设备描述,配置描述,接口描述和端点描述,主要需要设置PID,VID,控制端点包长度等。设置好参数以后,直接调用USB初始化函数:
USBD_Init(&USB_OTG_dev,
USB_OTG_FS_CORE_ID,&USR_desc,
&CAM_cb, &USR_cb);
这五个参数的含义分别是:
USB_OTG_dev: 申明一个USB的全局句柄实例,用于存储USB通信中USB内核需要使用的的各种变量、状态和缓存等,所有有关USB的操作都需要用到这个句柄实例。
USB_OTG_FS_CORE_ID:决定该USB是高速还是全速设备。
USR_desc:USB设备描述列表
CAM_cb:USB通信的回调函数。
USR_cb:用于处理USB连接,断开等操作时用户处理的额外信息。
初始化USB后,USB收发过程中会调用CAM_cb中定义的回调函数,由于本文采用USB控制传输,因此USB通信通过ep0收发数据。根据USB的规范,控制端传输主要是由一个setup包组成,其C语言定义结构如下:
typedef struct usb_setup_req {
uint8_t bmRequest;
uint8_t bRequest;
uint16_t wValue;
uint16_t wIndex;
uint16_t wLength;
} USB_SETUP_REQ;
其中bmRequest描述了USB数据传输方向,请求类型等参数,本文采用类请求;bRequest是描述符的请求类型,包括标准请求类型和用户自定义请求类型;wValue是根据不同的请求而设置不同的值,一般用于传送参数;wIndex是根据不同的请求而设置不同的值。一般用来说明端点号或者说明接口标识;wLength是根据请求来决定下一阶段发送数据的长度,在设备描述符里面设定为64字节。根据USB的setup包描述,本文设定了表1的USB通信请求。
其中bRequest值为01,03,04为USB传输的OUT方向,即从PC到STM32F407VG,02为USB传输的IN方向,即从STM32F407VG到PC。
表1 USB通信请求
2.3上位机程序
PC端上位机的USB驱动程序采用libusb-win32开源USB驱动程序库,上位机采用VC6编译器,通过调用libusb-win32的API实现与STM32F407VG的USB接口通信。
libusb-win32是由libusb衍生出来的,提供了一系列符合USB规范的USB操作API开源库,即用户程序可以通过调用libusb-win32的API来调用操作系统内核的底层即可[3]。
libusb-win32几乎支持所有的windows操作系统,其后续版本支持32位和64位win7/8/10,本文使用的是1.1.6.0版本,PC端的USB驱动程序和上位机程序在win7 32/64和win10 64位系统通过测试。PC端USB驱动程序可以很方便利用libusb-win32提供的inf-wizard工具生成。如图3所示。
图3 libusb-win32驱动程序生成工具截图
只要填入和下位机设置一样的VID和PID就可以生成与PC平台相符合的驱动程序。PC端程序的程序流程图如图4所示。
图4 PC端程序流程图
打开USB设备就是调用libusb-win32的API初始化usb接口,通过VID和PID查找到对应的USB设备,打开并配置好接口;接下来根据表1发出对应的命令值,控制下位机配置OV7725是YUV还是RGB Raw Bayer格式输出;配置完成后,再次发出采集命令等待接收一帧图像数据,最后显示。PC端程序的窗口截图如图5所示。
图5 PC端上位机程序窗口截图
通过USB监控采集的数据看,控制断点传输1 024个字节需要时间大约是19.95 ms,即通信速率约410 Kbps。
3结束语
本文以目前主流使用的STM32F4系列控制器和OV7725图像传感器,实现了通过USB的控制事务通道传输图像Raw数据的图像采集系统,在以后的设计中,可以尝试通过USB的大块数据事务通道传输图像数据,加快数据传输速率。
参考文献
[1]Ommvision.OV7725 Datasheet [EB/OL].(2007-12-17).http://www.zhopper.narod.ru/mobile/ov7725_full.pdf
[2]ST.STM32F407VG Datasheet.[EB/OL].(2012-1).http://pdf1.alldatasheet.com/datasheet-pdf/view/504999/STMICROELECTRONICS/STM32F407VG.html.
[3]Libusb.[EB/OL].(2014-06-01).http://www.libusb.org/wiki/libusb-win32.
A Design of Image Capture System
Ren Zhimin
(DepartmentofElectromechanicalEngineering,ChangzhouTextileGarmentInstitute,ChangzhouJiangsu213164,China)
Abstract:In order to detect the surface flaw of industrial products, it is necessary to design a low-cost and useful digital image capture system. With the Cortex-M4 core, the STM32F407VG controller seamlessly connects OV7725 image sensor by DCMI interface. The image raw data is transferred from the controller to PC and other hosts through USB.
Key words:image capture; STM32F407; OV7725; USB
收稿日期:2016-01-16
基金项目:常州纺织服装职业技术学院科研基金资助项目(CFK201505)
作者简介:任志敏(1981- ),男,江苏常州人,讲师,工程师,硕士,研究方向:机器视觉,嵌入式系统。
文章编号:1674- 4578(2016)03- 0061- 03
中图分类号:TP393.11
文献标识码:A