1361|5

34

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

STM32H7S78-DK测评(三)——OV5640摄像头测试 [复制链接]

本帖最后由 FuShenxiao 于 2024-10-7 11:55 编辑

转接板设计

观察开发板原理图摄像头接口可以发现,接口居然有30pin,这和软排线连接的OV5640(24pin)或者OV5640模块(2*9pin)显然是不相同的。

恰好我手头有一块正点原子OV5640摄像头模块,于是我就针对它完成转接板的设计。

观察正点原子OV5640摄像头模块原理图可以轻易地与STM32H7S78-DK的摄像头接口相对应。

I2C1_SCL   --->   OV_SCL

I2C1_SDA   --->   OV_SDA

DCMI_D0 ~ DMCI_D7   --->   OV_D0 ~ OV_D7

RSTI   --->   OV_RESET

PWR_EN   --->   OV_PWDN

DCMI_VSYNC   --->   OV_VSYNC

DCMI_HSYNC   --->   OV_HREF

DCMI_PIXCLK   --->   OV_PCLK 

在嘉立创中绘制原理图如下

绘制PCB如下。为了保证相关电学特性稳定,需要在OV5640供电端加入100nF的去耦电容,在SCL和SDA两个IIC接口上加入4.7kΩ的上拉电阻。

最终得到PCB正反面如下图所示

 

 

具体工程文件参见STM32H7S78-DK摄像头转接板 - 立创开源硬件平台 (oshwhub.com)

引脚配置

首先在CubeMX中配置时钟(这里不再赘述)

接着分别配置DCMIPP(摄像头接口)和LTDC(显示屏接口)

 

配置两个指示灯

完成以上操作后,生成代码

代码编写

OV5640初始化代码,需要注意的是,OV5640默认原始图像是上下翻转的,所以要使用OV5640_FLIP将图像翻转

static uint32_t OV5640_Config(uint32_t Resolution, uint32_t PixelFormat)
{
  OV5640_IO_t              IOCtx;
  uint32_t                 id;
  uint32_t                 ret = OV5640_OK;
  static OV5640_Object_t   OV5640Obj;

  /* Configure the Camera driver */
  IOCtx.Address     = CAMERA_OV5640_ADDRESS;
  IOCtx.Init        = BSP_I2C1_Init;
  IOCtx.DeInit      = BSP_I2C1_DeInit;
  IOCtx.ReadReg     = BSP_I2C1_ReadReg16;
  IOCtx.WriteReg    = BSP_I2C1_WriteReg16;
  IOCtx.GetTick     = BSP_GetTick;

  /* Register Bus IO */
  if(OV5640_RegisterBusIO (&OV5640Obj, &IOCtx) != OV5640_OK)
  {
    ret = OV5640_ERROR;
  }

  /* Read ID */
  if(OV5640_ReadID(&OV5640Obj, &id) != OV5640_OK)
  {
    ret = OV5640_ERROR;
  }

  if(id == OV5640_ID)
  {
    /* Initialize the camera Module */
    Camera_Drv = (CAMERA_Drv_t *) &OV5640_CAMERA_Driver;

    OV5640_DeInit(&OV5640Obj);
    if(Camera_Drv->Init(&OV5640Obj, Resolution, PixelFormat) != OV5640_OK)
    {
      ret = OV5640_ERROR;
    }
    else if(Camera_Drv->MirrorFlipConfig(&OV5640Obj, OV5640_FLIP) != OV5640_OK)
    {
      ret = OV5640_ERROR;
    }
  }

  return ret;
}

在主函数中使用如下代码完成OV5640初始化

if(OV5640_Config(OV5640_R480x272, OV5640_RGB565) != OV5640_OK)
{
  /* Camera Module Config KO */
  Error_Handler();
}

DCMIPP接口获取数据信息

HAL_StatusTypeDef HAL_DCMIPP_PIPE_Start(DCMIPP_HandleTypeDef *hdcmipp, uint32_t Pipe, uint32_t DstAddress,
                                        uint32_t CaptureMode)
{
  assert_param(IS_DCMIPP_PIPE(Pipe));
  assert_param(IS_DCMIPP_CAPTURE_MODE(CaptureMode));

  /* Check pointer validity */
  if ((hdcmipp == NULL) || ((DstAddress & 0xFU) != 0U))
  {
    return HAL_ERROR;
  }

  /* Check DCMIPP pipe state */
  if (hdcmipp->PipeState[Pipe]  != HAL_DCMIPP_PIPE_STATE_READY)
  {
    return HAL_ERROR;
  }

  /* Set Capture Mode and Destination address for the selected pipe */
  DCMIPP_SetConfig(hdcmipp, Pipe, DstAddress, CaptureMode);

  /* Enable Capture for the selected Pipe */
  DCMIPP_EnableCapture(hdcmipp, Pipe);

  return HAL_OK;
}

在主函数中用如下代码完成DCMIPP接口数据接收,将接收到的图像信息传到CAMERA_FRAME_BUFFER中。CAMERA_FRAME_BUFFER后面的传参为当前运行模式,除了可以选择DCMIPP_MODE_CONTINUOUS,还可以使用DCMIPP_MODE_SNAPSHOT

if(HAL_DCMIPP_PIPE_Start(&phdcmipp, DCMIPP_PIPE0, (uint32_t)CAMERA_FRAME_BUFFER , DCMIPP_MODE_CONTINUOUS) != HAL_OK)
{
  Error_Handler();
}

也可以使用双缓冲模式,代码如下

HAL_StatusTypeDef HAL_DCMIPP_PIPE_DoubleBufferStart(DCMIPP_HandleTypeDef *hdcmipp, uint32_t Pipe, uint32_t DstAddress0,
                                                    uint32_t DstAddress1, uint32_t CaptureMode)
{
  assert_param(IS_DCMIPP_PIPE(Pipe));
  assert_param(IS_DCMIPP_CAPTURE_MODE(CaptureMode));

  /* Check pointer validity */
  if ((hdcmipp == NULL) || ((DstAddress0 & 0xFU) != 0U) || ((DstAddress1 & 0xFU) != 0U))
  {
    return HAL_ERROR;
  }

  /* Check DCMIPP pipe state */
  if (hdcmipp->PipeState[Pipe]  != HAL_DCMIPP_PIPE_STATE_READY)
  {
    return HAL_ERROR;
  }

  /* Set Capture Mode and Destination addresses for the selected pipe */
  DCMIPP_SetDBMConfig(hdcmipp, Pipe, DstAddress0, DstAddress1, CaptureMode);

  /* Enable Capture for the selected Pipe */
  DCMIPP_EnableCapture(hdcmipp, Pipe);

  return HAL_OK;
}

最后在显示屏上显示图像,在这一步中,需要将CAMERA_FRAME_BUFFER的数据显示到屏幕的指定区域内

static void MX_LTDC_Init(void)
{

  /* USER CODE BEGIN LTDC_Init 0 */

  /* USER CODE END LTDC_Init 0 */

  LTDC_LayerCfgTypeDef pLayerCfg = {0};

  /* USER CODE BEGIN LTDC_Init 1 */

  /* USER CODE END LTDC_Init 1 */
  hltdc.Instance = LTDC;
  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
  hltdc.Init.HorizontalSync = 3;
  hltdc.Init.VerticalSync = 3;
  hltdc.Init.AccumulatedHBP = 11;
  hltdc.Init.AccumulatedVBP = 11;
  hltdc.Init.AccumulatedActiveW = 811;
  hltdc.Init.AccumulatedActiveH = 491;
  hltdc.Init.TotalWidth = 819;
  hltdc.Init.TotalHeigh = 499;
  hltdc.Init.Backcolor.Blue = 0;
  hltdc.Init.Backcolor.Green = 0;
  hltdc.Init.Backcolor.Red = 0;
  if (HAL_LTDC_Init(&hltdc) != HAL_OK)
  {
    Error_Handler();
  }
  pLayerCfg.WindowX0 = xpos;
  pLayerCfg.WindowX1 = xpos + ImageWidth;
  pLayerCfg.WindowY0 = ypos;
  pLayerCfg.WindowY1 = ypos + ImageHeight;
  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
  pLayerCfg.Alpha = 255;
  pLayerCfg.Alpha0 = 0;
  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
  pLayerCfg.FBStartAdress = (uint32_t)CAMERA_FRAME_BUFFER;
  pLayerCfg.ImageWidth = ImageWidth;
  pLayerCfg.ImageHeight = ImageHeight;
  pLayerCfg.Backcolor.Blue = 0;
  pLayerCfg.Backcolor.Green = 0;
  pLayerCfg.Backcolor.Red = 0;
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN LTDC_Init 2 */

  /* USER CODE END LTDC_Init 2 */

}

结果展示

当程序正常运行时,LD1会持续闪烁,OV5640中的内容也会实时传输到屏幕上,传输显示的过程还是较为流畅的。

不过噪声的问题似乎有些严重,面对比较白和亮的地方会产生一些紫色的点点,但是对着暗色调的就不会产生这个问题(比如我的书包,桌子在椅背的阴影部分)。考虑PCB绘制部分,网上对OV5640的建议是信号线之间的线长差距小于100mil,这个我符合要求。再考虑软排线的长度,10cm在诸多网友看来似乎确实有些长了,下一步尝试换短一点的软排线再试试。

不过让我费解的是,官方的板子既然做了这个接口,为什么不顺便再做一个适配的摄像头呢,就像STM32MP135F-DK开发板还配套摄像头模块。而且这个30pin的接口根本无法适配OV5640,还得自己画转接板。

 

 

 

E60298581D98084D62290AA6065AE7CA

 程序源码:

DCMIPP_ContinuousMode.rar (503.26 KB, 下载次数: 2)

此帖出自stm32/stm8论坛

最新回复

楼主是太历害了呀,可以分享开发板的设计吗?   详情 回复 发表于 2024-10-13 19:41
点赞 关注
 

回复
举报

169

帖子

1

TA的资源

纯净的硅(初级)

沙发
 

楼主。ST官方手册有说的,配套摄像头模块型号是MB1683,Mouser上售价400+元人民币。

Screenshot_2024-10-08-13-57-32-921_cn.wps.moffice_eng.jpg (0 Bytes, 下载次数: 0)

Screenshot_2024-10-08-13-57-32-921_cn.wps.moffice_eng.jpg

9c9aee3266ec6d04.jpg (0 Bytes, 下载次数: 0)

9c9aee3266ec6d04.jpg
此帖出自stm32/stm8论坛

点评

抱歉我没仔细读文档,不过这个摄像头也是基于OV5640的,我看e络盟要将近300块,但是感觉都挺贵的,还是自己画个转接板划算 [attachimg]849820[/attachimg]    详情 回复 发表于 2024-10-8 22:10
 
 

回复

34

帖子

2

TA的资源

一粒金砂(中级)

板凳
 
cc1989summer 发表于 2024-10-8 14:00 楼主。ST官方手册有说的,配套摄像头模块型号是MB1683,Mouser上售价400+元人民币。

抱歉我没仔细读文档,不过这个摄像头也是基于OV5640的,我看e络盟要将近300块,但是感觉都挺贵的,还是自己画个转接板划算

 

此帖出自stm32/stm8论坛
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

4
 

很不错,买了几块开发板,还没有实际操作下手,学习动起来。

此帖出自stm32/stm8论坛
 
 
 

回复

6968

帖子

11

TA的资源

版主

5
 

楼主是太历害了呀,可以分享开发板的设计吗?

此帖出自stm32/stm8论坛

点评

这块开发板是ST官方的开发板,ST官网上能找到开发板资料的。如果你说的是OV5640转接板,我已经在嘉立创开源了。  详情 回复 发表于 2024-10-13 19:58
 
 
 

回复

34

帖子

2

TA的资源

一粒金砂(中级)

6
 
lugl4313820 发表于 2024-10-13 19:41 楼主是太历害了呀,可以分享开发板的设计吗?

这块开发板是ST官方的开发板,ST官网上能找到开发板资料的。如果你说的是OV5640转接板,我已经在嘉立创开源了。

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
高速模拟电路设计技术

高速模拟电路设计技术 看看就知道有不有用了!! 我觉得很可以的!!!

快快乐乐跟我学开关电源设计

转自ourdev,非常好的学习指导,推荐给大家。 “我想DIY开关电源,要具备哪些理论知识、实践技能和工程素质啊?&rdquo ...

MCU一上电就睡眠时怎么下载?

MCU中的代码一上电就进入深度睡眠,现在用JTAG的SWD接口没法下载了。各路大侠有什么高招吗?

【DIY】QS18-12黄金纪念版辉光钟完成.GPS校时.辉光数字特效【多图】

做过那么多时钟,为什么还是喜欢辉光管?原因其实很简单,它上面刻有历史... 或许您对电子管没有一点感情,也或许您见到的第一 ...

FPGA_之旅_流水灯.pdf

FPGA_之旅_流水灯.pdf

花粉过敏有什么好办法防止或治愈吗?

又到了万物复苏春暖花开的季节,正是去公园游玩的好时候,然而对于花粉过敏的朋友来说,却有着不少困扰。 打喷嚏、面 ...

MOS管温升、LDO的温升怎样计算才是最合理

MOS管温升、LDO的温升怎样计算才是最合理 1.MOS管温升怎样计算才是最合理,一般的,温升=环境温度+热阻*功率,,请问这样 ...

【平头哥RVB2601创意应用开发】2 熟悉基本外设GPIO

本帖最后由 lux168 于 2022-4-18 17:01 编辑 一直在熟悉 CH2601和CDK系统,只是有时候工作的原因,没有连续的研究,断断续 ...

【花雕动手做】有趣好玩的音乐可视化系列小项目(13)---有机棒立柱灯

徒步的路上,在草丛里面捡到一些报废的有机棒 625364

控制之美(卷2)第一节——octave的环境搭建+基本测试

本帖最后由 Zhao_kar 于 2024-1-24 20:46 编辑 控制之美(卷2)第一节——开箱+octave的环境搭建+基本测试 声明 ...

关闭
站长推荐上一条 1/8 下一条

 
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
快速回复 返回顶部 返回列表