基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传

基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传

  • 最近的一个小项目
  • 方案介绍
  • 硬件连接
  • 下位机程序部分
    • 使用串口助手进行测试
  • 播放视频
  • 写在最后

最近的一个小项目

本人最近在设计一个无人机飞控,无人机还在学校呢,飞控算法无法测试,就打算先把摄像头模组调通再说。期间查找了许多先行者们的资料,尽管资料很给力,但我还是踩了些坑,所以打算些篇博文总结一下调试的过程。

方案介绍

STM32CubeIDE是ST推出的一个基于HAL库的图形化配置驱动的集成开发工具,使用起来非常方便,即使是十分复杂的外设,只要知道各个参数的含义,就可以动动鼠标生成相应的驱动配置代码。H750是ST推出的一款高性价比的芯片,主频高达400MHz,有丰富的外设且价格低廉(我在某宝41买的),这里使用其DCMI接口可以直接与OV2640连接并驱动。

基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第1张图片
实物图
基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第2张图片
最终效果

硬件连接

基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第3张图片 基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第4张图片
摄像头使用到的引脚 OV2640引脚图

其中XCLK可以接外部有源晶振或者配置单片机MCO输出,单片机需要用到的外设就是DCMI、I2C和通讯用的接口了,我这里用的是串口4,以下是具体配置,大家注意千万不要错了。
基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第5张图片
基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第6张图片
基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第7张图片
基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第8张图片
基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第9张图片
配置完成,保存,生成代码就OK啦!

下位机程序部分

下位机我参考的是这篇文章 在FreeRTOS使用DCMI采集JPEG教程 这里我们做一点简单的介绍

void StartOV2640()
{
     

	__HAL_DCMI_ENABLE_IT(DCMI_hdcmi, DCMI_IT_FRAME);//每次拍照前都要使能帧中断
	memset((void *)JpegBuffer,0,pictureBufferLength * 4);//把接收BUF清空
	HAL_DCMI_Start_DMA(DCMI_hdcmi, DCMI_MODE_SNAPSHOT,(uint32_t)JpegBuffer, pictureBufferLength);//启动拍照

}

void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
     
	
	HAL_DCMI_Suspend(DCMI_hdcmi);//拍照完成,挂起DCMI
	HAL_DCMI_Stop(DCMI_hdcmi);//拍照完成,停止DMA传输
	int pictureLength =pictureBufferLength;
	while(pictureLength > 0)//循环计算出接收的JPEG的大小
	{
     
		if(JpegBuffer[pictureLength-1] != 0x00000000)
		{
     
			break;
		}
		pictureLength--;
	}
	pictureLength*=4;
	if(mHuart != NULL)
		HAL_UART_Transmit(mHuart, (uint8_t*)JpegBuffer, pictureLength, 100000);//将jpeg原始数据传出

	StartOV2640();
}

在jpeg模式下,我们需要通过帧中断来判断照片传输完成,同时注意数据缓冲区大小,根据配置,图像大小一般是2.8KB-100KB不等。主程序只需初始化,然后启动拍照即可。
如果你的I2C读取的OV2640厂商等信息结果一直是0x00,那么有可能是OV2640的复位引脚导致的。STM32CUBE默认将引脚配置成低电平,而OV2640的复位脚又是低有效,这样就会造成SCCB读取结果为00。
代码 初始化部分和寄存器都是借鉴21ic那个博主的,逻辑部分也十分简单。为了方便大家比对检查,这里将代码开放出来。

使用串口助手进行测试

在正式测试之前,可以使用调试器查看单片机是否接收到了JPEG的数据头和数据尾:
数据头
数据尾
在确认收到后我们就可以进一步使用串口助手进行调试了,这里我用的是丁丁串口助手SSCOM,选择hex显示,接收数据到文件,注意在进行这种测试的时候下位机只要进行一次拍照操作即可。这时串口助手慧生成两个文件,我们使用其中的.DAT文件,它将接收到的数据按二进制保存在文件中,我们将其后缀更改成jpg,顺利的话就能看到刚刚拍摄的图像了。

播放视频

我们要做的是图传,肯定是要具备视频传输能力的,这里我用VS写了一个能播放jpeg数据流的上位机,只需按我提供的下位机程序不断地发送jpeg数据就可以使用,通用性较强,同时它还有测速的功能,适合调试大数据流的下位机。这里以1.9元收费的形式开放下载。

下载链接.

写在最后

有了Cube来帮我配置外设,我们就可以以很低的学习成本上手各种外设,比如USB外设。USB通信有速率高误码率极低应用广泛成熟的特点。博主用stm32f103做测试,配置USB Device FS CDC通信,在博主做的串口助手中进行测试,速度如下:基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传_第10张图片
速度还是十分不错的,这套测试系统,某种意义上已经是一个数字视频监视系统了,接下来就剩无线传输的内容了。关于USB CDC的配置其实十分简单,如果时间充裕的话我也水一篇。

你可能感兴趣的:(单片机,stm32,嵌入式)