发新帖本帖赏金 3.00元(功能说明)我要提问
1234下一页
返回列表
[STM32F4]

【f446RE开发板试用】教你用HAL库DCMI捕捉OV2640

[复制链接]
13315|79
手机看帖
扫描二维码
随时随地手机跟帖
colin2135|  楼主 | 2015-10-9 14:58 | 显示全部楼层 |阅读模式
本帖最后由 colin2135 于 2015-10-10 09:32 编辑

感谢21给的板子。
这次分享用446的DCMI来捕捉OV2640的JPEG图像。
用到了的外设:
1.硬件的I2C
2.MCO1,输出16M  XCLK给OV2640
3.DCMI   数字图像接口
4.UART  用来和上位机通信

实物连接与引脚图
8.jpg 9.jpg

硬件接完成后,首先应该通过I2C读取ID,看看OV2640能否工作。
uint8_t OV2640_ReadID(OV2640_IDTypeDef* OV2640ID)
{
        i2c_sent(OV2640_DSP_RA_DLMT, 0x01);
        
        OV2640ID->Manufacturer_ID1 =i2c_receive(OV2640_SENSOR_MIDH);

        OV2640ID->Manufacturer_ID2 =i2c_receive(OV2640_SENSOR_MIDL);

        OV2640ID->Version =i2c_receive(OV2640_SENSOR_PIDH);

        OV2640ID->PID =i2c_receive(OV2640_SENSOR_PIDL);
        
        return 0;
}
正常的话,可以在watch窗口看到如下:
3.jpg

上面一步正常后,就可以读取JPEG了。下面会贴上整个源代码,代码我加上了注释,下面讲讲使用HAL库要注意的地方。

在DCMI初始后面,HAL里面会默认打开FRAME中断,但捕捉到一帧后,会关闭这个中断,所以每次拍照都要打开FRAME中断。(是不是很多人发现只能拍一次?)
__HAL_DCMI_ENABLE_IT(&DCMI_hdcmi, DCMI_IT_FRAME);   
HAL_DCMI_Start_DMA(&DCMI_hdcmi, DCMI_MODE_SNAPSHOT,(uint32_t)JpegBuffer, pictureBufferLength);


NDTR存放了DMA 传输次数,他是递减的,使用pictureBufferLength-NDTR就是传输次数。
pictureLength=pictureBufferLength-DCMI_hdcmi.DMA_Handle->Instance->NDTR;
DCMI的FIFO是32位的,所以传输次数*4才是JPEG长度。(注意这里,配合手册一起看。)
pictureLength*=4;

还有在FRAME的回调函数里面,注意看以下:
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{        
        while(HAL_DMA_Abort(hdcmi->DMA_Handle)!=HAL_OK);
        getPicture=1;
}

这里使用了HAL_DMA_Abort(hdcmi->DMA_Handle),因为JPEG每次的传输长度都不是固定的,我们可以通过FRAME中断来判断已经完成了一帧图像,
所以在这个中断里面,就可以中断DMA的传输了。


比较重要的事情就是上面那些了,如果成功捕捉到JPEG,在WATCH可以用到0XFF,0XD8。我们在PC的串口工具上可以直接看到JPEG数据。注意图片上红色注释。


4.png 5.jpg 6.jpg

最后,放出图像样张:上位机工具自己写的,写的很烂,稳定性也不好,所以不放出了
7.jpg 2.jpg 1.jpg


打赏榜单

21ic小喇叭 打赏了 3.00 元 2015-10-26

评论
pinglinmomo 2019-3-16 17:59 回复TA
感谢分享 
colin2135|  楼主 | 2015-10-9 15:02 | 显示全部楼层
http://pan.baidu.com/s/1gd6lh9x 源代码在网盘里,欢迎下载。

使用特权

评论回复
paderboy| | 2015-10-9 15:52 | 显示全部楼层
多谢分享。。。。。必须支持

使用特权

评论回复
colin2135|  楼主 | 2015-10-9 15:56 | 显示全部楼层
paderboy 发表于 2015-10-9 15:52
多谢分享。。。。。必须支持

谢谢,不客气哟。

使用特权

评论回复
Thor9| | 2015-10-9 19:39 | 显示全部楼层
f446RE开发板可以用仿真器仿真吗

使用特权

评论回复
colin2135|  楼主 | 2015-10-9 21:44 | 显示全部楼层
Thor9 发表于 2015-10-9 19:39
f446RE开发板可以用仿真器仿真吗

F446NUCLEO板上就有STLINK,所以不需要仿真器就能调试仿真了。

使用特权

评论回复
湛只为无双| | 2015-10-9 22:25 | 显示全部楼层
楼主这个不错,很棒,给赞一个,很有技术含量的一个。

使用特权

评论回复
colin2135|  楼主 | 2015-10-10 09:33 | 显示全部楼层
湛只为无双 发表于 2015-10-9 22:25
楼主这个不错,很棒,给赞一个,很有技术含量的一个。

谢谢夸奖,有什么问题可以直接问我。

使用特权

评论回复
逍遥李| | 2015-10-10 14:32 | 显示全部楼层
colin2135 发表于 2015-10-9 15:02
http://pan.baidu.com/s/1gd6lh9x 源代码在网盘里,欢迎下载。

ov7670可以使用F446直接读取吗?

使用特权

评论回复
colin2135|  楼主 | 2015-10-10 15:04 | 显示全部楼层
逍遥李 发表于 2015-10-10 14:32
ov7670可以使用F446直接读取吗?

可以的

使用特权

评论回复
lvehe2| | 2015-10-16 13:24 | 显示全部楼层
可以调焦吗?感觉不是很清晰。

使用特权

评论回复
colin2135|  楼主 | 2015-10-19 09:27 | 显示全部楼层
lvehe2 发表于 2015-10-16 13:24
可以调焦吗?感觉不是很清晰。

需要手动调。OV5640可以自动对焦。

使用特权

评论回复
zhanghuichun| | 2015-11-13 21:09 | 显示全部楼层
楼主,你好,我看了你的程序,跟你帖子对不上的,链接的程序是用标准库开发的,说好的HAL库呢?

使用特权

评论回复
zhanghuichun| | 2015-11-14 09:06 | 显示全部楼层
看错了,我看到我另外一个程序了、谢谢楼主分享

使用特权

评论回复
colin2135|  楼主 | 2015-11-16 09:30 | 显示全部楼层
zhanghuichun 发表于 2015-11-14 09:06
看错了,我看到我另外一个程序了、谢谢楼主分享

你也厉害啊,把自己的还能看成我的。

使用特权

评论回复
逍遥李| | 2016-1-1 00:30 | 显示全部楼层
楼主,硬件I2C是干嘛用的?线是怎么接的呀?能不能指点一下?元旦快乐!!!

使用特权

评论回复
colin2135|  楼主 | 2016-1-3 09:52 | 显示全部楼层
逍遥李 发表于 2016-1-1 00:30
楼主,硬件I2C是干嘛用的?线是怎么接的呀?能不能指点一下?元旦快乐!!! ...

硬件i2c是作为sccb使用,对摄像头进行初始化操作。

使用特权

评论回复
洪吉童555| | 2016-1-23 09:56 | 显示全部楼层
楼主,我有个程序进不了DCMI_IT_FRAME中断函数,怎么回事啊?

使用特权

评论回复
colin2135|  楼主 | 2016-1-24 12:35 | 显示全部楼层
洪吉童555 发表于 2016-1-23 09:56
楼主,我有个程序进不了DCMI_IT_FRAME中断函数,怎么回事啊?

情况你要说清楚一些啊。光这样子,我没法判断。

使用特权

评论回复
lkdxxq| | 2016-3-8 10:05 | 显示全部楼层
楼主能加个qq指导下吗?1796480563,楼主好人谢谢。

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

533

帖子

8

粉丝