基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传
最近的一个小项目
本人最近在设计一个无人机飞控,无人机还在学校呢,飞控算法无法测试,就打算先把摄像头模组调通再说。期间查找了许多先行者们的资料,尽管资料很给力,但我还是踩了些坑,所以打算些篇博文总结一下调试的过程。
方案介绍
STM32CubeIDE是ST推出的一个基于HAL库的图形化配置驱动的集成开发工具,使用起来非常方便,即使是十分复杂的外设,只要知道各个参数的含义,就可以动动鼠标生成相应的驱动配置代码。H750是ST推出的一款高性价比的芯片,主频高达400MHz,有丰富的外设且价格低廉(我在某宝41买的),这里使用其DCMI接口可以直接与OV2640连接并驱动。
![]() |
---|
实物图 |
![]() |
最终效果 |
硬件连接
![]() | ![]() |
---|---|
摄像头使用到的引脚 | OV2640引脚图 |
其中XCLK可以接外部有源晶振或者配置单片机MCO输出,单片机需要用到的外设就是DCMI、I2C和通讯用的接口了,我这里用的是串口4,以下是具体配置,大家注意千万不要错了。
配置完成,保存,生成代码就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通信,在博主做的串口助手中进行测试,速度如下:
速度还是十分不错的,这套测试系统,某种意义上已经是一个数字视频监视系统了,接下来就剩无线传输的内容了。关于USB CDC的配置其实十分简单,如果时间充裕的话我也水一篇。