历史上的今天

今天是:2024年09月20日(星期五)

正在发生

2018年09月20日 | STM32F4xx 取得摄像头数据并进行处理

发布者:江上HZ 来源: 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(操作寄存器)

推荐阅读

Silicon Labs日前发布了全新的Wireless Xpress解决方案,帮助开发人员一天内连接并运行物联网应用,且无需进行软件开发。Silicon Labs的Wireless Xpress提供了基于配置的开发体验,满足了开发人员的所有需求,这包括经过认证的Bluetooth® 5 Low Energy(LE)和Wi-Fi®模块、集成的协议栈和易于使用的工具。 Silicon Labs公司高级副总裁兼物联网...
  光伏逆变器常见故障  1,低绝缘电阻  使用排除方法。拔下变频器输入侧的所有琴弦,然后逐个连接。使用变频器的功能检测绝缘电阻,检测问题串,找到问题字符串,检查直流接头是否有水浸短路支架。或者烧坏短路支架,并检查组件本身是否有边缘烧坏的黑点,导致组件通过框架泄漏到地面。   2,母线电压低  如果它出现在早期/晚期,这是一个正常的...
一名备受尊重的日本分析师Takashi Mochizuki近日发推,他转发了乐天证券的报道,在里面一名叫Nohio Imanaka的分析师预测称,PS5主机生命周期内的销量可能会超过2亿台,成为有史以来最成功的家用机。超过2亿台,这意味着PS5的累计销量将超过PS2和任天堂DS,目前这两个机器的销量都在1.55亿台左右。这一报告对索尼来说将是一个好消息,因为索尼在这款游戏...
据路透社报道,戴姆勒卡车公司CEO马丁·道姆在一份报告中表示,最近几周的关键芯片供应进一步收紧。“自夏季以来形势再次恶化。”马丁·道姆补充说。这影响了该公司在德国和美国的生产。马丁·道姆提及,订单已满,但由于主要汽车制造商都遭遇了芯片短缺,所以库存高企。“相当一部分已生产的车辆库存由于缺少关键部件无法出库,尽管客户急需车辆交付。”...

史海拾趣

问答坊 | AI 解惑

tlv5616中文资料

觉得有用,下载…

查看全部问答∨

急求icd2调试帮助!!!!!!

Connecting to MPLAB ICD 2 ...Connected Setting Vdd source to MPLAB ICD 2 ICDWarn0020: Invalid target device id (expected=0x71, read=0x0) ...Reading ICD Product ID Running ICD Self Test ...Passed MPLAB ICD 2 Ready Programmi ...…

查看全部问答∨

eboot下载nk.bin有点问题?

突然发现自己很落伍了。这些问题eeworld高人们是去年或者更早在问的。我到现在才发现自己这里很多不懂。废话少说了。上次eboot启动后一直没时间来学习这块。今天把usb中断实现了。可是下载nk.bin时出问题了?现在有几个问题想确认下? 1.eboot通过 ...…

查看全部问答∨

如何修理CRT显示器有扫描线问题

我有一台LG的CRT显示器,2002年买的,17纯平,到现在有了问题,总是有水平倾斜的淡灰色扫描线,宽度大约有4厘米 背景基本上是纯白色,很隐约地能看到桌面上的图像。 2006年的时候,就会有这样的情况出现:当天气潮湿,桌面就会很模糊,开机停几十 ...…

查看全部问答∨

寻求智能视频识别技术合作

业务需要,需求智能视频识别分析技术合作,请将技术、功能简介发邮件到112568@sina.com,再详谈…

查看全部问答∨

申请试用LM3S8962 评估套件

    前俩个目的非常明确,就是培养学生的兴趣。与其放任孩子们拨弄手机、上网,不如带他们研究探索怎样实现这些功能的。我们现在制度培养的孩子不愿提问题,很少思考,兴趣爱好也不多,畏难是因为吸引力不够。…

查看全部问答∨

LC测量小工具 规整贴第三 LCD1602显示部分

上周一,我们发布了 51 DIY规整贴二,anqi90完整的工作给了我们深刻的印象。同时他上传的视频,虽然无声——此时无声胜有声,给了我们的规整贴一道亮色。还有 鑫海宝贝,他赶在实习前,也出色地完成了领取的任务,完成这个测量电路的控制核心。 &n ...…

查看全部问答∨

有关msp430f149内部ad问题

在使用内部ad采样时,ADC12CTL0控制寄存器中的SHT0是决定采样保持时间的,,现在想通过按键实时改变采样保持时间,也就是随时改变SHT0的值,不过,好像SHT0在初始化设定之后,在后面的程序中再更改就不起作用了,,这样么?有什么解决方法?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved