美文网首页我爱编程
STM32F207 下用DCMI和USB HS做UVC摄像头总结

STM32F207 下用DCMI和USB HS做UVC摄像头总结

作者: 郭盖华 | 来源:发表于2016-03-07 13:15 被阅读4493次

    前言

    最近由于公司项目需要,需要做低分辨率(320 * 240 @30fps)DVP接口的特殊摄像头,但是主机没有DVP接口,最后决定用USB口来转接。由于摄像头比较特殊,原始数据,需要做简单的格式转换和数据处理后,才能使用,不能用一些现成的DVP转USB的IC,因此方案最终选定为采用STM32F2的DCMI接口(接DVP),然后通过其HS的USB接口转到USB上面。为了让接口尽量通用,软件上,要求STM32F2虚拟出一个UVC协议的摄像头,并可以通过UVC协议,配置其工作模式。这样可以免去了在电脑上开发USB驱动的麻烦。

    资料准备

    由于之前从没有接触过STM32F2的USB,也没有借出过DCMI接口,更没有看过UVC协议,因此,只能找些现成的资料看看。现在列举如下:

    1. 网上现成的别人做的STM32F4上的UVC协议。https://github.com/iliasam/STM32F4_UVC_Camera.git
    2. STM32F2 的Reference manual,这个可以在ST的官网查到。
    3. STM32F2 的STM32CubeMX相关软件。PS:该软件非常好用,可以大大简化STM32上的关于底层驱动的工作,并且提供非常全面的API,会中断回调函数,基本上不用看寄存器,也不用管中断,时钟什么的了,非常推荐使用!!
    4. OV7670 的DataSheet
    5. UVC协议相关的文档。这个可以在USB官方网站上下载到,非常必要,且有用。

    这么多资料,不可能开始就全部肯了,看起来需要有技巧。基本套路是:

    • 先看看别人的例程是否可以跑起来
    • 再对照协议文档(UVC相关)来理解和尝试修改别人的代码。
    • 最后根据自己的项目需求来编写相关数据处理程序。

    工作成果

    实现了读出OV7670摄像头(用于测试软件)的数据,并缓存在队列中,在USB的DataIn里面发送出去,并在电脑上,用摄像头软件可以看到摄像头的内容。

    测试结果

    • 用软件模拟产生数据,最大帧率可以做到80fps(数据格式为320*240 YUY2,未压缩),已经是非常快了,速度约为(98Mbps, USB HS理论值为 480Mbps),完全可以满足我们项目的要求。STM32F2 USB HS的速度果然不是盖的,非常快。
    • 用Ov7670产生数据(由于硬件原因,只能获得最大37fps的帧率,数据格式为320*240 YUY2,未压缩),电脑上的程序可以正确读出,录像结果为37fps,和ov7670的帧率一致。

    需要的注意事项

    • 由于摄像头数据算是比较大了,而且是持续性的,为了确保数据不丢失,STM32F2的DCMI接口采用了双缓冲的DMA模式,并用软件做了一个队列,不停地将双缓冲结束后的数据压入队列。这样便于中间的数据处理。
    • STM32F2 的 DCMI,在设置DMA的时候,要注意:DMA的外设地址,必须为32位,尽管DVP的接口数据位宽为8位。DMA的数据长度设置时,其实际长度要和位宽匹配。
    • 注意UVC的协议头,即UVC Header里面的FID和EOF两个位。FID要每次发送新的帧的时候,进行翻转。EOF要当前帧的最后一次传送时置位。
    • 由于是非压缩数据格式,且为固定帧率,因此其UVC的头可以直接采用2个字节。不要后面的帧时间戳相关的内容。(一般的UVC头为12个字节)。
    • 在USB DATA IN里面,如果DCMI的数据没有准备好(USB的数据带宽要大于DCMI的带宽),那么可以发送空包出去。也可以只发UVC头出去。我测试了一下,WIN10下面的默认相机软件是都可以正常工作的。

    相关文章

      网友评论

        本文标题:STM32F207 下用DCMI和USB HS做UVC摄像头总结

        本文链接:https://www.haomeiwen.com/subject/oogakttx.html