本帖最后由 lxyppc 于 2017-10-12 17:42 编辑
之前在这里挖了一个坑,《【NUCLEO-F767ZI评测】JPEG Codec及DMA2D功能畅想》,现在终于把这个坑填上了。
- 硬件平台,之前网站搞活动送的STM32F767ZI Nucleo开发板,开发板官网连接
- 开发工具,ST CubeMX、rtthread、rtgui、xtoolbox
- 通过这个例程可以了解到:
- 如何在ST的HAL框架下添加一个新的USB设备类
- 如何将RT-Thread与CubeMX生成的代码整合起来
- 如何使用和扩展RT-GUI的功能
- 如何在Qt中调试RT-GUI程序
- 如何去填各种坑
PC机和开发板上的可执行程序在下面下载,源代码在这里下载
bin.zip
(5.74 MB)
STM32F767 Nucleo是ST官方出的开发板,板子上引出了大量的管脚便于评估。板子上还有一个带串口功能的ST Link调试器,用于对767芯片进行调试,一些基础功能的评估在这一块板子上就能搞定,不需要额外的开发工具了。 我在这块板子上用rt-gui实现了一个计算器,屏幕数据通过USB摄像头来显示,鼠标和键盘数据通过自定义USB HID设备传送给开发板。PC端显示程序运行后效果如下:
PC端是一个简单的Qt程序,一边读取摄像头数据进行显示,一边将鼠标和键盘事件通过HID设备发送给开发板。这个程序的源代码在这里。如果有多个摄像头,可以用PageDown和PageUp按键进行切换。 开发板上的程序在这里,采用rt-gui制作界面,用F767的jpeg硬核进行图片压缩,通过开发板的USB接口发送到PC端。 源代码在github上,可以从这里得到。源代码依赖rtthread 设计过程F767 Nucleo板提供的资源如下: 这块板子已经具备了全速USB接口和以太网接口。为了在这块板子上运行rt-gui并显示出来,我用USB摄像头的方式来显示屏幕数据。767芯片内置了JPEG压缩硬核,可以将屏幕数据先压缩后再通过USB以摄像头数据的形式发送到PC进行显示,降低带宽要求。 整个工程的设计思路如下 从左至右看,要做的主要功能是rt-gui和rt-thread,为了便于开发调试,我还需要SWD进行在线调试。 rt-gui的输入部分通过自定义USB HID设备来做,把电脑鼠标的点击事件和键盘事件通过HID接口发送到板子上。rt-gui的显示部分用USB摄像头UVC(USB Video Class)来做,将rt-gui的图像数据用摄像头的方式发送给PC。rt-gui绘制屏幕数据先进行JPEG压缩然后再发送,减轻全速USB接口的压力。 767有512K的RAM,我准备使用320×240的分辨率,颜色用RGB565格式,这样模拟屏幕需要320x240x2=150K字节的内存。 rt-thread在cortex-m7上有移植好的代码,拿过来用就行了。用一个LED指示工作状态,一个LED用来指示摄像头是否为打开状态。finsh通过板子上的ST Link串口进行交互。 从右往左看,这块板子提供了USB接口,JPEG硬件编解码,足够大的内存,有LED指示灯,板子上的STLink为我们提供了SWD调试功能和串口功能。基本满足了上面的功能需求。 两边都能对上,把需要的功能在CubeMX中进行初始化。CubeMX是ST针对他家的芯片做的一个图形化初始化应用程序,用来生成初始化代码很方便,这个也是官方以后主推的方式。 在CubeMX中配置好要用的外设后,就可以生成我们的工程基础文件了。在CubeMX的中间件(middleware)中,并没有我们想要的USB UVC+HID的复合设备,这里先选一个Audio设备来修改。因为Audio和Video读起来和写起来比较相近,估计改起来也不会太难。 其实这里选Audio设备是因为他和Video设备类似,都是用同步传输模式传输数据。实际在修改的过程中,如果是一个全新的设备类,用什么设备来做模板差别都不大,因为USB规范中不同的设备类操作差异很大。
|