STM32F4xx 取得摄像头数据并进行处理

发布者:江上HZ最新更新时间:2018-09-20 来源: eefocus关键字:STM32F4xx  摄像头数据  处理 手机看文章 扫描二维码
随时随地手机看文章

  最近做的一个项目需要对摄像头采集到的数据进行简单的处理,我们用的MCU是Cortex-M4 F407系列的。关于STM32F4xx的视频处理,ST的官方给的例程是在显示屏上直接显示摄像头采集到的数据。经过了一番探索……根据官方的英文手册、网友们的无私分享和对各个例程的研究。今天终于搞定了将数据采集下来。


   官方给的例程中,是通过DMA将数据直接输入到屏幕中的。DMA简单地说就是各个设备间自动倒腾内存的东西,转移数据的时候并不需要CPU干涉,减少了CPU的负担。由于所有的数据都不经过CPU进行干涉,如何获取其中的数据也是倒腾了一阵子。下面讲讲主要代码的配置:

  在摄像头DCMI的配置中首先根据摄像头将各个管脚设置成需要的,这个例程里都有,不贴了。

  要一帧一帧处理数据完了再获取数据,摄像头配置中DCMI_CaptureMode要配置成快照模式:DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_SnapShot,这样每完成一帧图像的获取,摄像头就停止捕获数据了,要想它再次捕获数据只需要执行DCMI_CaptureCmd(ENABLE)就可以了。

  然后是摄像头的中断配置(DCMI_ITConfig),在中断配置中,官方的例程是配置的垂直同步DCMI_ITConfig(DCMI_IT_VSYNC, ENABLE),通过垂直同步进行的中断中,获得的数据是整帧画面的数据,我们的板子的RAM就只有192k,呵呵,一帧图像放不进去,所以没有使用垂直同步中断,用的是列数据中断DCMI_ITConfig(DCMI_IT_LINE, ENABLE)。列数据中断,也就是说摄像头每采集到一列数据,就在它的列中断位(DCMI_IT_LINE位)上置1。我们这个摄像头采集的数据是240*320像素的16位色图像。也就是说每次摄像头产生列中断的时候都会采集到320个16位的数据。在每次列中断发生时都在列中断的中断服务中对数据进行处理就ok啦。

  在官方给的例程文件中stm32f4xx_it.c是用来放各个中断服务的文件。摄像头的中断服务在void DCMI_IRQHandler(void)函数里面,我们这用到的列中断,所以对其中的if (DCMI_GetITStatus(DCMI_IT_LINE) != RESET) 进行添加代码即可,最后不要忘了清除摄像头的列中断标志DCMI_ClearITPendingBit(DCMI_IT_LINE)。

  为了能够更有效的利用CPU的资源,当然不要丢了DMA这神器。下面进行DMA的配置。官方例程中需要改的的地方是DMA_InitStructure.DMA_Memory0BaseAddr = FSMC_LCD_ADDRESS这个地方,FSMC_LCD_ADDRESS是LCD屏幕的地址,我们这里要把数据取下来,得弄个数组存放数据。这里我弄了个全局的数组变量uint16_t fps[320],每个像素16位数据RGB--5:6:5,每列320个数据。所以DMA_Memory0BaseAddr参数就是这么配置DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)fps。DMA_MemoryInc要设置成DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable。这是目的地址写入后自增指针的配置。这样数据才能往fps数组里排着写入。

  设置的理论基本说完了。下面上代码


DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_SnapShot;//快照模式

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_LINE, ENABLE);//列中断

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断抢占组1

NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;//摄像头中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//先占优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//从优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//开启中断控制通道

NVIC_Init(&NVIC_InitStructure);//初始化上面的中断配置


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//使能DMA2时钟

DMA_DeInit(DMA2_Stream1);//复位DMA2_Stream1数据流的配置

DMA_InitStructure.DMA_Channel = DMA_Channel_1;//DMA流通道

DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS;//外设内存地址

DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)fps;//内存地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//数据方向从外设到内存

DMA_InitStructure.DMA_BufferSize = 320;//每次转移320数据,每个数据的位数根据目的地设置定

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不改变

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址在每次写入后自增

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设每单位长度_Word是32位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内存每单位长度_HalfWord是16位

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配置


void DCMI_IRQHandler(void)//摄像头的中断服务

{      

if (DCMI_GetITStatus(DCMI_IT_VSYNC) != RESET)//垂直中断的配置 需要DCMI_ITConfig(DCMI_IT_VSYNC, ENABLE);

{  

DCMI_ClearITPendingBit(DCMI_IT_VSYNC);  

}

if (DCMI_GetITStatus(DCMI_IT_LINE) != RESET)//列中断的配置 需要DCMI_ITConfig(DCMI_IT_LINE, ENABLE);

{

DCMI_ClearITPendingBit(DCMI_IT_LINE);

}

if (DCMI_GetITStatus(DCMI_IT_FRAME) != RESET)//帧中断的配置 需要DCMI_ITConfig(DCMI_IT_FRAME, ENABLE);

{

DCMI_ClearITPendingBit(DCMI_IT_FRAME);

}

if (DCMI_GetITStatus(DCMI_IT_ERR) != RESET)//错误中断的配置 需要DCMI_ITConfig(DCMI_IT_ERR, ENABLE);

{

DCMI_ClearITPendingBit(DCMI_IT_ERR);

}

}


关键字:STM32F4xx  摄像头数据  处理 引用地址:STM32F4xx 取得摄像头数据并进行处理

上一篇:STM32启动模式及IAP
下一篇:stm32f407之MyDebugger(操作寄存器)

推荐阅读最新更新时间:2024-03-16 16:14

基于ARM核嵌入式微处理器的以太网应用
1 引言 随着微电子技术和计算机技术的发展,嵌入式技术得到广阔的发展空间,特别是进入20世纪90年代以来,嵌入式技术的发展和普及更为引人注目,已经成为现代工业控制、通信类和消费类产品发展的方向,在通信领域,众多网络设备如VOIP,WirelessLAN,ADSL等都包含有大量嵌入式技术的成份,广播电视在向数字化的趋势发展,DVB,DAB技术也逐渐在全面推广起来,个人消费类产品,如PDA、数码相机、MP3播放器等产品都离不开嵌入式技术的支持,嵌入式技术在ATM、可视电话、汽车的ABS等产品中也都有大量的应用,此外,军事领域之中也处处可见嵌入式技术的身影,如单兵信息终端,便携式保密机,战场指挥系统等,可以说,嵌入式系统已经渗透到人
[网络通信]
英特尔下周发布N470凌动处理器:主频1.83GHz
据国外媒体报道,消息人士表示,英特尔将于下周一发布最新款N470凌动(Atom)处理器。   消息人士透露,大型PC厂商也将同步发布采用该处理器的上网本。N470与目前的N450配置基本相同,但主频却由1.66GHz提升到了1.83GHz。   由于凌动处理器与主流处理器之间的主要差距在于性能,因此该产品的速度每提升一点都会对整机性能有所帮助。为了降低能耗,凌动采用了与酷睿2和酷睿i系列主流处理器不同的架构,但性能也因此有所降低。而且搭配凌动处理器的上网本售价通常都低于350美元,这类产品大都都采用了单核处理器,而主流笔记本则大都采用速度更快的双核处理器。   英特尔去年发布了最新的“Pine Trail”凌动处理器,将原
[手机便携]
差压变送器在监测系统中的应用及故障处理
引言   差压变送器是一种将压力差转换成直流标准信号的远传压力测量仪器,广泛应用于工业生产和科学研究,是获取、处理、传送各种信息的硬件。随着企业自动化水平的不断提高,其应用范围越来越广泛,生产中遇到的问题也越来越多。根据作者现场多年的实际经验,要想正确的安装、使用、维护差压传感器,必须了解其工作原理,明确其如何进行数据采集以及常见故障处理方法。   1、工作原理与监测系统   1.1工作原理   来自双侧导压管的差压直接作用于变送器传感器双侧隔离膜片上,通过膜片内的密封液传导至测量元件上,测量元件将测得的差压信号转换为与之对应的电信号传递给转换器,经过放大等处理变为标准电信号输出。差压变送器的几种应用测量方式:(1)与节流元件
[工业控制]
瞄准汽车电子行业,国科微ADAS芯片选择芯原视觉处理器IP
芯原 股份有限公司(芯原)今日宣布,深圳市国科微半导体股份有限公司(以下简称“深国科”)已在其SGKS6802X先进驾驶辅助系统(ADAS)芯片中选择了芯原Vivante GC7000UL-VX 视觉处理器 IP ,该芯片所属的ADAS产品线主要供应汽车电子零部件生产商。深国科借助其软件开发工具包(SDK)以促进ADAS算法社区的快速发展。   深国科的6802X是一款先进的车规SoC,采用了多种计算单元,其中包括可编程视觉GPU处理器和由硬件实现的ADAS应用功能。SGKS6802X也为图形/图像识别和处理提供了一个高性价比、高性能的单芯片解决方案,并且为把ADAS应用于大规模市场产品提供了大量接口。GC7000UL-VX通过一
[嵌入式]
采用JTAG仿真器的DSP中断检测处理技术方案
1、引言   在采用集成化的开发调试平台CCS结合基于JTAG技术的仿真器实现 DSP系统的实时性分析过程中设定中断检测点是非常重要的,中断检测点可以中断程序的执行以进行特定的操作,例如可以进行数据文件的输入输出,可以刷新图表和数据窗口等,便于在实时性分析中更有效的观察数据处理的显示结果。 2、基于 JTAG技术的仿真器   JTAG技术即边界扫描技术,是一种专用的电子系统测试技术,就是通常所指的 IEEE1149.1标准,已经在各行业中得到了广泛的应用,如图 1,一个符合 IEEE1149.1标准的 JTAG器件,有别于不同的逻辑器件,内部都包括一个 TAP(测试访问端口)控制器,其次在芯片内部经由一个扫描链路将所有
[嵌入式]
采用JTAG仿真器的DSP中断检测<font color='red'>处理</font>技术方案
工业级特性在嵌入式处理中至关重要
作者:David Katz Rick Gentile ADI公司 许多通用信号处理器具有良好的计算性能和基本连接特性,因而能为工业应用所接受。另一方面,有些重要的外设增强功能可以显着改进处理器的能力,使其适合要求更高的工业系统。本文将就网络和电机控制应用讨论两个增强功能的例子。 以太网接口 对于传统工业应用, 以太网控制器 可提供基本网络连接。控制器(MAC)与处理器通常位于同一芯片上。它一般与一个外部PHY芯片配合使用,构成完整的接口。 也可以使用外部MAC/ PHY芯片 ,常常将这种芯片直接连到处理器的异步存储器接口。虽然以太网MAC/PHY组合芯片的价格持续下降,已达到几乎与独立PHY芯片相当的程度,
[工业控制]
工业级特性在嵌入式<font color='red'>处理</font>中至关重要
欧德宁:2011年推首款英特尔处理器智能手机
据国外媒体报道,英特尔CEO欧德宁(Paul Otellini)周三表示,英特尔处理器迟早将打入智能手机和平板电脑市场,这是一场马拉松比赛,而不是短跑冲刺。   欧德宁称:“在平板电脑和智能手机市场,英特尔目前毫无建树。每个人都想知道我们将如何应对,但赢得这场战争需要时间。”   10多年来,英特尔一直试图将其在PC市场的主导地位普及到手机和其他移动设备市场。但目前还没有任何一款智能手机采用英特尔处理器,苹果iPad和其他厂商的平板电脑也未使用英特尔处理器。但欧德宁表示,计划在2011年展示首款采用英特尔处理器的智能手机。   作为全球最大的PC处理器制造商,英特尔四年前调整了移动处理器开发战略,推出了Atom处理器。对
[手机便携]
带你认识型号纷繁的高通骁龙80X处理
    每每提到高通骁龙800系列处理器,大家一定会将它与高性能、旗舰等名词相挂钩,但是高通骁龙800只是一个系列的家族代号。在800这个数字的背后还拥有众多的小分类,不过这些复杂细致的分类,经常会把大家弄得十分头痛。今天我就带大家细致得剖析一下高通骁龙800,让大家不再傻傻分不清楚。 高通骁龙800处理器解析(图片来自网络)   骁龙800主要技术规格解读   处理器   制程:28nm   架构:Krait 400   核心数:4核   主频:单核速度可达2.3GHz   GPU   Adreno 330 GPU(支持各种计算API,包括OpenGL ES 3.0、DirectX、OpenCL、Renderscript Co
[手机便携]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved