打印
[STM32F7]

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

[复制链接]
8126|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxyppc|  楼主 | 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机和开发板上的可执行程序在下面下载,源代码在这里下载
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规范中不同的设备类操作差异很大。


沙发
lxyppc|  楼主 | 2017-10-10 11:51 | 只看该作者
占楼

使用特权

评论回复
板凳
lxyppc|  楼主 | 2017-10-10 11:51 | 只看该作者
占楼

使用特权

评论回复
地板
g169321| | 2017-10-10 12:02 | 只看该作者
本帖最后由 g169321 于 2017-10-10 12:21 编辑

写了这么多, 楼主都没把事情说清楚。
是我太肤浅,还是太浮澡

楼主用   ST 官方  F7开发板   演示一个  USB HID 通信的   USB 摄像头 和 HID 控制设备 。

PC端 没有源代码 和开发环境的介绍。 是用 VC++的吧。

使用特权

评论回复
5
caijie001| | 2017-10-10 12:12 | 只看该作者
到时候我也申请个回来玩玩

使用特权

评论回复
6
aozima| | 2017-10-10 14:23 | 只看该作者
楼主真会玩

使用特权

评论回复
7
lxyppc|  楼主 | 2017-10-10 15:46 | 只看该作者
本帖最后由 lxyppc 于 2017-10-10 20:49 编辑
g169321 发表于 2017-10-10 12:02
写了这么多, 楼主都没把事情说清楚。
是我太肤浅,还是太浮澡


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

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



使用特权

评论回复
8
dsyq| | 2017-10-10 16:48 | 只看该作者
学习。

使用特权

评论回复
9
mmuuss586| | 2017-10-10 18:12 | 只看该作者

厉害

使用特权

评论回复
10
lanjackg2003| | 2017-10-10 18:31 | 只看该作者
mark

使用特权

评论回复
11
lzbf| | 2017-10-10 22:42 | 只看该作者
ucGUI一样吗?

使用特权

评论回复
12
lzbf| | 2017-10-10 22:45 | 只看该作者
执行的效率怎么样?能够显示汉字吗?

使用特权

评论回复
13
lxyppc|  楼主 | 2017-10-11 10:17 | 只看该作者
lzbf 发表于 2017-10-10 22:45
执行的效率怎么样?能够显示汉字吗?

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

使用特权

评论回复
14
gujiamao12345| | 2017-10-12 17:52 | 只看该作者
F7,羡慕...

使用特权

评论回复
15
Prry| | 2017-10-12 18:05 | 只看该作者
楼主双击陆陆陆

使用特权

评论回复
16
一路向北lm| | 2017-10-13 09:19 | 只看该作者
厉害,gui做的不错,学习了哈。

使用特权

评论回复
17
cailantu| | 2017-10-13 10:01 | 只看该作者
厉害!!!

使用特权

评论回复
18
Cresta| | 2017-10-13 10:08 | 只看该作者
LZ,RT-Thread马上推出新的GUI了,到时候可以看看。

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

使用特权

评论回复
19
liuchangyin| | 2017-10-13 10:09 | 只看该作者
效果不错

使用特权

评论回复
20
lxyppc|  楼主 | 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不好看?你需要它 代码着色https://bbs.21ic.com/icview-135254-1-1.html

27

主题

2249

帖子

19

粉丝