太原理工大学现代科技学院 毕业设计 - 图文 联系客服

发布时间 : 星期日 文章太原理工大学现代科技学院 毕业设计 - 图文更新完毕开始阅读d8aaceb2c850ad02df804101

OV2640,以对其传感器模块完成配置,最后配置图像输出大小(分辨率),此外关于一些输出格式的控制等等采用函数的方式打包,方便后续调用。

4.3 系统主程序设计

4.3.1 OV2640图像采集程序

在本文设计的程序中我们将设置 VSYNC 为高电平有效,即 VSYNC 低电平的时候,输出图像数据,高电平的时候,做帧同步信号。设置 HREF 为高电平有效,即 HREF 为高的时候,数据有效,HREF为低的时候,数据无效。配置 PCLK 的下降沿更新数据,即 PCLK 下降沿的时候,OV2640更新数据到 OV_D0~D7,所以,MCU 在 PCLK 的上升沿读取数据。

OV2640 的数据输出,是很有规律的,我们以行为单位,每输出一行数据,即一个 HREF 周期。OV2640 输出一行RGB565 数据的读取过程如下:

1.等待 VSYNC 为低电平 2.等待 HREF 为高电平 3.等待第 1 个PCLK 的上升沿 4.读取第 1 个像素的低字节 5.等待第 2 个 PCLK 的上升沿 6.读取第 1 个像素的高字节 7.等待第 3 个 PCLK 的上升沿 8.读取低 2 个像素的低字节 9.等待第 4 个 PCLK 的上升沿?? 10.读取 1 行数据最后 1 个像素的高字节 11.完成 1 行数据读取 12.等待 HREF 为高电平??

上面2-10步骤循环 N 次,就可以读取 N 行的数据,直到读取完整个一帧图像的输出,最后 VSYNC 变成高电平,完成一帧图像数据的读取。当 VSYNC 再次变低的时候,开始下一帧数据输出循环。一次数据输出多少行,每一行多少个像素,则是根据我们设定的图像输出大小(分辨率)来确定的,假定我们设定图像输出大小为:320*480,那么每一行就有 640 个 PCLK 上升沿,每一帧图像就有 480 行图像数据。

OV2640输出JPEG数据的读取过程如下:

–17–

1.等待VSYNC为高电平 2.等待HREF为高电平 3.等待PCLK的上升沿 4.读取JPEG数据 5.等待HREF为高电平 6.等待PCLK的上升沿 7.读取JPEG数据

8.等待HREF为高电平?? 9.VSYNC为低电平

10.完成一帧JPEG数据读取。

从上面的流程可以看出,读取JPEG数据,相对读取RGB565数据来说,简单不少,只需要在HREF为高时,在PCLK的上升沿读取数据即可,直到VSYNC为低电平,完成一帧JPEG数据采集。不过,需要注意的是:HREF在一帧JPEG数据输出的时候,并不是持续的高电平,所以任何时候,都要先判断 HREF 为高电平,再去读取数据。 JPEG采集图像算法如图4-2。

图 4-2 JPEG图像采集算法

图中ov2640_framebuf[]为帧缓冲,图像被临时保存在帧缓冲里,以便进行后续的串口传输,保存等操作。

–18–

4.3.2 直接存储器访问(DMA)

DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。

DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。在应用中可以为CPU节省很多资源[7]。

STM32最多有2个DMA控制器(DMA2仅存在大容量产品中),DMA1有7个通道。DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个DMA请求的优先权。图4-3为STM32F103 DMA原理框图。

图 4-3 STM32中DMA原理框图

图4-4为本设计中的DMA相关配置,DMA主要被用于串口的图像传输。

–19–

图 4-4 DMA配置程序

4.3.3 主函数设计

主函数设计如下:首先定义需要的相关变量,调用各个硬件的初始化函数,配置中断优先级,随后判断各个硬件是否初始化完成,并且将初始化信息显示在LCD上,随后申请帧缓存,初始化OV2640,采集图像,启用DMA传输。一次循环结束。

定义的相关变量有像素统计,行数统计等,图4-5为程序中初始化以及变量的定义。

图 4-5主函数中初始化硬件及定义变量

最后有两个系统中重要的函数:

ov2640_speed_ctrl 函数,用于设置 OV2640 的 PCLK 的频率。因为我们用的是STM32F103 直接驱动 OV2640,而 STM32 的 IO 速度又比较慢,当 PCLK 过快的时候,会采集不过来,导致数据丢失,所以,这里我们通过该函数,针对不同尺寸的 LCD,对 OV2640进行不同的配置,确保可以正常采集 OV2640 输出的数据。

–20–