基于DMA技术单片机数字摄像头图像采集系统设计

2015-05-05 06:00王建军
机械与电子 2015年9期
关键词:像素点中断端口

乔 亮,王建军

(1.中国人民解放军94362部队,山东 青岛266100;2.昆明理工大学机电工程学院,云南 昆明650500)

0 引言

摄像头作为一种图像采集传感器,被广泛运用在工业机器人、车载导航仪等智能仪器上面,控制系统通过其采集周围环境的图像信号以便于控制系统控制仪器做出相应的判断。摄像头分为模拟摄像头和数字摄像头2种。由于数字摄像头数据量过大,单片机用传统方法采集会占用大量的CPU资源,这将导致单片机的控制效果大为减弱。此外,数字摄像头图像信号输出非常快,单片机在处理过程中采集很有可能丢失数据,从而影响整个控制系统的性能。

DMA(direct memory access)技术是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,既不通过CPU,也不需要CPU干预。整个数据传输操作在DMA控制器的控制下进行。CPU只需在开始时刻配置DMA内部寄存器参数,且在每次数据传输开始和结束时做一点处理,而在传输过程中不用CPU干预。因此,利用DMA技术直接将图像数据写入单片机内存空间,CPU需要图像信息时只需从内存空间中调用。这样将大大地解放CPU资源,单片机CPU可以有更多的时间处理其他外部事件。从而极大地提高了控制系统的工作效率。

1 采集过程

1.1 MK60DMA模块

MK60的DMA模块主要由通道复用管理模块和DMA控制模块组成,通道复用管理模块主要负责将MK60的16个DMA通道分配给63个DMA请求源[1-3];DMA管理模块主要负责属性配置和一些基本功能的管理。MK60的DMA模块有63个DMA请求源。当DMA模块被使能之后,只要1个DMA请求信号产生,DMA模块就不断地从源地址内存空间中取出数据,将其送入目的地址内存空间。要将数据准确地送入预期的地址,就需要对DMA模块进行正确的初始化配置。DMA模块配置过程主要对DMA通道选择、DMA请求源、DMA周期触发功能、每次读入字节数、源地址数据宽度、目的地址数据宽度、目的地址、源地址、主循环计数、副循环计数、源地址偏移、目的地址偏移以及DMA中断等进行相关配置[1]。DMA通道选择主要是从16个DMA通道中选择1个作为当前数据的传输通道;DMA请求源是为当前所选DMA通道配置请求源,即当所配置的请求信号(上升沿或下降沿)产生时开始传输数据;DMA周期触发功能主要是决定DMA传输是定时触发还是外部事件触发;每次读入字节是配置DMA每次传输的字节数;源地址数据宽度是指源地址内存中所存储的数据宽度(8位、16位、32位等);目的地址数据宽度是指目的地址内存中所存储的数据宽度(8位、16位、32位等);目的地址是指数据要被传入的内存地址;源地址是指数据取出的内存地址;主循环计数和副循环计数相当于2层循环嵌套,其每执行1次循环体完成1次DMA传输;源地址偏移和目的地址偏指每完成1次DMA传输后,源地址和目的地址的偏移量[2]。

1.2 OV7620时序分析

对于OV7620摄像头采集只需要关注场中断信号VSYN、行中断信号HREF和像素中断信号PCLK。OV7620同步信号时序图如图1所示。像素同步信号PCLK为读取有效像素值提供同步信号,高电平时输出有效图像数据,若当前图像窗口大小为320×240,则在VSYN 2个正脉冲之间有240个HREF的正脉冲,即240行;在每个HREF正脉冲期间有320个PCLK正脉冲,每个PCLK正脉冲下对应1个点的图像数据,即每行320个像素。这就是VSYN、HREF、PCLK 3个同步信号之间的关系。

图1 OV7620时序图

2 MK60采集图像

2.1 MK60的DMA初始化配置

MK60与OV7620摄像头接线如图2所示。由图2可知,使用MK60的PORTA19作为场开始信号VSYN的检测端口,使用PORTB6作为行开始信号的检测端口,采用PORTE0作为像素同步信号的检测端口。PORTD0~PORTD7作为8位图像灰度数据接收端口。根据1.2节所述,要采集1场完整的图像,就必须从检测到场信号开始读取图像数据,而1场图像是由多行组成且每行又有多个像素点,要正确采集1场图像,就必须要将采集到的数据对齐,但是DMA只负责数据的传输[3],因此,必须根据摄像头的特征对DMA进行正确的初始化后,才能够采集到正确的图像。一种可以实现图像采集的DMA初始化过程如图3所示。

图2 MK60与OV7620摄像头接线图

由图3可知,DMA模块通道选择为CH0[4],摄像头的像素同步信号PCLK与PORTE连接,当1个像素点数据产生后,PCLK产生上升沿跳变被PORTE捕捉到之后产生DMA请求,DMA得到请求之后开始传输当前像素点的灰度数据。由于DMA采集像素点由PCLK产生信号,因此禁止其周期触发功能而采用外部触发功能[4-5]。

图3 DMA初始化流程

设定主循环计数为每1行的像素点个数,即当行中断产生之后DMA通道要传输的数据个数,因此要设定为摄像头每1行的数据点个数。次循环计数设为1,由于1个像素点数据为8位的数据宽度,DMA 1次可以传输完毕,不需要多次次循环。由于摄像头的每1个灰度数据都从Y0~Y7接口送入 MK60的 GPIOD_PDIR寄存器[6],每次读取源地址不变,所以设定源地址为GPIO_PDIR寄存器的首地址、源地址偏移量设定为0。目的地址为存储图像数据数组的首地址,由于1幅图像有多个像素点组成的二维图像,要采集到1场图像,就要将每1个像素点的数据存入到1个数组里面,因此在每个像素点数据通过DMA传输完成之后,源地址必须偏移。而对于OV7620来说,1个像素点数据为8位数据宽度,因此源地址偏移量设定为1个字节[4]。

2.2 MK60的端口初始化

由图1可知,场开始信号VSYN的下降沿与行开始信号HERF更接近,捕捉VSYN的下降沿更便于图像对齐。而对于OV7620来说,每1个有效像素点是像素同步信号PCLK高电平时的数据,而行开始信号HERF的上升沿与像素同步信号PCLK的上升沿对齐,因此捕捉HERF的上升沿便于图像对齐,捕捉PCLK的上升沿之后,才能够产生DMA请求来传输数据。所以根据图2的接线图来初始化MK60的端口,MK60端口初始化流程如图4所示。其初始化过程为:使能PORTA端口时钟,将其引脚功能定为GPIO功能,由于PORTA19用来捕捉VSYN的下降沿跳变,因此初始化为输入、高电平状态;使能PORTB端口时钟,将其引脚复用功能定义为GPIO功能,由于PORTB6用于捕捉HERF上升沿信号,因此初始化为输入、低电平状态;使能PORTE端口时钟,将其引脚复用功能定义为GPIO功能,由于PORTE0用来捕捉PCLK上升沿信号,因此初始化为输入、高电平状态。由于PORTD0~PORTD7用来采集摄像头的数据,因此初始化为GPIO功能、输入,初始化为低电平[7]。

图4 端口初始化流程

2.3 中断服务函数

为了能够准确地捕捉到场开始信号VSYN和行开始信号HREF,采用外部事件触发端口中断方式,PORTA19采集到VSYN产生的中断信号之后,进入PORTA中断服务函数。PORTA中断服务函数流程如图5所示。PORTA中断产生后,在PORTA中断服务函数中要重新加载DMA目的地址(图像数组首地址),使摄像头的第1个数据存入图像数组第1个元素。由于当PORTA中断产生之后代表场开始信号,而1场图像有很多行组成,紧随PORTA产生中断之后产生的行开始信号HREF为该场图像的第1行,因此要在程序进入场中断之后立马使能PORTB中断,来捕捉行开始信号,此后每1个行开始信号都会进入PORTB中断服务函数。

PORTB中断服务函数流程如图6所示。由于每1行有很多个像素点,在行开始信号HERF产生(进入行中断)之后,代表此后每1个PCLK高电平时输出的数据为该行相应点的像素数据,因此,在进入PORTB中断服务函数之后立即使能DMA通道CH0请求,即每产生1个PCLK(PORTE0)上升沿信号DMA都进行1次数据传输,将相应点的灰度数据送入到与之对应的图像数组元素中存储。每1行采集完之后行采集计数自增1,当采集行数为1场图像行数时,将场采集完成标志位置1,关场中断回到主函数将采集到的图像通过UART串口模块[8]发送给上位机显示,当串口发完1场图像之后开PORTA中断,开始采集新的1场图像数据。

图5 PORTA中断服务流程

图6 PORTB中断服务流程

2.4 主要采集过程

主函数流程如图7所示。在MK60系统上电之后关闭系统总中断,对端口进行初始化配置、对DMA模块初始化配置,开PORTA中断,开总中断之后进入死循环函数,等待图像采集完成标志位置1,如果标志位置1说明1场图像采集完成。为了避免下1场图像对当前图像产生干扰,要暂时关闭PORTA中断,调用UART串口将采集到的图像发送给上位机。当前图形发送完成之后,开PORTA中断采集新的图像数据。

图7 摄像头数据采集系统流程

3 图像采集实验验证

MK60通过其内嵌的DMA模块采集到的数据,通过串口将数据发送给上位机,获得的图像如图8所示。图像效果较好,验证了采集过程的正确性。

图8 MK60采集到的图像

4 结束语

摄像头是一种应用非常广泛的传感器,其图像采集在工程测试、环境监控等方面有着重要的意义。通过内嵌有DMA模块的MK60单片机,设计了一种DMA图像采集系统,该系统CPU基本不用干预就能完成摄像头的图像采集,使得CPU有更多时间去处理其他外部事件,从而极大地提高了单片机的工作能力和效率,对于工业应用有一定应用前景。

[1] Freescale.K60sub-family reference manual——K60 P144M100SF2V2RM rev.2[Z].2012.

[2] ARM.Cortex-M4technical reference manual revision r0p0[Z].2011.

[3] Freescale.K60sub-family data sheet rev.6[Z].2011.

[4] Freescale.Kinetis peripheral module quick reference rev.0[Z].2010.

[5] Freescale.K60sub-family reference manual rev.6[Z].2011.

[6] Yiu J.ARM Cortex-M3权威指南[M].宋岩,译.北京:北京航空航天大学出版社,2009.

[7] 王宜怀,吴瑾,蒋银珍.嵌入式系统原理与实践——ARM Cortex-M4Kinetis微控制器[M].北京:电子工业出版社,2012.

[8] 杨东轩,王嵩.ARM Cortex-M4自学笔记——基于 Kinetis K60[M].北京:北京航空航天大学出版社,2013.

猜你喜欢
像素点中断端口
一种端口故障的解决方案
基于局部相似性的特征匹配筛选算法
基于5×5邻域像素点相关性的划痕修复算法
基于canvas的前端数据加密
端口阻塞与优先级
跟踪导练(二)(5)
千里移防,卫勤保障不中断
基于逐像素点深度卷积网络分割模型的上皮和间质组织分割
8端口IO-Link参考设计套件加快开发速度
卫星三端口DC-DC变换器技术综述