基于STM32的照相机系统的实现_第1页
基于STM32的照相机系统的实现_第2页
基于STM32的照相机系统的实现_第3页
基于STM32的照相机系统的实现_第4页
基于STM32的照相机系统的实现_第5页
已阅读5页,还剩19页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录第1章绪论 11.1研究背景与意义 21.2研究内容 4第2章系统方案设计 42.1整体框架设计 42.2主控模块 52.3液晶显示模块 122.4存储器模块 162.5图像采集模块 21第3章系统软件设计 293.1顶层程序设计 293.2系统初始化程序设计 293.3拍照处理程序设计 32第4章系统功能测试分析 34总结 36参考文献 37第1章绪论一幅图像可以描述为“一个平面上与位置成函数关系的光强或反射率的变化〞。相机是一台捕捉并记录图像的设备,其中“捕捉〞是指将一幅图像中包含的信息转换成相应的以可以重现的方式存储的信号[1]。在传统卤化银的相机中,图像信息被转换成胶片中的化学信号,并存储在胶片中对应的点上。而现代的电子相机是通过图像传感器将捕捉到的图像信号转换成了电子信号,并将图像信息存储在内存中。电子相机又根据存储的方式不同,分为模拟相机和数码相机。图1.1数字系统图像捕捉原理物镜:聚焦图像,折射来自物体的光线,使光线会聚成为一幅清晰的图像;光圈:决定进入镜头的光量,通过光圈数值计量。光圈数值越大那么光圈开口越小;快门:快门速度决定曝光时间长短,通常以一秒的十分之一计量。快门速度越快那么曝光时间越短;CCD:光耦合组件。1.1研究背景与意义自1991年第一款商用数码相机面市以来,数码相机的性能有了极大的提高[2]。作为数码相机的核心部件———感光元件CCD像素数已从初期的10几万开展到目前的2千万以上,另一种感光元件CMOS在图像质量方面已经根本上与CCD不相上下,因而在专业级数码相机方面得到广泛应用。变焦倍率已从2~3倍增加到10倍以上[2]。至于存储器,不仅品种多,且存储量已达8GB,数码相机的功能也从单拍照开展到十机一体的多媒体拍照[3]。1.1.1电子相机的早期开展电子照相的设想由来已久,最早于1973年出现在著名的半导体制造商德州仪器公司〔TexasInstrumentsIncorporated〕提出的一项专利申请。在实施方案中,半导体图像传感器位于可伸缩镜头前方,其捕捉的图像信号被传输到电磁记录头,并存储到一个可移动的环形磁鼓中。然而由于1973年传感器技术与磁记录技术还在起步阶段,该想法并没有付诸在真正的产品之中。直到1981年,这一年对于相机制造商而言是极其重要的一年,索尼公司发布了一款电子相机的原型,被称为“Mavica〞。这种原型相机将半导体图像传感器捕获到的图像信号记录在磁性软盘上,包含有单镜头反光式取景器、CCD图像传感器、信号处理电路和软盘驱动器。但是记录到软盘上的图像信号是一种改进的视频信号,属于模拟信号,故它并非是一款完整意义上的数码相机。在索尼Mavica发布后,数家相机制造商和电子设备制造商组成了联盟来推进索尼的设想。他们建立了一套电子照相系统的标准,名为“静态视频系统〞。但由于此系统基于NTSC的视频格式,图像的画质不是太好,镜头相机的使用只被局限在无须纸质打印的小应用之中。图1.2索尼Mavica〔原型〕1.1.2数码相机的出现随着数字技术的进步,模拟电子相机向数字化过渡,在1988年的世界影像贸易博览会上,第一台数码相机〔富士DS-1P〕发布。该相机将数字图像信号记录在一块容量为2MB的静态RAM卡上。虽然这款富士原型机没有上市销售,但随着对其概念的不断改进和完善,有几款数码相机陆续上市。1995年,卡西欧QV-10上市销售,由于其不仅是一台相机,更是一个便携式图像浏览器,即在用户拍完照后能即刻共享和欣赏图片,受到年轻一代的热烈欢送。1.1.3像素数量之战随着市场的日益增长,数码相机的前景变得愈创造朗,许多厂家开始了数码相机的开发。半导体制造商也认识到其中蕴含的重大商机,开始研发专用于数码相机上的图像传感器。1996年奥林巴斯发布了C-800L型数码相机,其CCD图像传感器约含80万像素。随后,富士和奥林巴斯与次年分别发布130万像素的DS300和140万像素的C-1400L。1999年,多家厂商发布了200万像素的机型,而在2000年发布300万像素的机型时情形再次发生。直到2004年,出现了高达800万像素的傻瓜相机和1670万像素的单反相机。图1.3卡西欧OV-10图1.4单反照相机本课题研究的意义市场上的照相机大多都是像素很高,体验也非常不错的照相机,但这些数码照相机太过于独立,而且价格也不低。在有些场合,需要把照相功能嵌入到某个系统中,完成一些简单的摄像和保存图片的功能,本次课设实现的STM32照相机的系统正好满足要求。STM32照相机的程序还可以以板级支持包的方式根据需求对功能进行裁剪,功耗低,本钱也很低。1.2研究内容本文主要研究STM32照相机的程序设计流程,从硬件的参考手册入手。根据芯片手册或模块资料,配置相关存放器,并对信号的时序做出分析,搭建出每个器件操作的完整的编程模型。再选择出适宜的算法,使各个模块之间协调工作,最终设计出较低本钱、可移植性较好的STM32照相机系统。第2章系统方案设计2.1整体框架设计整个照相系统根据功能划分,可分为:主控模块、液晶显示模块、存储器模块、图像采集模块。另外,在实际拍照中,还需要参加按键作为拍照的按钮、LED灯作为操作指示灯。在器件选型上,在综合了相机像素、存储容量、本钱,以及功耗各方面的考虑后,决定选用STM32最小系统作为主控模块,OV7725摄像头作为图像采集模块,ILI9341作为液晶驱动,容量为128MB的SD卡作为存储模块,见图2.1。图2.1STM32照相机系统框图2.2主控模块2.2.1STM32F103ZET6芯片功能介绍〔1〕内核:ARM32位的Crotex-M3的CPU,最高72MHZ工作频率;可进行单周期的乘法和硬件除法。〔2〕存储器:256KB/512KB的FLASH;高达64KB的SRAM;带4个片选控制的静态存储器控制器:SRAM、PSRAM、NOR和NAND;并行LCD接口,兼容8080/6800模式。〔3〕时钟、复位与电源管理:2.0~3.6V供电和I/O引脚;上电、断电复位〔POR/PDR〕,可编程电压监测器〔PVD〕;4~16MHZ晶体振荡器;内嵌经出厂调校的8MHZ的RC振荡器;带校准功能的32kHZRTC振荡器。〔4〕低功耗:睡眠、停机和待机模式;VBAT为RTC和后备存放器供电。〔5〕3个12位模数转换器,1μs转换时间(多达21个输入通道)。〔6〕DMA:12通道DMA控制器,支持的外设:定时器,ADC,SPI,I2C和USART。〔7〕多达112个快速I/O端口:51/80/112个I/O口,所有I/O可以映像到16个外部中断。〔8〕调试模式:串行单线调试〔SWD〕和JTAG接口;Cortex-M3内嵌跟踪模块〔ETM〕。〔9〕多达11个定时器:4个16位定时器,每个定时器有多达4个用于输入捕获/输出比拟/PWM/脉冲计数的通道和增量编码输入;2个16位带死区控制和紧急刹车,用于电机控制和PWM高级控制定时器;2个看门狗定时器;系统时间定时器;2个16位根本定时器用于驱动DAC。〔10〕多达13个通信接口:多达2个I2C接口〔支持SMBus/PSMBus〕;多达5个USART〔支持ISO7816接口,LIN,IrDA接口和调制解调器接口〕;多达3个SPI接口〔18Mbit/s〕;CAN接口;USB2.0全速接口;SDIO接口。CRC计算单元,96位的芯片唯一代码。ECOPACK封装。2.2.2时钟树为了满足系统时钟和不同外设时钟的需求,STM32芯片内部对系统时钟和多种总线时钟进行了管理,形成了时钟树。为了低功耗的需要,系统时钟、中断、GPIO以及外设时钟都设置了开关。所以,要求在系统启动前设置内部或外部时钟晶振频率和分/倍频数,在使用GPIO管脚时要翻开GPIO挂接在总线上的时钟开关,在使能中断和使用外设时都要翻开对应的时钟开关。下面介绍STM32的时钟源和时钟系统框图:在STM32的内部共有五个时钟源,分别为HSI、HSE、LSI、LSE、PLL[4]。〔1〕HSI〔高速内部时钟〕为RC振荡器,其频率为8MHz。〔2〕HSE〔高速外部时钟〕可接石英或陶瓷谐振器,还可以接外部时钟源,频率范围为4MHz~16MHz。〔3〕LSI〔低速内部时钟〕为RC振荡器,其频率为40kHz。〔4〕LSE〔低速外部时钟〕,可接频率为32.768kHz的石英晶振。〔5〕PLL〔锁相环〕,其时钟输入源可选择为高速内部时钟的二分频、高速外部时钟或其二分频。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。图2.2STM32时钟树2.2.3GPIO及功能复用在使用STM32上的GPIO

时,都要对其存放器进行配置。包含2个32bit数据存放器(GPIOx_IDR和GPIOx_ODR),1个32

bit置位/复位存放器(GPIOx_BSRR),2个32

bit配置存放器(GPIOx_CRL和GPIOx_CRH),以及1个16bit复位存放器(GPIOx_BRR)和1个32

bit锁定存放器(GPIOx_LCKR)。为方便用户使用,GPIO的存放器在GPIOx结构体中实现:Typedefstruct{__IOuint32_tCRL;__IOuint32_tCRH;__IOuint32_tIDR;__IOuint32_tODR;__IOuint32_tBSRR;__IOuint32_tBRR;__IOuint32_tLCKR;}GPIO_TypeDef;另外,GPIO

端口上的每一位可以由软件分别配置成多种模式〔在GPIO_InitStruct体中实现〕,即每一位都可以自由编程。Typedefstruct{uint16_tGPIO_Pin;GPIOSpeed_TypeDefGPIO_Speed;GPIOMode_TypeDefGPIO_Mode;}GPIO_InitTypeDef;但要注意的是,I/0

端口存放器必须按4个字节〔即32bit〕被访问,不支持只访问某一位或某几个字节。假设要只进行位操作,可以将存放器的值与某一32位数值进行按位与/或/同或/异或等操作实现。〔1〕GPIO根本设置图2.3GPIO内部结构框图GPIO类型GPIO_Mode共8种:=1\*GB3①GPIO_Mode_AIN

模拟输入:应用ADC模拟输入,或者低功耗下省电;=2\*GB3②GPIO_Mode_IN_FLOATING

浮空输入:可以做按键识别,串口接受端RX

;=3\*GB3③GPIO_Mode_IPD

下拉输入:内部下拉电阻输入;=4\*GB3④GPIO_Mode_IPU

上拉输入:内部上拉电阻输入;=5\*GB3⑤GPIO_Mode_Out_OD

开漏输出:当输出为0时,IO内部硬件接地,当输出为1时,引脚是悬空的,需要外接上拉电阻,才能实现输出高电平。要想实现双向通信,外接上拉电阻后,可先向IO口写入1,此时的IO的电平会随着外部电路的电压值变化,从而完成输入功能;=6\*GB3⑥GPIO_Mode_Out_PP

推挽输出:输出0时,内部接低,输出1

时,接的是电源电压VCC,但读输入的值是未知的;=7\*GB3⑦GPIO_Mode_AF_OD

复用开漏输出:主要针对一些片内外设功能〔如:串口TX1,SPI通信〕;=8\*GB3⑧GPIO_Mode_AF_PP

复用推挽输出:片内外设功能〔如:I2C的SCL,SDA〕。对于输出引脚除设置引脚的输出模式外,还需设置GPIO引脚速率GPIO_SpeedGPIO引脚速率是指I/O口驱动电路的响应速度〔不是信号的输出速率〕,对于STM32上的输出引脚需要选择速度:2MHz、10MHz和50MHz。根据不同的外设,合理地选择不同的输出驱动模块,以到达最正确的性噪比和最低的系统功耗。比方,对于高频的驱动电路,噪声较高,所以不需要高的输出频率时,选用低频驱动电路,这样非常有利于提高系统的抗电磁干扰性能。〔2〕GPIO功能复用复用功能是指内置外设与I/O口共用了引出管脚,也可能出现不同的功能对应同一管脚。假设将GPIO配置成复用输出功能,那么I/O将不能使用输出存放器,并在内部结构中与片上外设的输出信号连接。如果通过编程将某个GPIO引脚配置成复用输出功能,但是外设没有启动,其输出将不确定。使用默认复用功能前必须对端口位配置存放器编程。=1\*GB3①对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动;=2\*GB3②对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏);=3\*GB3③对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏),此时的输入驱动器被配置成浮空输入模式。2.2.4中断〔1〕中断根本概念中断是指当软件或硬件出现需要时,CPU暂时停止当前程序的执行,转去处理应对突发情况的程序的执行请求,在处理事件后完后又返回到源程序继续执行的过程。触发中断的事件称为中断源,而中断源向内核申请中断的入口就称为中断通道。也就是说,中断通道给中断源提供一个向内核申请中断的入口,中断源通过中断通道向内核提出中断申请。一个中断通道可以对应一个中断源,也可以对应多个;有的外设只对应一个,而有的外设可以对应多个中断通道。中断优先级是针对中断通道的。图2.4中断通道、中断源与外设的关系〔2〕中断优先级

STM32的中断优先级可分为响应式优先级或抢占式优先级。其中,抢占式优先级的中断会打断当前的主程序或者中断程序运行,是实现中断嵌套的一种手段。对于每一个中断通道,Cortex-M3内核的头文件“core_m3.h〞中都提供了一个8位的存放器IP,来确定该中断通道的抢占式优先级或响应式优先级。〔3〕中断相关存放器

NVIC结构体〔core_m3.h〕内核中的存放器与中断控制SCB结构体〔core_m3.h〕相关存放器外设相关存放器外设中的存放器〔如:TIM2的TIM2_DIER中断使能存放器〕……在配置中断时主要使用中断控制〔NVIC〕存放器组中的存放器,可以通过NVIC的结构体来实现:typedefstruct{vu32ISER[2];u32RESERVED0[30];vu32ICER[2];u32RSERVED1[30];vu32ISPR[2];u32RESERVED2[30];vu32ICPR[2];u32RESERVED3[30];vu32IABR[2];u32RESERVED4[62];vu32IPR[11];}NVIC_TypeDef;配置这些内核存放器时〔以按键中断为例〕STM32的库函数中提供了中断初始化结构体:typedef

struct

{

uint8_t

NVIC_IRQChannel

uint8_t

NVIC_IRQChannelPreemptionPriority;

uint8_t

NVIC_IRQChannelSubPriority;

FunctionalState

NVIC_IRQChannelCmd;

}

NVIC_InitTypeDef;

在按键中断初始化时,需进行如下操作:第一步:设置抢占优先级的分组;第二步:选择外部中断输入引脚,设置抢占优先级和响应优先级;第三步:使能中断通道,中断设置成功。〔4〕总中断的开和关STM32/Cortex-M3是通过改变CPU当前优先级来实现允许/禁止中断的。在STM32固件库中〔stm32f10x_nvic.h和stm32f10x_nvic.c〕定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU当前优先级,从而到达控制所有中断的目的。/*关闭总中断的两个函数*/

void

NVIC_SETPRIMASK(void);

void

NVIC_SETFAULTMASK(void);/*使能总中断的两个函数*/

void

NVIC_RESETPRIMASK(void);

void

NVIC_RESETFAULTMASK(void);

2.3液晶显示模块2.3.1ILI9341驱动器介绍ILI9341是一个用于TFT液晶显示的单芯片控制驱动器,具有26万色的240RGBX320像素显示解决方案,它的组成包括一个720通道的源极驱动器,一个320通道的栅极驱动器,172800字节用于图形显示的GRAM,以及供电电路[5]。ILI9341支持8/9/16/18位数据总线的MCU接口,6/16/18位数据总线的RGB接口,以及3/4线的SPI接口,移动图像区域可以通过窗口地址功能在内部GRAM来指定,指定的窗口区域可以选择性地更新,因此,可以在图像区域同时独立地显示移动图像[6]。ILI9341可以使用1.65~3.3V的I/O接口电压和一个对应的电压跟随电路来产生驱动LCD的电压。ILI9341有精确的电压控制〔软件控制〕,来支持全色,8色显示模式和睡眠模式,是理想的中小型手提产品的LCD驱动器。2.3.2FSMC总线FSMC(FlexibleStaticMemoryController,可变静态存储控制器)是STM32系列中内部集成256KB以上FLASH,后缀为xC、xD和xE的高存储密度微控制器特有的存储控制机制[7]。之所以称为“可变〞,是由于通过对特殊功能存放器的设置,FSMC能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度,从而使得STM32系列微控制器不仅能够应用各种不同类型、不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同时扩展多种不同类型的静态存储器,满足系统设计对存储容量、产品体积以及本钱的综合要求[8]。〔1〕FSMC框图及配置:图2.5FSMC框图FSMC总线配置流程:第一步:选择适宜的存储块映射NORFLASH存储器,共有4个独立的存储块可以用于与NORFLASH、SRAM和PSRAM存储器接口,每个存储块都有一个专用的片选管脚。第二步:使用或禁用地址/数据总线的复用功能;第三步:选择所用的存储器类型:NORFLASH、SRAM或PSRAM〔其中NORFLASHMemory和SRAM都支持同步或异步读写时序的存储器〕;第四步:定义外部的存储器的数据总线:8bit/16bit;第五步:使用或关闭NORFLASHMemory的突发访问模式;第六步:配置等待信号的使用:开启或关闭,极性设置,时序配置;第七步:使用或关闭扩展模式:扩展模式用于访问具有不同读写操作时序的存储器。〔2〕时序参数及计算异步读写时序的参数及时序:ADDSET:addresssetuptime;ADDHOLD:addressholdtime;DATAST:datasetuptime图2.6异步读时序图2.7异步写时序读/写访问时间为:((ADDSET

+

1)

+

(DATAST

+

1))

×

HCLK

;写使能信号由低到高的时间为:tWP=DATAST

×

HCLK;考虑最大的读/写访问时间,FSMC和存储器的内部延时,数据建立时间应满足:DATAST

=

(tAVQV

+

tsu(Data_NE)

+

tv(A_NE))/HCLK

–

ADDSET

–

4。本次毕设LCD驱动的存储器接口是挂接在FSMC总线上〔FSMC总线上的LCD连接见图2.8〕,选用NORFLASH存储器的BANK1的第4块区域,并且禁用地址/数据总线的复用功能和存储器的突发访问模式,设置数据总线宽度为16位,读写时序为异步时序,并关闭扩展模式。其实只需对下面的三个存放器做如下操作:FSMC_Bank1->BTCR[6]=0X5011;FSMC_Bank1->BTCR[7]=0X0809;FSMC_Bank1E->BWTR[6]=0X0301。图2.8LCD与FSMC总线连接2.3.3LCD初始化表2.1LCD存放器操作局部指令集指令描述指令描述指令描述EDH电源序列控制F7H泵比控制C5HVCOM控制1E8H驱动时序控制AB1H帧速率控制C7HVCOM控制2EAH驱动时序控制BB6H显示功能控制F2H使能3GCBH功耗控制AC0H功耗控制126H 伽马设置CFH功耗控制BC1H功耗控制2E0H正极伽马校准2AH列地址设置3AH像素格式设置E1H负极伽马校准2BH页地址设置11H 退出睡眠模式2CH存储器写36H 存储器访问控制29H 开显示2EH读存储器FSMC总线〔STM32引脚复用FSMC的硬件接口〕配置完成后,就能通过STM32来对LCD内的存放器进行读写操作了。本章节中所有关于时钟的设置,GPIO的配置,引脚的复用功能,中断函数将在下一个章节集中讲解,LCD内部的存放器比拟多,可以对照LCDILI9341的数据手册通过命令来指定配置存放器,并输入相应的参数。LCDILI9341的操作指令可分为:一级、二级、三级指令。LCD初始化和显示图片时需要用到的指令如表2.1。关于LCD的初始化代码,不同的液晶驱动程序是不一样的,在购置液晶屏时厂家会提供源代码,所以这里不再展开。2.4存储器模块2.4.1SD卡2.0协议SD存储卡兼容MMC卡的接口标准,采用9针的接口〔CLK为时钟线,CMD为命令响应线,DATA0~DATA3为双向数据传输线,VDD、VSS1和VSS2为电源和地〕,最大的工作频率是25MHZ。SD卡系统支持SD卡模式和SPI模式〔如表2.2和表2.3〕,两种通信协议[9]。SD卡在结构上使用一主多从星型拓扑结构。虽然SPI的初始化流程比SDIO简单得多,但SDIO用4根数据线传输,而SPI只是串行传输,SDIO的传输速度明显高于SPI。在传输图像时对传输速度要求较高,故本次毕设选用SD模式的接口〔SDIO〕。表2.2SD卡模式下的接口定义管脚类型描述备注DATA0~DATA2输入/输出/推挽类型数据总线CM输入/输出/推挽类型卡监测数据位DATA3CLK输入时钟引脚CMD推挽命令/响应串行〔1〕SDIO初始化SD_ErrorSD_Init(void);初始化函数包括GPIO设置,存放器的复位,上电操作,SD卡的信息获取。假设初始化成功返回值为0。表2.3SPI模式下的接口定义管脚类型描述备注CS输入片选低电平有效DI输入数据输入端串行DO输出数据输出端串行CLK输入时钟引脚在进行初始化之前先了解几个命令和SD卡内部存放器〔见图2.9和表2.4〕:图2.9SD卡内部结构及存放器CMD0:将所有的卡复位到理想状态;CMD8:发送主机的提供的电压范围,并响应SD卡支持的电压范围;CMD55:指定下一条命令是应用命名;ACMD41:发送主机支持的卡的容量,并响应SD卡的OCR中的内容;CMD2:获取SD卡的ID;CMD3:获取SD卡的相对地址。SDIO模式下的初始化流程:当HOST上电后,使所有的卡设备处于卡识别模式,完成设置有效操作电压范围,卡识别和请求卡相对地址等操作。第一步:发送指令CMD0使卡设备处于空闲状态,进入第二步。第二步:发送指令CMD8,假设卡设备有响应,说明此卡为SD2.0以上,此时会响应SD卡支持的电压范围,进入第三步;假设没有响应,那么为SD2.0以下的SD卡,执行第四步。第三步:假设主机支持大容量的SD卡,将HCS置1,否那么置0。发送指令CMD55+ACMD41,假设响应CCS为1,那么SD卡为大容量的存储器,进入第四步;否那么为标准容量的SD卡,进入第五步。第四步:HCS置0,并发送CMD55+ACMD41,假设有响应,那么为标准容量的SD卡,进入第五步;假设无响应,那么返回没有找到可用的SD卡。第五步:发送指令CMD2获取CID。第六步:发送指令CMD3获取RCA(relativecardaddress),初始化完成。表2.4SD卡内部存放器存放器位宽〔bit〕描述CID128卡标识号RCA16相对卡地址:本地系统中卡的地址,是动态变化的,需要在主机初始化时确定;在SPI模式中没有CSD128卡描述数据:卡操作条件的信息数据SCR64SD卡配置存放器:SD卡特定信息数据OCR32操作条件存放器DSR16驱动级存放器,用于提高总线的性能;可选可不选〔2〕SD卡的根本操作=1\*GB3①SD卡的读操作:SD_ErrorSD_ReadBlock(uint8_t*readbuff,uint32_tReadAddr,uint16_tBlockSize);函数功能:读单个块的数据,并采用DMA传输方式;Readbuff:指向数据接受缓存器;ReadAddr:读取区域的首地址;BlockSize:块的大小〔512B〕;读取成功后返回SD_Error=0。〔下同〕SD_ErrorSD_ReadMultiBlocks(uint8_t*readbuff,uint32_tReadAddr,uint16_tBlockSize,uint32_tNumberOfBlocks);函数功能:可以读取连续几个块的内容,块的个数由NumberOfBlocks确定。读写都是以block为单位,一个block为512个字节〔发送CMD16命令可以设置块的大小〕,小于512B时,以block的边界对齐。每个块传输的后面都跟着一个CRC校验。CMD17(READ_SINGLE_BLOCK)用于传输单个块,传输完之后,卡进入传输状态;CMD18

(READ_MULTIPLE_BLOCK)用于多个块的传输,直到收到一个CMD12命令。=2\*GB3②SD卡的写操作:SD_ErrorSD_WriteBlock(uint8_t*writebuff,uint32_tWriteAddr,uint16_tBlockSize);函数功能:写入一个块的内容,DMA传输;写入成功后返回SD_Error=0。〔下同〕SD_ErrorSD_WriteMultiBlocks(uint8_t*writebuff,uint32_tWriteAddr,uint16_tBlockSize,uint32_tNumberOfBlocks);函数功能:连续写入几个块的内容,块的个数由NumberSize确定。块写操作与块读操作类似,每个块传输的后面都跟着一个CRC校验。卡写数据时会进行CRC校验,多块写比重复的单块写更能提高效率。如果CSD中的WRITE_BLK_MISALIGN没设置,并且发送的数据不是块对齐的,卡会设置状态存放器中的ADDRESS_ERROR位,并且进入Receive-data状态等待停止命令。此时写操作也会停止,并且卡会设置其的WP_VIOLATION位。如果写缓冲满的话,卡会停止接受WRITE_BLOCK命令。此时主机应发送SEND_STATUS

(CMD13)命令,卡返回数据的READY_FOR_DATA位标志卡是否准备好接受新的数据。在多块写操作中通过事先发送ACMD23命令可提高写速度。ACMD23用于定义接下来要写数据的块的数目[10]。每次多块写操作后,这个值又被设为默认值1,ACMD22会使卡返回写成功的块数目。=3\*GB3③SD卡的擦除操作:SD_ErrorSD_Erase(uint32_tstartaddr,uint32_tendaddr);函数功能:擦除SD卡中指定的内容,擦除成功时返回0;startaddr是擦除内容的起始地址;endaddr是擦除内容的终止地址。擦除命令的顺序是:ERASE_WR_BLK_START(CMD32)、ERASE_WR_BLK_END(CMD33)、ERASE

(CMD38)[10]。如果(CMD38或(CMD32,

33)接收到出错信息,卡会设置状态存放器中的ERASE_SEQ_ERROR

位并且重新等待新的命令时序;如果接收到时序错误命令,卡会设置其ERASE_RESET位并且重新等待新的命令时序。2.4.2SD卡的文件系统FATFS上一节的SD卡驱动只完成了向物理地址写入数据的工作,而根据文件系统格式的逻辑转换局部那么需要额外的代码来完成。实质上,这个逻辑转换局部可以理解为当需要写入一段数据时,由它来求解向什么物理地址写入数据、以什么格式写入及写入一些原始数据以外的信息(如目录)。这个逻辑转换局部代码也称之为文件系统。FATFS是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由AISIC语言编写并且完全独立于底层的I/O介质,因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。FATFS支持FAT12、FAT16、FAT32等格式[11]。所以利用前面写好的SDIO驱动,把FATFS文件系统代码移植到工程之中,就可以利用文件系统的各种函数,对已格式化的SD卡的文件进行读写了。〔1〕FatFsR0.09本次毕设采用FatFs文件系统的R0.09的版本,提供有两类接口函数:底层函数〔DeviceControlInterface〕和上层函数〔ApplicationInterface〕。图2.10FATFS文件系统模型 FileAccess:f_open(),f_close(),f_read(),f_write(),f_gets(),f_puts(),f_printf()…DirectoryAccess:f_opendir(),f_closedir(),f_readdir()…APIFile/DirectoryManagement:f_stat(),f_unlink(),f_rename(),f_mkdir(),f_getcwd()…VolumeManagement:f_mount(),f_mkfs(),f_fdisk()…DCI:disk_status()获取扇区状态;disk_initialize()初始化扇区;disk_read()读扇区;disk_write()写入扇区;disk_ioctl()控制设备相关函数;get_fattime()获取当前时间。上一节讲到的SD卡的初始化,SD卡的读写操作,以及擦除等操作的实现全部封装到DCI函数中使用,即使用FatFS提供的API和DCI就能实现对SD卡的读写及管理文件系统的所有操作。〔2〕常用的API函数FRESULTf_mount(BYTEvol,FATFS*fs);函数功能:注册逻辑存储设备〔翻开一个工作区〕,成功后返回FR_OK;vol为盘符号;fs指向新建的文件系统。FRESULTf_open(FIL*fp,constTCHAR*path,BYTEmode);函数功能:新建或翻开一个文件,成功后返回FR_OK;fp指向创立的文件;path指向文件路径名;mode文件访问方式。FRESULTf_close(FIL*fp);函数功能:关闭fp指向的文件。FRESULTf_read(FIL*fp,void*buff,UINTbtr, UINT*br);函数功能:读取文件,成功后返回FR_OK;fp指向要读取的文件;buff指向指向读取到的数据;btr读取的字节数;br指向读取的字节数。FRESULTf_write(FIL*fp,constvoid*buff,UINTbtw, UINT*bw);函数功能:写入文件,成功后返回FR_OK;fp指向要写入的文件;buff指向待写入的数据;btw指向写入的字节数。FatFs文件系统除了提供上述的库函数,还提供其他一些头文件,可根据需要进行手动添加:cc932.h,cc936.h,cc949.h,cc950.h,ccsbcs.h,syscall.h2.5图像采集模块OV7725是一个能够提供单片VGA摄像头和影像处理器的所有功能的图像传感器,它可以输出整帧,子采样,取窗口等方式的各种分辨率8/10位图像数据,支持的数据格式有很多种,包括RAWRGB,RGB(GRB4:2:2,RGB565/555/444)以及YCbCr(4:2:2)等格式[12]。它的体积小,工作电压低,具有单片VGA摄像头影像处理器的功能,可以对图像进行伽玛曲线、白平衡、饱和度、色度等处理[13]。2.5.1摄像头输出时序OV7725芯片的输出采用了VGA时序〔是一种640*480像素显示器的显示模式〕,而ILI9341液晶屏为3.2寸屏只能显示320*240像素的图像,故将其时序改为QVGA〔即原VGA的四分之一,可配置OV7725的COM7存放器选择〕。一个像素用16位的数据〔RGB565〕表示,而OV7725的数据总线宽度最多可设置为10位,故采用了8位的数据宽度〔D2~D9〕输出图像信息。对OV7725内存放器的配置接口是采用了SCCB总线〔后面会详细讲解〕,见图2.11。图2.11OV7725一幅图像就是一帧的数据,OV7725在采集完一幅图像后,都会产生一个场/帧同步信号VSYNC,其时序为:一个脉冲为一帧的开始,低电平时开始传输,另一个脉冲为一帧结束,见图2.13。当捕捉到VSYNC的上跳沿〔或下跳沿〕时,产生中断,将数据写入到FIFO中。VSYNC保持低电平说明正在传送图像。当再次捕捉到VSYNC的上跳沿〔或下调沿〕时,产生中断,一帧图像传输完毕,禁止向FIFO的写入,并开始读FIFO中的数据。一幅图由240行,320列个像素点组成,因此在VSYNC信号保持低电平阶段〔即开始传输图像时〕需要行同步信号HREF〔输出行起始和行结束信号〕换行,使数据一行行地被读出。行同步的时序为:HREF由低电平变为高电平时开始传输一行像素数据,高电平表示正在传输,由高变低时表示一行传输完毕。实际上,信号HSYNC〔和HREF共用一个管脚,可以通过软件来配置)也可以用于行同步,但与HREF有一点区别。从图2.12中可以看到,HREF为高电平时,摄像头输出的数据都是有效的,而HSYNC高电平期间,在后面有一段时间是无意义的,即图中灰色局部。再结合FIFO的特性,选用了HREF作为行同步,见图2.13。图2.12帧时序图图2.13行时序图前面讲到每一行都有320个像素点,在输出一行的像素点时,需要一个像素时钟PCLK,确保像素点是一个个地被读出。在HREF保持高电平时,像素时钟信号PCLK每出现一次上跳沿,就能输出一个字节数。而每个像素点采用RGB565的格式,共16位〔2个字节数〕,故需要分两次输出。前一个字节从高位到低位依次是R4~R0、G5~G3,后一个字节是依次是G2~G0、B4~B0,见图2.14。图2.14 像素输出时序FIFO存储器由于摄像头采集图片信息的传输速率比拟快〔可达60fps〕,而STM32最快能每秒处理24帧的图像信息〔每秒显示24张以上的图时,人眼会感觉出是连续的画面〕。为了防止丢帧和解决STM32与OV7725间的速率匹配,在STM32和摄像头之间参加一个FIFO存储器,见图2.15。FIFO读时序主要用到4个管脚:RE〔读使能:低电平有效,已硬件接地〕、OE〔输出使能:低电平有效,高电平关闭输出〕、RCLK〔读时钟〕、RRST〔读指针复位操作:低电平时,读指针复位到0地址开始读取数据〕。RE端硬件接地,那么STM32随时可以读取里面的数据,但只有当OE为低电平时,读到的数据才是有效的,否那么D0~D7呈现高组态。OE为低电平时,随着RCLK的运转,输出管脚D7~D0按地址递增的方式〔每读出一个字节,指针就会加一〕输出数据,见图2.16。在数据全部读出后,要操作RRST将读指针复位,方便下次读取。图2.15FIFO与OV7725、STM32连接图2.16FIFO读时序FIFO的写时序主要用到3个管脚:WE〔写使能:低电平有效〕、WCLK〔写时钟〕、WRST〔写指针复位操作:当WRST为低电平时,写指针就复位到0地址开始写入〕。WE为低电平时,随着WCLK的运转,输入管脚D17~D10的数据就会按地址自增的方式写入到FIFO中,见图2.17。在数据全部写入后,要操作WRST将写指针复位,方便下次写入。完整驱动程序流程:将摄像头的帧同步信号送入STM32,当STM32捕捉到场中断信号时,拉高WEN管脚电平,之后整幅图像的数据就会存入FIFO。当再次捕捉到场中断时,说明一幅图像已经送入FIFO,此时,关闭场中断,拉低WEN电平,防止摄像头数据再次写入FIFO。并开始读取FIFO数据到内存缓冲区,交由STM32处理后显示到液晶屏上。再使能场中断,采集下一幅图像,如此循环。图2.17FIFO写时序2.5.3SCCB总线SCCB〔OmniVisionserialcameracontrolbus〕,即串行摄像机控制总线,是一种已经由OmniVision公司定义和采纳的SCCB总线是一种三线结构的串行总线,用于完成对绝大多数OmniVision系列图像传芯片功能的控制[14]。在简化的引脚封装中,SCCB总线可以工作在改进的两线工作方式下[15]。两线SCCB接口有两条通迅连接线,即SIO_D〔数据线〕和SIO_C〔时钟线〕[15]。SCCB接口协议是一种简化的I2C协议,两者通信的时序根本一致,但是在应答信号ACK和总线停止信号等方面上存在差异。STM32上没有SCCB的硬件接口,故采用GPIO模拟I2C〔SCCB的双总线,将SCCB_E硬件接地〕的方式实现,下面是双总线功能原理图:图2.18SCCB的双总线接法〔1〕管脚定义=1\*GB3①SCCB_E信号低电平有效,一个高到低的转换说明数据传输开始;一个低到高的转换说明数据传输结束;数据传输过程保持为低电平;高电平说明总线处于空闲状态。在SCCB_E说明数据传输开始之前主机必须将数据线SIO_D置为1,这样可以防止总线数据传输开始之前的总线不确定状态的出现。=2\*GB3②SIO_C信号高电平有效,当处于空闲状态时必须被拉高;当启动传输后,SIO_C被拉低说明数据传输的开始,传输过程中高电平说明一位数据正在传输,所以SIO_D的数据变化只能在SIO_C为低时发生,一位传输时间定义为tCYC,最小为10us。表2.5主控器件管脚描述管脚类型描述SCCB_E输出串行片选输出,当总线处于空闲状态时主机把SCCB_E拉高为1,启动传输或处在悬浮状态时主机把SCCB_E拉低。SIO_C输出串行I/O信号1输出,空闲状态时主机把SIO_C拉高;当SCCB_E拉低时,在上下电平之间变化;当系统处于悬浮状态时,被拉低。SIO_DI/O串行信号0输入和输出,当总线处于空闲保持悬浮;系统处于悬浮状态时被拉低。PWDN输出掉电输出。注:当SCCB_E没有出现在摄像头芯片引脚上时,默认使能,被拉高。表2.6从控器件管脚描述管脚类型描述SCCB_E输入串行片选输入,当系统处于挂起模式时,输入点可以被关闭。SIO_C输入串行I/O信号1输出,当系统处于挂起模式时,输入点可以被关闭。SIO_DI/O串行I/O信号0输入和输出,当系统处于挂起模式时,输入点可以被关闭。PWDN输入掉电输入。〔2〕SCCB总线传输SCCB与I2C总线的协议根本一致,读写时序相同,故对SCCB的通信时序不再展开讨论。=1\*GB3①SCCB的读操作:intSCCB_ReadByte(uint8_t*pBuffer,uint16_tlength,uint8_tReadAddress);入口参数:pBuffer存放待读出的数据;length:待读出的长度;ReadAddress:待读出的地址。第一步:判断起始信号,假设初始化成功,进入第二步,否那么返回失败;第二步:发送器件地址DEV_ADR,并等待应答,假设有应答,进入第三步,否那么返回失败;第三步:设置器件内部待读出的存放器的低起始地址,并等待应答,释放总线;第四步:再次启用总线,并发送器件地址〔DEV_ADR+1〕,并等待应答,进入第五步,否那么返回失败;第五步:将数据读到pBuffer中,共读取length个字节,全部读出后,释放总线,返回成功。=2\*GB3②SCCB写操作:intSCCB_WriteByte(uint16_tWriteAddress,uint8_tSendByte);入口参数:WriteAddress待写入的地址;SendByte待写入的数据。第一步:判断起始信号,假设初始化成功,进入第二步,否那么返回失败;第二步:发送器件地址DEV_ADR,并等待应答,假设有应答,进入第三步,否那么返回失败;第三步:设置器件内部待写入的存放器的低起始地址,并等待应答,进入第四步;第四步:发送数据,并等待应答,释放总线,返回成功。第3章系统软件设计关于STM32的片上资源,LCDILI9341液晶屏的根本配置,SD卡的驱动及文件系统,OV7725摄像头功能的介绍已经在上一个章节中进行了详细的说明。硬件平台的搭建都是建立在STM32开发板与其他器件模块连接上的,本章节那么主要采用自顶向下,层层细化的程序设计思想,分模块讲解整个系统的软件实现流程。3.1顶层程序设计STM32照相机根本流程可以描述为:系统初始化,拍照处理。首先是系统初始化,包括系统时钟配置,对按键的GPIO和中断使能,LED的GPIO初始化;再初始化LCD的GPIO,FSMC总线功能和内部存放器;还有初始化SD卡FATFS文件系统并使能SDIO的中断;最后,在实现模拟SCCB总线后,OV7725还需要配置FIFO的GPIO和OV7725内部的存放器,并初始化场信号线。接着,拍照处理:等待帧同步信号,进入摄像;等待按键,开始拍照〔即液晶截屏〕并将图片保存到SD卡中,见图3.1。3.2系统初始化程序设计3.2.1GPIO初始化在第二章的主控模块局部已经介绍了GPIO的存放器和引脚的输入输出模式,对复用功能实现也做出了详细说明。在STM32控制下的LED,KEY的GPIO以及LCD,SDcard,摄像头使用的所有GPIO或特殊功能引脚的设置都要通过流程图来实现〔图3.2〕。3.2.2LCD初始化LCD初始化主要包括两个内容:FSMC总线配置,LCD存放器配置,见图3.3。程序中的涉及液晶屏的读写操作〔如清屏,设置液晶扫描方向以及写入图片信息〕,都是在向Bank1_LCD_C和Bank1_LCD_D两个区域分别写入命令和数据实现的。其中,命令/数据的含义可参考ILI9341参考手册上的内容,在第二章的液晶显示模块中也给出了局部指令的含义。3.2.3SD卡文件系统初始化SD卡文件系统初始化可分两块:SD卡中断初始化和硬件初始化。如何设置中断和FatFs文件系统的函数接口前面都已经介绍过了,图3.4是整个SD卡文件系统的初始化流程图。3.2.4OV7725初始化摄像头OV7725的初始化分为三大局部:SCCB总线和FIFO的GPIO初始化,传感器的初始化,场信号线的初始化。其中的SCCB总线时序在上一章已经讲过,图3.5是OV7725初始化的程序流程图。图3.1主程序流程图图3.2GPIO的配置及复用图3.3LCD初始化流程图3.4SD卡文件初始化流程图3.5OV7725初始化流程3.3拍照处理程序设计前几个小节详细介绍了各个子模块的初始化的实现,从主程序框图上看,还要有FIFO的准备,图像采集与显示,中断效劳程序,液晶截屏与保存子程序。FIFO的准备〔使能数据出FIFO输出〕,图像采集与显示是通过反复的读FIFO的输出并往LCD存放器写入数据的过程,这些可以参考第二章的液晶显示模块和图像采集模块中FIFO的时序。最后一小节的重点是液

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论