本文阐述一种基于STM32F407的图像远程采集终端,分别从终端采集硬件设计和终端采集软件设计两方面进行论述,并借助实验验证该采集终端的有效性和合理性。
1、终端采集硬件设计
系统的主体框图如图1所示,它主要由STM32F407芯片、OV7670CMOS图像传感器和上位机软件等几个重要部分组成。STM32F407是整个远程采集终端的核心,起到了承上启下的关键作用,一方面它将完成底层信号的获取和预处理,另一方面它将通过网络将采集到的彩色图像数据实时传送到上位机,本文将重点介绍这两部分的内容。
图1 系统主体框图
1.1、STM32F407与OV7670的硬件连接
在图2中,利用STM32F407的PH9~PH12、PH14,PI4、PI6、PI7接口接收OV7670经DCMI接口输出的8位图像数据。OV7670的SIO_C和SIO_D接口分别与STM32F407PF8、PF9引脚相连,通过该接口实现对摄像头的初始化配置。OV7670CMOS摄像头配置COM7寄存器实现采集到的是RGB565的16位图像数据,通过DMA将数据传输到图像数据缓冲区,当垂直同步中断到来时表示缓冲区中已存满一帧图像数据,控制器取出图像数据缓冲去的数据进行后续的处理,然后传输到上位机。摄像头与STM32F407的连接图如图2所示:
图2 OV7670与STM32F407连接电路图
1.2、STM32F407以太网通信接口电路
以太网通信接口模块是由CPU所内置的以太网MAC、专用10/100MPHYLAN8720A、HR11105A以及RJ45网口组成。以太网物理层器件LAN8720A作为TCP/IP协议的物理层器件。HR911105A为RJ45网络接口器件。当上位机PC有数据要求时,数据请求指令首先通过双绞线、HR911105A和STM32F407的以太网模块进入控制器,指令数据在其内部进行格式转换至SPI格式,然后通过SPI总线送至STM32F407,在STM32F407内实现SPI格式数据到以太网数据的转换。完成IP封装后的数据经过STM32F407的以太网模块、LAN8720A及HR911105A接口和双绞线传送至上位机。芯片引脚连接图如图3。
图3 LAN8720A与STM32F407硬件连接电路示意图
2、终端采集软件设计
软件设计主要包括在STM32F407上实现TCP/IP协议并与上位机通信,控制OV7670CMOS图像传感器实现图像数据的采集和传输等工作。STM32F407程序设计在KeiluVision4环境下实现,主要包括以下两部分:一是OV7670完成模拟信号的采集;二是远程传输数据的实现。本文主要介绍STM32F407程序的实现方法。
2.1、OV7670完成模拟信号的采集
在图像采集软件设计中,对系统各个部分的初始化是最为关键的一步,只有对各部分初始化成功以后,才能实现图像采集功能。图像采集初始化程序主要包括对系统时钟、SCCB接口、DMA、DCMI接口、OV7670摄像头等的初始化。在系统初始化设置成功以后,微控制器不断监测VSYNC信号电平变化,根据VSYNC产生的中断情况,控制对数据的读取。终端图像采集程序流程图如图4所示:
图4 图像采集程序流程图
(1)设置SCCB的相关参数
由于对摄像头工作参数的配置主要通过SCCB来实现,因此,在系统进行软件设计时,首先设计SCCB相关程序,进而通过SCCB设置摄像头的相关参数。SCCB设计的重要函数如下。
voidsccb_bus_init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;//结构体初始化
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;//SCCB_SIC:PE2、SCCB_SID:PE3
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//设置为输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//设置为推免模式
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//悬浮模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz时钟频率
GPIO_Init(GPIOF,&GPIO_InitStructure);}
(2)OV7670的寄存器的配置
在完成SCCB初始化、起始与停止等相关程序后,配置OV7670寄存器完成工作参数的设置,包括显示模式、输出格式、增益控制等。OV7670的寄存器配置如下:
constuint8_tOV7670_reg[OV7670_REG_NUM][2]={
{0x12,0x14};//设为VGA显示模式
{0x40,0xd0};//RGB565输出格式
{0x3e,0x00};//PCLK不分频
{0x71,0x00};//非测试模式
/*图像分辨率的配置*/
{0x32,0x80},
{0x17,0x16},
{0x18,0x04},
{0x19,0x02},
{0x1a,0x7a},
{0x03,0x03},......}
(3)DCMI接口及DMA部分配置
DCMI接口及DMA部分配置主要体现在DCMI接口、DMA控制器以及图像传感器用到的其他I/O端口所在时钟总线使能方面;由于篇幅所限,现将一些重要的配置,仅供参考。
DCMI_InitStructure.DCMI_CaptureMode=DCMI_CaptureMode_Continuous;//连续模式
DCMI_InitStructure.DCMI_SynchroMode=DCMI_SynchroMode_Hardware;//硬件时钟
DCMI_InitStructure.DCMI_PCKPolarity=DCMI_PCKPolarity_Falling;//下降沿
DCMI_InitStructure.DCMI_VSPolarity=DCMI_VSPolarity_High;//垂直极性
DCMI_InitStructure.DCMI_HSPolarity=DCMI_HSPolarity_High;//水平极性
DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_All_Frame;//捕获率
DCMI_InitStructure.DCMI_ExtendedDataMode=DCMI_ExtendedDataMode_8b;//8位数据模式
DCMI_Init(&DCMI_InitStructure);//初始化上面的摄像头配置
DCMI_ITConfig(DCMI_IT_VSYNC,ENABLE);//垂直同步中断
DMA_InitStructure.DMA_PeripheralBaseAddr=DCMI_DR_ADDRESS;//外设内存地址
DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)DataBuf;//内存地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;//数据方向从外设到内存
DMA_InitStructure.DMA_BufferSize=19200;//每次转移一帧数据
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址不改变
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存地址在每次写入后自增
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;//外设每单位长度DMA_InitStructure.DMA_MemoryDataSize
=DMA_MemoryDataSize_HalfWord;//内存没单位长度
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//运行模式,循环
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//优先模式,高
DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Enable;//开启先入先出模式
DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_Full;//FIFO水平阈值
DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;//内存单通道
DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;//外设单通道
DMA_Init(DMA2_Stream1,&DMA_InitStructure);//初始化上面的
DMA配置
DMA_ITConfig(DMA2_Stream1,DMA_IT_TC,ENABLE);//中断开启
系统启动后,首先利用各部分初始化函数对系统进行初始化,在整个系统初始化成功后,打开系统中断,准备进行图像采集。当垂直同步中断产生时,DCMI_IT_VSYNC置1,表示一帧图像数据采集完毕,微处理器通过控制DMA将数据传输到数据缓冲区中,等待数据的发送。
2.2、图像数据的远程传输
图像数据的远程传输,最关键的部分是对网络硬件的初始化以及对Lwip的初始化,远程传输程序首先是完成对Lwip协议栈的移植,然后设置好服务器端的IP地址和端口,绑定socket套接字到服务器地址,然后对客户端进行监听,当与客户端连接成功后,接收来自客户端的发送数据命令,接收到发送数据命令后,及时将缓冲区存放的图像数据通过TCP/IP协议发送到客户端。远程传输程序实现流程图如图5所示。
图5 远程传输程序实现流程图
3、测试结果
图6 远程采集终端实物图
图7 上位机测试结果图
按照上述终端采集硬件和终端采集软件的设计,通过软件调试成功后,并对软硬件进行实验验证,图6表示本远程采集终端的实物图,中间部分为信号采集处理板,它采集现场的图像信息,并通过以太网的方式发送给上位机,上位机通过显示采集到的图片,让远程操作者实时的知道现场的情况。图7表示上位机的测试结果。