3408|5

527

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【 ST NUCLEO-H743ZI测评】(4)-DCMI之OV7620采集 [复制链接]

    我对对应摄像头的认识最早应该是从之前飞思卡尔智能车(现在应该是恩智浦智能车了)开始的,那会儿有摄像头组,我参加的不是这个组别,但是对这个比较好奇,我是参加电磁组,采集的是磁场的中的几个点,根据点的值来推断通电导线位置。而摄像头是直接看一个面,低头看脚下,抬头看前方很是羡慕。再之后是参加论坛测评NXP LPC54100的时候想趁机会采集下摄像头,当时是用的之前的土办法,自己设行中断场中断来大致获取数据,数据量也有限,根本无法获得整张图片。    现在有了H7的板子,自然是要试试DCMI的,前面废话说了不少,马上开始正题。

DCMI配置大致如上图,再额外使能个串口。
下面是初始化代码
  1. DCMI->IER |=  DCMI_IER_VSYNC_IE ;
  2.         DCMI->CR |=  DCMI_CR_CAPTURE | DCMI_CR_CM;
  3.         DCMI->CR =        0x00094282;
复制代码

开中断,再中断里判断采集的状况。
  1. if((DCMI->RISR&DCMI_RIS_VSYNC_RIS)==DCMI_RIS_VSYNC_RIS)
  2.         {
  3.                 DCMI->ICR |= DCMI_ICR_VSYNC_ISC;
  4.                 if(dcmi_line_cnt>0)finish_cnt[2]=dcmi_line_cnt;
  5.                 dcmi_line_cnt=0;
  6.                 if(dcmi_pixel_cnt>0)finish_cnt[0]=dcmi_pixel_cnt;
  7.                 dcmi_pixel_cnt=0;
  8.                
  9.         }
  10.         if((DCMI->RISR&DCMI_RIS_LINE_RIS)==DCMI_RIS_LINE_RIS)
  11.         {
  12.                 dcmi_line_cnt++;
  13.                 DCMI->ICR |= DCMI_ICR_LINE_ISC;
  14.         }
  15.         if((DCMI->RISR&DCMI_RIS_FRAME_RIS)==DCMI_RIS_FRAME_RIS)
  16.         {
  17.                 if(dcmi_line_cnt>0)finish_cnt[3]=dcmi_line_cnt;
  18.                 dcmi_line_cnt=0;
  19.                 if(dcmi_pixel_cnt>0)finish_cnt[1]=dcmi_pixel_cnt;
  20.                 dcmi_pixel_cnt=0;
  21.                 DCMI->ICR |= DCMI_ICR_FRAME_ISC;
  22.                 vsync_flag=1;
  23.         }
  24.         if((DCMI->RISR&DCMI_RIS_OVR_RIS)==DCMI_RIS_OVR_RIS)
  25.         {
  26.                 DCMI->ICR |= DCMI_ICR_OVR_ISC;
  27.         }
  28.         if((DCMI->RISR&DCMI_RIS_ERR_RIS)==DCMI_RIS_ERR_RIS)
  29.         {
  30.                 DCMI->ICR |= DCMI_ICR_ERR_ISC;
  31.         }
复制代码

在while循环里处理采集的数据,采集完完整的数据交给TFT显示,TFT显示是沿用之前的SPI TFT显示。
  1. if((DCMI->SR&DCMI_SR_FNE)==DCMI_SR_FNE)
  2.                 {
  3.                        
  4.                         d_temp.u32=DCMI->DR;
  5.                         d_buf[dcmi_pixel_cnt*2]=d_temp.u8[0];
  6.                         d_buf[dcmi_pixel_cnt*2+1]=d_temp.u8[2];
  7.                         dcmi_pixel_cnt++;
  8.                         if(dcmi_pixel_cnt>10000)
  9.                                 dcmi_pixel_cnt=0;
  10.                         HAL_GPIO_TogglePin(LD3_GPIO_Port,LD3_Pin);
  11.                 }
  12.                 else
  13.                 {
  14.                         uart_decode();
  15.                         if(vsync_flag)
  16.                         {
  17.                                 vsync_flag=0;
  18.                                 showimageHUI2RGB(d_buf);
  19.                                 //HAL_Delay(100);
  20.                                         //DCMI->CR |= DCMI_CR_CAPTURE;
  21.                         }
  22.                 }
  23.   }
复制代码

由于OV7620我用的只采灰度图像,TFT是彩屏,于是需要转换一下
tRGB =((x >> 3)|((x & ~3) << 3)|((x & ~7) << 8));
DCMI的功能很多,有各种功能,比如单次拍照,连续采集,全屏采集,指定区域采集,各种分配等。
除此调试有点摸不到头脑,于是写了个简单的上位机软件配合调试。
功能看下面串口解码函数就一目了然,上位机可以控制H7开始采集,可以将采集的数上传,也可以实时更改DCMI寄存器,这样调试就相对简单点,不用来回编译下载程序。
  1. void uart_decode(void)
  2. {
  3.         if(uart_flag)
  4.         {
  5.                 uart_flag=0;
  6.                 switch(uart_dara[2])
  7.                 {
  8.                         case 0:
  9.                                 if(uart_dara[3])
  10.                                 {
  11.                                         DCMI->CR |= DCMI_CR_CAPTURE;
  12.                                 }
  13.                         break;
  14.                         case 1:
  15.                                 if(uart_dara[3])
  16.                                 {
  17.                                         HAL_UART_Transmit(&huart3,"START",5,100);
  18.                                         HAL_UART_Transmit(&huart3,d_buf,19200,10000);
  19.                                         HAL_UART_Transmit(&huart3,"END",3,100);
  20.                                         DCMI->CR |= DCMI_CR_CAPTURE;
  21.                                 }
  22.                         break;
  23.                         case 2:
  24.                                 if(uart_dara[3])
  25.                                 {
  26.                                         DCMI->CR |= DCMI_CR_CM;
  27.                                 }
  28.                         break;
  29.                         case 3:
  30.                                 d_reg.u8[3]=uart_dara[4];
  31.                                 d_reg.u8[2]=uart_dara[5];
  32.                                 d_reg.u8[1]=uart_dara[6];
  33.                                 d_reg.u8[0]=uart_dara[7];
  34.                                 switch(uart_dara[3])
  35.                                 {
  36.                                         case 0:
  37.                                                
  38.                                         break;
  39.                                         case 1:
  40.                                                 DCMI ->CR = d_reg.u32;
  41.                                         break;
  42.                                         case 2:
  43.                                                 DCMI ->CWSIZER = d_reg.u32;
  44.                                         break;
  45.                                         case 3:
  46.                                                 DCMI ->CWSTRTR = d_reg.u32;
  47.                                         break;
  48.                                         case 4:
  49.                                                 DCMI ->ESCR = d_reg.u32;
  50.                                         break;
  51.                                         case 5:
  52.                                                 DCMI ->ESUR = d_reg.u32;
  53.                                         break;
  54.                                         case 6:
  55.                                                 DCMI ->IER = d_reg.u32;
  56.                                         break;

  57.                                 }
  58.                         break;
  59.                                
  60.                 }
  61.         }
  62. }
复制代码

上位机界面如下图

采集实拍


最后再来几张摄像头采集,TFT显示的图片。





DCMI的功能很强大,再配上H7的超高性能,应该可以做些人工智能或者机器视觉之类的东西,本次测评程序有点简陋,简单的测试了下DCMI的功能,没有使用DMA,这肯定很影响H7的正常发挥,希望H7不要介意。
本次测评到此结束,谢谢阅读!


此内容由EEWORLD论坛网友supermiao123原创,如需转载或用于商业用途需征得作者同意并注明出处



此帖出自stm32/stm8论坛

最新回复

这个看起来不错  详情 回复 发表于 2019-3-16 22:56
点赞 关注(1)
 

回复
举报

401

帖子

1

TA的资源

一粒金砂(高级)

沙发
 
厉害,请教上位机用什么编的?
此帖出自stm32/stm8论坛

点评

楼下说的对,labview  详情 回复 发表于 2019-3-17 17:29
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
xunke 发表于 2019-3-16 20:27
厉害,请教上位机用什么编的?

LabVIEW
此帖出自stm32/stm8论坛
 
 

回复

9795

帖子

24

TA的资源

版主

4
 
这个看起来不错
此帖出自stm32/stm8论坛

点评

谢谢  详情 回复 发表于 2019-3-17 17:29
 
 
 

回复

527

帖子

1

TA的资源

一粒金砂(高级)

5
 
xunke 发表于 2019-3-16 20:27
厉害,请教上位机用什么编的?

楼下说的对,labview
此帖出自stm32/stm8论坛
 
 
 

回复

527

帖子

1

TA的资源

一粒金砂(高级)

6
 

谢谢
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表