ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
查看: 3652|回复: 22
收起左侧

[STM32F7] STM32例程+STM32F767 Nucleo之RT-GUI实验

[复制链接]
     

27

主题

2244

帖子

8162

积分

VIP会员

 楼主| 发表于 2017-10-10 11:46 | 显示全部楼层 |返回版面|阅读模式
本帖最后由 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机和开发板上的可执行程序在下面下载,源代码在这里下载


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规范中不同的设备类操作差异很大。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录

x
代码发BBS不好看?你需要它
代码着色http://bbs.21ic.com/icview-135254-1-1.html
     

27

主题

2244

帖子

8162

积分

VIP会员

 楼主| 发表于 2017-10-10 11:51 | 显示全部楼层 |返回版面
占楼
代码发BBS不好看?你需要它
代码着色http://bbs.21ic.com/icview-135254-1-1.html
     

27

主题

2244

帖子

8162

积分

VIP会员

 楼主| 发表于 2017-10-10 11:51 | 显示全部楼层 |返回版面
占楼
代码发BBS不好看?你需要它
代码着色http://bbs.21ic.com/icview-135254-1-1.html
     

16

主题

224

帖子

672

积分

禁止发言

发表于 2017-10-10 12:02 | 显示全部楼层 |返回版面
提示: 作者被禁止或删除 内容自动屏蔽
     

26

主题

890

帖子

2828

积分

版主

发表于 2017-10-10 12:12 | 显示全部楼层 |返回版面
到时候我也申请个回来玩玩

53

主题

1807

帖子

5727

积分

高级工程师

发表于 2017-10-10 14:23 | 显示全部楼层 |返回版面
楼主真会玩
     

27

主题

2244

帖子

8162

积分

VIP会员

 楼主| 发表于 2017-10-10 15:46 | 显示全部楼层 |返回版面
本帖最后由 lxyppc 于 2017-10-10 20:49 编辑
g169321 发表于 2017-10-10 12:02
写了这么多, 楼主都没把事情说清楚。
是我太肤浅,还是太浮澡


PC端用的是Qt开发环境,这个Qt程序很简单,就是读取摄像头的数据和发送鼠标键盘数据。摄像头数据读取用的是OpenCV库
鼠标键盘数据发送用的是QUsbHid库
打开摄像头的代码
  1. void open_camera(void)
  2. {
  3.     QString cam_name = QString("Camera - %1").arg(mCapId);
  4.     mCap = cvCreateCameraCapture(mCapId);
  5.     if(!mCap){
  6.         ...
  7.     }
  8.     setWindowTitle(cam_name);
  9. }
复制代码
在timer事件中读取摄像头数据并通过QLabel显示出来
  1. void timerEvent(QTimerEvent* evt)
  2. {
  3.     if(mCap){
  4.         IplImage* frame = cvQueryFrame(mCap);
  5.         if(frame){
  6.             QImage img((const uchar *)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
  7.             if(myLabel){
  8.                 myLabel->setPixmap(QPixmap::fromImage(img.rgbSwapped()));
  9.             }
  10.         }
  11.     }
  12. }
复制代码

打开自定义HID设备的代码
  1. QList<QUsbHidInfo> list = QUsbHid::enumDevices(0x0483, 0x5740);
  2. if(list.size()>0){
  3.     mHid.setPath(list.at(0).path);
  4.     mHid.open(QUsbHid::ReadWrite);
  5. }else{
  6.     info("Hid device not found!\r\nInput simulation not work!");
  7. }
复制代码
向HID设备发送数据的代码
  1. void mouse_action(int x, int y, int btn, int is_down)
  2. {
  3.     control_t t;
  4.     t.type = CT_MOUSE;
  5.     t.data.mouse.x = x;
  6.     t.data.mouse.y = y;
  7.     t.data.mouse.button = btn;
  8.     t.data.mouse.is_press = is_down;
  9.     if(mHid.isOpen())
  10.     mHid.writeData(0,QByteArray((char*)&t, sizeof(t)));
  11. }
复制代码
完整PC端程序代码在Github上



     

20

主题

214

帖子

2744

积分

初级工程师

发表于 2017-10-10 16:48 | 显示全部楼层 |返回版面
学习。
     

481

主题

2万

帖子

7万

积分

版主

发表于 2017-10-10 18:12 | 显示全部楼层 |返回版面

厉害
欢迎进入21IC论坛
电子工程师技术交流群:16519783,124545085;
     

29

主题

233

帖子

702

积分

高级技术员

发表于 2017-10-10 18:31 | 显示全部楼层 |返回版面
mark

74

主题

1850

帖子

7075

积分

高级工程师

发表于 2017-10-10 22:42 | 显示全部楼层 |返回版面
ucGUI一样吗?

74

主题

1850

帖子

7075

积分

高级工程师

发表于 2017-10-10 22:45 | 显示全部楼层 |返回版面
执行的效率怎么样?能够显示汉字吗?
     

27

主题

2244

帖子

8162

积分

VIP会员

 楼主| 发表于 2017-10-11 10:17 | 显示全部楼层 |返回版面
lzbf 发表于 2017-10-10 22:45
执行的效率怎么样?能够显示汉字吗?

可以显示汉字
在rtgui的代码目录中带有12x12和16x16的汉字字体
rtgui也可以添加新的字体文件
各种gui用起来都比较类似
针对自己屏幕提供基础的画图函数
再根据自己的硬件提供输入接口
gui系统就能工作起来了
     

16

主题

861

帖子

2606

积分

版主

发表于 2017-10-12 17:52 | 显示全部楼层 |返回版面
F7,羡慕...
     

1

主题

241

帖子

743

积分

高级技术员

发表于 2017-10-12 18:05 | 显示全部楼层 |返回版面
楼主双击陆陆陆
     

28

主题

619

帖子

1778

积分

版主

发表于 2017-10-13 09:19 | 显示全部楼层 |返回版面
厉害,gui做的不错,学习了哈。
     

2

主题

63

帖子

189

积分

中级技术员

发表于 2017-10-13 10:01 | 显示全部楼层 |返回版面
厉害!!!
     

18

主题

130

帖子

464

积分

资深技术员

发表于 2017-10-13 10:08 | 显示全部楼层 |返回版面
LZ,RT-Thread马上推出新的GUI了,到时候可以看看。

另外可以整理下这篇文章,投稿给RT-Thread公众号
     

2

主题

75

帖子

236

积分

中级技术员

发表于 2017-10-13 10:09 | 显示全部楼层 |返回版面
效果不错
     

27

主题

2244

帖子

8162

积分

VIP会员

 楼主| 发表于 2017-10-13 14:52 | 显示全部楼层 |返回版面
Cresta 发表于 2017-10-13 10:08
LZ,RT-Thread马上推出新的GUI了,到时候可以看看。

另外可以整理下这篇文章,投稿给RT-Thread公众号 ...

目前在rt-thread的主线上没有看到widget相关的内容,猜测是rtgui部分在进行调整,所以主线上没有
这个例程上的widget我是从realboard上合并到主线上的为了便于在Qt下调试UI效果,我增加了一个生成Qt工程文件的scons工具
要投稿的话我还是等新UI出来之后在整合,目前的widget还是非官方的版本
代码发BBS不好看?你需要它
代码着色http://bbs.21ic.com/icview-135254-1-1.html
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

分享 快速回复 返回顶部 返回列表