毕业设计论文基于stm32的照相机系统的实现管理资料.docx
- 文档编号:30777724
- 上传时间:2023-08-23
- 格式:DOCX
- 页数:44
- 大小:2.02MB
毕业设计论文基于stm32的照相机系统的实现管理资料.docx
《毕业设计论文基于stm32的照相机系统的实现管理资料.docx》由会员分享,可在线阅读,更多相关《毕业设计论文基于stm32的照相机系统的实现管理资料.docx(44页珍藏版)》请在冰豆网上搜索。
毕业设计论文基于stm32的照相机系统的实现管理资料
第1章绪论
一幅图像可以描述为“一个平面上与位置成函数关系的光强或反射率的变化”。
相机是一台捕捉并记录图像的设备,其中“捕捉”是指将一幅图像中包含的信息转换成相应的以可以重现的方式存储的信号[1]。
在传统卤化银的相机中,图像信息被转换成胶片中的化学信号,并存储在胶片中对应的点上。
而现代的电子相机是通过图像传感器将捕捉到的图像信号转换成了电子信号,并将图像信息存储在内存中。
电子相机又根据存储的方式不同,分为模拟相机和数码相机。
物镜:
聚焦图像,折射来自物体的光线,使光线汇聚成为一幅清晰的图像;
光圈:
决定进入镜头的光量,通过光圈数值计量。
光圈数值越大则光圈开口越小;
快门:
快门速度决定曝光时间长短,通常以一秒的十分之一计量。
快门速度越快则曝光时间越短;
CCD:
光耦合组件。
研究背景与意义
自1991年第一款商用数码相机面市以来,数码相机的性能有了极大的提高[2]。
作为数码相机的核心部件———感光元件CCD像素数已从初期的10几万发展到目前的2千万以上,另一种感光元件CMOS在图像质量方面已经基本上与CCD不相上下,因而在专业级数码相机方面得到广泛应用。
变焦倍率已从2~3倍增加到10倍以上[2]。
至于存储器,不仅品种多,且存储量已达8GB,数码相机的功能也从单拍照发展到十机一体的多媒体拍照手机[3]。
电子相机的早期发展
电子照相的设想由来已久,最早于1973年出现在著名的半导体制造商德州仪器公司(TexasInstrumentsIncorporated)提出的一项专利申请。
在实施方案中,半导体图像传感器位于可伸缩镜头后方,其捕捉的图像信号被传输到电磁记录头,并存储到一个可移动的环形磁鼓中。
然而由于1973年传感器技术与磁记录技术还在起步阶段,该想法并没有付诸在真正的产品之中。
直到1981年,这一年对于相机制造商而言是极其重要的一年,索尼公司发布了一款电子相机的原型,被称为“Mavica”。
这种原型相机将半导体图像传感器捕获到的图像信号记录在磁性软盘上,包含有单镜头反光式取景器、CCD图像传感器、信号处理电路和软盘驱动器。
但是记录到软盘上的图像信号是一种改良的视频信号,属于模拟信号,故它并非是一款完整意义上的数码相机。
在索尼Mavica发布后,数家相机制造商和电子设备制造商组成了联盟来推进索尼的构想。
他们建立了一套电子照相系统的标准,名为“静态视频系统”。
但由于此系统基于NTSC的视频格式,图像的画质不是太好,镜头相机的使用只被局限在无须纸质打印的小应用之中。
索尼Mavica(原型)
数码相机的出现
随着数字技术的进步,模拟电子相机向数字化过渡,在1988年的世界影像贸易博览会上,第一台数码相机(富士DS-1P)发布。
该相机将数字图像信号记录在一块容量为2MB的静态RAM卡上。
虽然这款富士原型机没有上市销售,但随着对其概念的不断改进和完善,有几款数码相机陆续上市。
1995年,卡西欧QV-10上市销售,由于其不仅是一台相机,更是一个便携式图像浏览器,即在用户拍完照后能即刻共享和欣赏图片,受到年轻一代的热烈欢迎。
像素数量之战
随着市场的日益增长,数码相机的前景变得愈发明朗,许多厂家开始了数码相机的开发。
半导体制造商也认识到其中蕴含的重大商机,开始研发专用于数码相机上的图像传感器。
1996年奥林巴斯发布了C-800L型数码相机,其CCD图像传感器约含80万像素。
随后,富士和奥林巴斯与次年分别发布130万像素的DS300和140万像素的C-1400L。
1999年,多家厂商发布了200万像素的机型,而在2000年发布300万像素的机型时情形再次发生。
直到2004年,出现了高达800万像素的傻瓜相机和1670万像素的单反相机。
卡西欧OV-10单反照相机
本课题研究的意义
市场上的照相机大多都是像素很高,体验也非常不错的照相机,但这些数码照相机太过于独立,而且价格也不低。
在有些场合,需要把照相功能嵌入到某个系统中,完成一些简单的摄像和保存图片的功能,本次课设实现的STM32照相机的系统正好满足要求。
STM32照相机的程序还可以以板级支持包的方式根据需求对功能进行裁剪,功耗低,成本也很低。
研究内容
本文主要研究STM32照相机的程序设计流程,从硬件的参考手册入手。
根据芯片手册或模块资料,配置相关寄存器,并对信号的时序做出分析,搭建出每个器件操作的完整的编程模型。
再选择出合适的算法,使各个模块之间协调工作,最终设计出较低成本、可移植性较好的STM32照相机系统。
第2章系统方案设计
整体框架设计
整个照相系统根据功能划分,可分为:
主控模块、液晶显示模块、存储器模块、图像采集模块。
另外,在实际拍照中,还需要加入按键作为拍照的按钮、LED灯作为操作指示灯。
在器件选型上,在综合了相机像素、存储容量、成本,以及功耗各方面的考虑后,决定选用STM32最小系统作为主控模块,OV7725摄像头作为图像采集模块,ILI9341作为液晶驱动,容量为128MB的SD卡作为存储模块,。
STM32照相机系统框图
主控模块
STM32F103ZET6芯片功能介绍
(1)内核:
ARM32位的Crotex-M3的CPU,最高72MHZ工作频率;可进行单周期的乘法和硬件除法。
(2)存储器:
256KB/512KB的FLASH;高达64KB的SRAM;带4个片选控制的静态存储器控制器:
SRAM、PSRAM、NOR和NAND;并行LCD接口,兼容8080/6800模式。
(3)时钟、复位与电源管理:
~;上电、断电复位(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接口;;SDIO接口。
(11)CRC计算单元,96位的芯片唯一代码。
(12)ECOPACK封装。
时钟树
为了满足系统时钟和不同外设时钟的需求,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(低速外部时钟),。
(5)PLL(锁相环),其时钟输入源可选择为高速内部时钟的二分频、高速外部时钟或其二分频。
倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
STM32时钟树
GPIO及功能复用
在使用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基本设置
GPIO内部结构框图
GPIO类型GPIO_Mode共8种:
GPIO_Mode_AIN 模拟输入 :
应用ADC模拟输入,或者低功耗下省电 ;
GPIO_Mode_IN_FLOATING 浮空输入 :
可以做按键识别,串口接受端RX ;
GPIO_Mode_IPD 下拉输入:
内部下拉电阻输入 ;
GPIO_Mode_IPU 上拉输入 :
内部上拉电阻输入 ;
GPIO_Mode_Out_OD 开漏输出:
当输出为0时,IO内部硬件接地,当输出为1时,引脚是悬空的,需要外接上拉电阻,才能实现输出高电平。
要想实现双向通信,外接上拉电阻后,可先向IO口写入1,此时的IO的电平会随着外部电路的电压值变化,从而完成输入功能;
GPIO_Mode_Out_PP 推挽输出:
输出0时,内部接低, 输出1 时,接的是电源电压VCC,但读输入的值是未知的;
GPIO_Mode_AF_OD 复用开漏输出 :
主要针对一些片内外设功能(如:
串口TX1,SPI通信);
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)中断基本概念
中断是指当软件或硬件出现需要时,CPU暂时停止当前程序的执行,转去处理应对突发情况的程序的执行请求,在处理事件后完后又返回到源程序继续执行的过程。
触发中断的事件称为中断源, 而中断源向内核申请中断的入口就称为中断通道。
也就是说,中断通道给中断源提供一个向内核申请中断的入口,中断源通过中断通道向内核提出中断申请 。
一个中断通道可以对应一个中断源,也可以对应多个;有的外设只对应一个,而有的外设可以对应多个中断通道。
中断优先级是针对中断通道的。
中断通道、中断源与外设的关系
(2)中断优先级
STM32的中断优先级可分为响应式优先级或抢占式优先级。
其中,抢占式优先级的中断会打断当前的主程序或者中断程序运行,是实现中断嵌套的一种手段。
对于每一个中断通道,Cortex-M3内核的头文件“”中都提供了一个8位的寄存器IP,来确定该中断通道的抢占式优先级或响应式优先级。
(3)中断相关寄存器
NVIC结构体()
内核中的寄存器
与中断控制SCB结构体()
相关寄存器外设相关寄存器
外设中的寄存器(如:
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固件库中()定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU当前优先级,从而达到控制所有中断的目的。
/*关闭总中断的两个函数*/
void NVIC_SETPRIMASK(void);
void NVIC_SETFAULTMASK(void);
/*使能总中断的两个函数*/
void NVIC_RESETPRIMASK(void);
void NVIC_RESETFAULTMASK(void);
液晶显示模块
ILI9341驱动器介绍
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有精确的电压控制(软件控制),来支持全色,8色显示模式和睡眠模式,是理想的中小型手提产品的LCD驱动器。
FSMC总线
FSMC(FlexibleStaticMemoryController,可变静态存储控制器)是STM32系列中内部集成256KB以上FLASH,后缀为xC、xD和xE的高存储密度微控制器特有的存储控制机制[7]。
之所以称为“可变”,是由于通过对特殊功能寄存器的设置,FSMC能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度,从而使得STM32系列微控制器不仅能够应用各种不同类型、不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同时扩展多种不同类型的静态存储器,满足系统设计对存储容量、产品体积以及成本的综合要求[8]。
(1)FSMC框图及配置:
FSMC框图
FSMC总线配置流程:
第一步:
选择合适的存储块映射NORFLASH存储器,共有4个独立的存储块可以用于与NORFLASH、SRAM和PSRAM存储器接口,每个存储块都有一个专用的片选管脚。
第二步:
使用或禁用地址/数据总线的复用功能;
第三步:
选择所用的存储器类型:
NORFLASH、SRAM或PSRAM(其中NORFLASHMemory和SRAM都支持同步或异步读写时序的存储器);
第四步:
定义外部的存储器的数据总线:
8bit/16bit;
第五步:
使用或关闭NORFLASHMemory的突发访问模式;
第六步:
配置等待信号的使用:
开启或关闭,极性设置,时序配置;
第七步:
使用或关闭扩展模式:
扩展模式用于访问具有不同读写操作时序的存储器。
(2)时序参数及计算
异步读写时序的参数及时序:
ADDSET:
addresssetuptime;ADDHOLD:
addressholdtime;DATAST:
datasetuptime
异步读时序
异步写时序
读/写访问时间为:
((ADDSET + 1) + (DATAST + 1)) × HCLK ;
写使能信号由低到高的时间为:
tWP=DATAST × HCLK;
考虑最大的读/写访问时间,FSMC和存储器的内部延时,数据建立时间应满足:
DATAST = (tAVQV + tsu(Data_NE) + tv(A_NE))/HCLK – ADDSET – 4。
本次毕设LCD驱动的存储器接口是挂接在FSMC总线上(),选用NORFLASH存储器的BANK1的第4块区域,并且禁用地址/数据总线的复用功能和存储器的突发访问模式,设置数据总线宽度为16位,读写时序为异步时序,并关闭扩展模式。
其实只需对下面的三个寄存器做如下操作:
FSMC_Bank1->BTCR[6]=0X
5011;FSMC_Bank1->BTCR[7]=0X0809;FSMC_Bank1E->BWTR[6]=0X0301。
LCD与FSMC总线连接
LCD初始化
LCD寄存器操作部分指令集
指令
描述
指令
描述
指令
描述
EDH
电源序列控制
F7H
泵比控制
C5H
VCOM控制1
E8H
驱动时序控制A
B1H
帧速率控制
C7H
VCOM控制2
EAH
驱动时序控制B
B6H
显示功能控制
F2H
使能3G
CBH
功耗控制A
C0H
功耗控制1
26H
伽马设置
CFH
功耗控制B
C1H
功耗控制2
E0H
正极伽马校准
2AH
列地址设置
3AH
像素格式设置
E1H
负极伽马校准
2BH
页地址设置
11H
退出睡眠模式
2CH
存储器写
36H
存储器访问控制
29H
开显示
2EH
读存储器
FSMC总线(STM32引脚复用FSMC的硬件接口)配置完成后,就能通过STM32
来对LCD内的寄存器进行读写操作了。
本章节中所有关于时钟的设置,GPIO的配置,引脚的复用功能,中断函数将在下一个章节集中讲解,LCD内部的寄存器比较多,可以对照LCDILI9341的数据手册通过命令来指定配置寄存器,并输入相应的参数。
LCDILI9341的操作指令可分为:
一级、二级、三级指令。
。
关于LCD的初始化代码,不同的液晶驱动程序是不一样的,在购买液晶屏时厂家会提供源代码,所以这里不再展开。
存储器模块
SD存储卡兼容MMC卡的接口规范,采用9针的接口(CLK为时钟线,CMD为命令响应线,DATA0~DATA3为双向数据传输线,VDD、VSS1和VSS2为电源和地),最大的工作频率是25MHZ。
SD卡系统支持SD卡模式和SPI模式(),两种通信协议[9]。
SD卡在结构上使用一主多从星型拓扑结构。
虽然SPI的初始化流程比SDIO简单得多,但SDIO用4根数据线传输,而SPI只是串行传输,SDIO的传输速度明显高于SPI。
在传输图像时对传输速度要求较高,故本次毕设选用SD模式的接口(SDIO)。
SD卡模式下的接口定义
管脚
类型
描述
备注
DATA0~DATA2
输入/输出/推挽类型
数据总线
CM
输入/输出/推挽类型
卡监测数据位
DATA3
CLK
输入
时钟引脚
CMD
推挽
命令/响应
串行
(1)SDIO初始化
SD_ErrorSD_Init(void);
初始化函数包括GPIO设置,寄存器的复位,上电操作,SD卡的信息获取。
若初始化成功返回值为0。
SPI模式下的接口定义
管脚
类型
描述
备注
CS
输入
片选
低电平有效
DI
输入
数据输入端
串行
DO
输出
数据输出端
串行
CLK
输入
时钟引脚
在进行初始化之前先了解几个命令和SD卡内部寄存器():
SD卡内部结构及寄存器
CMD0:
将所有的卡复位到理想状态;
CMD8:
发送主机的提供的电压范围,并响应SD卡支持的电压范围;
CMD55:
指定下一条命令是应用命名;
ACMD41:
发送主机支持的卡的容量,并响应SD卡的OCR中的内容;
CMD2:
获取SD卡的ID;CMD3:
获取SD卡的相对地址。
SDIO模式下的初始化流程:
当HOST上电后,使所有的卡设备处于卡识别模式,完成设置有效操作电压范围,卡识别和请求卡相对地址等操作。
第一步:
发送指令CMD0使卡设备处于空闲状态,进入第二步。
第二步:
发送指令CMD8,若卡设备有响应,,此时会响应SD卡支持的电压范围,进入第三步;若没有响应,,执行第四步。
第三步:
若主机支持大容量的SD卡,将HCS置1,否则置0。
发送指令CMD55+ACMD41,若响应CCS为1,则SD卡为大容量的存储器,进入第四步;否则为标准容量的SD卡,进入第五步。
第四步:
HCS置0,并发送CMD55+ACMD41,若有响应,则为标准容量的SD卡,进入第五步;若无响应,则返回没有找到可用的SD卡。
第五步:
发送指令CMD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 论文 基于 stm32 照相机 系统 实现 管理 资料