打印
[资料干货]

发一个自己写的迪文屏与STM32交互的操作说明文档

[复制链接]
2712|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jiulong855 于 2022-4-22 18:18 编辑

      前段时间参加迪文屏的活动,申请到一块迪文的cof屏,看了介绍之后觉得产品价格和性能都太牛了,但找资料试用的过程和大家吐槽的差不多,屏是好屏,就是文档真的是乱,特别是对新手不友好,官方的视频质量也不高,差点就准备放弃了,费了很大工夫,才算是弄明白了一些基本操作,赶紧整理了一份文档,贡献给大家,让大家少走点弯路,我也是刚开始试用,写的不对的大家可以指正。我把文档、工程全部都上传了,希望可以帮到更多人。
迪文屏按钮控制STM32开发板led操作说明


1       简介
本节将简要说明手册的目的、范围。
1.1      手册目的
本手册的目的在于说明迪文屏与STM32通讯,通过串口控制led的方法。迪文屏的资料稍微有一些乱,我摸索了好几天都不知道怎么下手,费了不少精力才大概了解了基本操作,所以整理了这个文档,希望大家少走一些弯路。
1.2      手册范围
本手册首先简要地介绍了迪文屏及初学者可能遇到的几个问题,然后从初学者第一次拿到迪文屏开始step bystep的进行说明,介绍一下迪文屏的基本操作,完成DGUS工程建立、与STM32通讯建立、STM32控制迪文屏按钮、迪文屏按钮控制外接的LED等。
本手册的使用者包括:
程序编写、维护者
       …

2       迪文屏简介及需要提前明白的几个问题
首先说明我手头的迪文屏型号是DMG80480F043_01WTC,可能和您手头的型号不同,操作时需要注意分辨率等需要修改。

2.1      迪文屏简介及双核各起什么作用、怎样交互?
我们常用的LCD、OLED等屏幕都需要用户使用STM32等外置的CPU来进行驱动,第一个问题是当需要实现酷炫的频繁切换、刷新、渲染时就很容易出现卡滞,第二个问题是没法实现逻辑代码与图像界面的分离,对操作者要求高且容易互相影响。迪文的COF智能屏是基于迪文低功耗双核T5L0ASIC芯片,将整个智能屏核心电路放到液晶模组FPC上,集成整合触摸屏,并把用户CPU核的IO、UART、CAN、AD、PWM等接口引出到FPC接口上的产品。产品的GUI通过DGUS平台基于图片素材进行开发,用户系统通过OS核基于标准8051开发。
图2.2 T5L芯片的管脚排列图
T5L芯片是一个双核的处理器,一个为OS核,即上图中的CPU_OS,运行用户C51代码或迪文OS系统,用来放用户的业务逻辑代码的,此核其实就是一个成熟稳定的51单片机,主频可以高达250MHZ,而且外设资源比传统的51单片机要丰富很多,也就是说我们甚至可以不用外置控制芯片,直接可以使用屏自带的OS核进行简单的产品功能开发,也可以用keil开发。另外一个核是GUI核,里面跑了一个DGUS II系统,用于专门负责GUI图形界面构建和渲染,内置2D硬件加速,可以使我们的图形界面刷新和切换极其的流畅,两个核之间分工合作,使我们的业务逻辑代码和GUI图形界面之间进行分离,实现了“高内聚低耦合”的编程思想,这点我觉得迪文的产品思路很牛,当我们在代码中需要更新图形界面时,我们的OS核是可以和GUI核之间进行通信的,这是通过“DGUS变量存储器”来进行实现的,类似于DMA操作,直接读写特定的变量寄存器中的值即可实现。如果需要外挂MCU的话,也是可以通过串口通信与OS核来交互,进而与GUI交互。
2.2      迪文屏的GUI核中代码用不用自己编写?怎么实现GUI界面的?
实际应用时,用户界面配置可以采用DGUS软件来完成,不用编写GUI核中的代码,根据各自不同的应用配置生成的13/14/22.bin等文件下载到GUI核中来实现的; DGUS的开发思路跟其他小系统确实不同,第一次接触可能会觉得不适应。DGUS开发模式下,界面的开发是在图片基础上完成的,需要用户先规划界面内容、交互逻辑(类似原型设计),做好界面图片后,再在DGUS中对画面各个功能区域进行定义,不需要写代码就能实现很多功能。类似乐高或是scratch,通过拖拽,配置参数即可实现翻页、动画、按钮、仪表图标旋转等功能。
2.3      什么是0号字库、13、14、22文件,是不是每次都必须下载所有文件?
开始看资料时这几个文件看的云里雾里,其实就是为了方便下载和识别下载文件种类,迪文定义了几个特定的文件开头数字,0号字库是生成的ASCII码、数字等的字库文件,第一次使用屏幕时必须要下载,之后可以不更新,不用每次都下载更新0号字库;
13.bin 触控变量配置
14.bin 显示变量配置
22.bin 变量初始化文件
这三个文件是使用DGUS设计界面后点击生成后自动生成的下载文件,开头的数字13、14、22不可以修改,系统需要靠这几个数字识别文件种类,可以加下划线加说明。
            每次只更新修改过的文件即可,不用全部文件都下载更新。具体操作后面章节介绍,此处只说明一下下载方式。迪文屏一共有三种下载方式:
1SD卡下载,缺点是需要频繁插拔SD卡,优点是下载速度快。
需要把所有下载文件拷贝到DWIN_SET文件夹下,复制到SD卡根目录,然后断电插到屏幕SD卡槽,上电后自动下载。然后断电拔出SD卡重新上电即可。
2、串口下载程序,115200的速度下载,缺点速度太慢,优点是使用方便,更新小文件时很好用,如要下载字库等大的文件建议使用SD卡。
3ED4板下载,实质上和SD卡一样,只是不用频繁插卡拔卡,通过USB口与SD卡接口通讯,需要购买下载工具。
https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-14432573345.10.5fa077e8ineITZ&id=664750310142
3       DGUS开发的准备工作及下载步骤3.1      接线、驱动安装
1、 接线:接好屏幕与扩展板之间的排线以及USB线

2、 驱动安装:迪文串口转接板 USB-to-UART 芯片有 XR21V1410 芯片和 CP2102 芯片两种,我拿到的屏幕用的是XR21V1410,接到电脑上之后,如果在设备管理器看不到下图端口号,则需要去官网下载对应驱动,下载地址如下所示,安装成功后在设备管理器可查看到com号,后面需要用到。到此时就可以看到开发板中下载的出厂demo了,如果屏幕什么都不显示,需要重新下载出厂demo或是联系厂家更换屏幕,下载方法在后面章节详细介绍。
http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=1626&highlight=%E8%93%9D%E5%B1%8F&_dsign=8e2bf9f9

3、 DGUS安装
下载路径如下,下载后不用安装,直接打开即可
http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=72&highlight=DGUS&_dsign=1745b80f
3.2      图片、图标素材准备
注意一定要找和自己屏幕分辨率一致的素材,如背景图和图标。看网上教学视频时经常因为没有素材无法继续进行下去,需要提前在迪文论坛上下载一些demo,里面有很多现成的素材可以分类保存供自己使用。我准备了一些素材,在附件素材包中,背景图是480*800的,匹配4.3寸的竖屏。
图片格式是有要求的,可以用.bmp、.jpg,其他格式不支持,特别需要注意图片的编号,从0开始以数字开头。
3.3      SD卡下载注意事项
如要用SD卡必须按如下要求进行格式化
3.4      如何下载出厂demo
1、 串口下载:按照下图操作,需要注意的是需要选择正确的串口号和波特率,串口号可在设备管理器查看到。

2、 SD卡下载:注意将整个DWIN_SET文件夹拷贝到SD卡根目录,然后插上SD卡即可自动识别开始下载,屏幕上显示end即下载成功,可以断电拔出SD卡再重新上电,程序更新完成。

4       DGUS图标按钮的设计
本章节以开关灯图标为例来说明DGUSⅡ设计图标按钮的过程,配合下一章STM32程序完成迪文屏控制led的例程
4.1      如何新建工程
1、新建,注意要是没有所需的屏幕尺寸,可以进配置文件修改,在配置文件中不可添加新的,可将你用不到的尺寸修改成你需要的。
图4.1
图4.2
4.2      生成0号字库
在“欢迎使用”界面下找到0号字库生成工具,设置好字体及大小等,注意文件名必须以0开头。0号字库生成后放在需要下载的DWIN_SET文件夹中。
图4.3
4.3      生成背景图库和图标库
图4.4
在“欢迎使用”界面选取“DWINICL生成工具”,先选取背景图所在的文件夹,注意图片文件分辨率和屏需要匹配,比如480*800,如果空间足够,JPG图片质量可以调大最大,点击“生成ICL”,注意文件命名不能和13、14、22冲突,特别需要注意的是.icl文件的大小,一个字库地址是256kb,假如生成的23背景图片.icl文件是1.87MB,则占用1.87*4 = 7.48个地址,假如背景图片.icl命名是23,则下一个必须从31开始命名。图标库也用相同方法生成。背景图库和图标库生成后也放在需要下载的DWIN_SET文件夹中。
4.4      加载图片
将准备好的背景图片加载进来,然后就可以在上面添加按钮、控件等。

图4.5
4.5      添加两个按钮开关4.5.1      添加变量图标
先添加两个变量图标显示,为区分两个按钮,使用了不同的图标,如图4.6,再设置图标和参数,如图4.7所示
4.6

4.7 按钮1的参数

4.8按钮2的参数
4.5.2      触控控件及参数配置

4.9
4.10
4.11
4.5.3      效果预览
点击显示可以看到按钮效果,点击图标会发生变化,但是dwin的预览图标背景没有过滤,做一些复杂功能时候预览也会出错或无法预览,最好是下载后看实际效果。

4.12
4.5.4      生成下载文件并下载

4.13

4.14
4.15
5       STM32与迪文屏指令通讯程序5.1     指令协议
STM32与迪文屏之间使用串口进行指令通讯,只要没重新下载过自己编写的OS核的程序,则默认的出厂程序时是使用串口2,波特率115200,串口模式为8n1,串口的所有指令或数据都是 16 进制(HEX) 格式。 对于字型(2 字节)数据, 总是采用高字节先传送(MSB)方式, 如 0x1234 先传送 0x12。 一个 DGUS 周期能够传送的最大数据长度取决于用户界面的复杂程度;推荐客户在一个DGUS周期内不要发送超过4KB(约等于 230400-691200bps 波特率连续发送)的数据给DGUS 屏。详细指令参考T5L_DGUS II 应用开发指南第四章UART2 串口通讯协议,本例程主要用读、写两条指令。
指令格式如图5.1所示,默认无CRC校验。
5.1指令格式
5.2读写变量存储器指令协议
5.3向变量存储器写数据
5.4从变量存储器读数据
5.2     与STM32开发板连接
只用将STM32的一个串口与迪文屏的RX2TX2GND连接即可,下图中使用了一块407开发板,用的是407的串口4

5.3     STM32程序编写
总共只需要写三个部分的程序
1、 led驱动
2、 usart驱动
3、 指令发送与解析
led和usart 程序大家写过,不多赘述,主要说一下与迪文屏的交互过程。先说实现思路:
1)     stm32控制迪文屏图标按钮变化,利用stm32串口发送迪文屏变量存储器写指令,即向地址0x1000和0x1002分别写入1,则图标变化一次,再写入0,图标会再变化一次。
2) 迪文屏图标按钮控制stm32开发板的led亮灭,点击触控迪文屏上显示的按钮,变量存储器0x1000和0x1002地址的值会在0和1之间切换,stm32每间隔100ms读取一次0x1000和0x1002地址内的值就可获得当前按钮的状态,当检测到0x1000值为1时点亮led1,当检测到0x1002值为1时点亮led2,当检测到值为0时关闭led。
3) main函数代码
int main(void)
{
                 //指令解析task
          init_cmd_analysis();
//将0x1000和0x1002地址的值分别写1和0,重复两次,可以看到stm32控制迪文屏     //按钮的效果,然后每隔100毫秒读取一次0x1000和0x1002地址中的值,在指令解析//中根据值得变化点亮或关闭led。
          set_button_status(0x1000,0x0001);
          OSTimeDlyHMSM(0, 0, 1, 0);
          set_button_status(0x1000,0x0000);
          OSTimeDlyHMSM(0, 0, 1, 0);               
          set_button_status(0x1002,0x0001);
          OSTimeDlyHMSM(0, 0, 1, 0);
          set_button_status(0x1002,0x0000);
          OSTimeDlyHMSM(0, 0, 1, 0);               
          set_button_status(0x1000,0x0001);
          OSTimeDlyHMSM(0, 0, 1, 0);
          set_button_status(0x1000,0x0000);
          OSTimeDlyHMSM(0, 0, 1, 0);               
          set_button_status(0x1002,0x0001);
          OSTimeDlyHMSM(0, 0, 1, 0);
          set_button_status(0x1002,0x0000);
          OSTimeDlyHMSM(0, 0, 1, 0);   
          for(;;)
          {
                      get_button_status(0x1000,0x01);
                      OSTimeDlyHMSM(0, 0, 0, 100);           
                      get_button_status(0x1002,0x01);
                      OSTimeDlyHMSM(0, 0, 0, 100);                                   
          }
}
4)指令解析

int get_button_status(u16variable_address,u8 get_status_len)
{
            u8send_date[20] = {0};
            send_date[0]= 0x5A;
            send_date[1]= 0xA5;
            send_date[2]= 1+2+1;
            send_date[3]= 0x83;
            send_date[4]= (u8)(variable_address/256);         
            send_date[5]= (u8)(variable_address%256);      
            send_date[6]= get_status_len;
            send_data_packet(COM4,send_date, 7);
}

int set_button_status(u16variable_address,u16 set_button_status)
{
            u8send_date[20] = {0};
            send_date[0]= 0x5A;
            send_date[1]= 0xA5;
            send_date[2]= 1+2+2;
            send_date[3]= 0x82;
            send_date[4]= (u8)(variable_address/256);         
            send_date[5]= (u8)(variable_address%256);      
            send_date[6]= (u8)(set_button_status/256);
            send_date[7]= (u8)(set_button_status%256);
            send_data_packet(COM4,send_date, 8);
}
注:cmd_analysis_block是通过串口得到的迪文屏反馈数据,cmd_analysis_block[3]是0x82或0x83,分别是写和读指令的反馈。
       switch(cmd_analysis_block[3])
        {
            //setparam
            case 0x82:
                                                if((0X4f== cmd_analysis_block[4])&(0X4B == cmd_analysis_block[5]))
                                                {
                                                            printf("setparam success\r\n");
                                                }
                                                else
                                                {
                                                            //todosomething
                                                }
                                                break;
                                    //readparam
                                     case 0x83:
                                                if(0x1000== ((u16)cmd_analysis_block[4]<<8) + (u16)cmd_analysis_block[5])
                                                {
                                                            //enterbutton 1
                                                            if(0x0001== ((u16)cmd_analysis_block[7]<<8) + (u16)cmd_analysis_block[8])
                                                            {
                                                                        led_trun_on(LED3);
                                                            }
                                                            else
                                                            {
                                                                        led_trun_off(LED3);
                                                            }
                                                }
                                                elseif(0x1002 == ((u16)cmd_analysis_block[4]<<8) +(u16)cmd_analysis_block[5])
                                                {
                                                            //enterbutton 2
                                                            if(0x0001== ((u16)cmd_analysis_block[7]<<8) + (u16)cmd_analysis_block[8])
                                                            {
                                                                        led_trun_on(LED4);
                                                            }
                                                            else
                                                            {
                                                                        led_trun_off(LED4);
                                                            }
                                                }
                                                else
                                                {
                                                            //todosomething
                                                }         
                                                break;
                                                default:
                        }



9999626280bfeabb1.png (216.5 KB )

9999626280bfeabb1.png

迪文屏按钮控制STM32开发板led操作说明.rar

8.35 MB

迪文屏

使用特权

评论回复

相关帖子

沙发
天意无罪| | 2022-4-23 17:28 | 只看该作者
感谢分享,现在迪文屏应用还多吗?多年前用过迪文的屏做过产品。

使用特权

评论回复
板凳
jiulong855|  楼主 | 2022-4-23 21:07 | 只看该作者
非常多,很多进口设备上都用

使用特权

评论回复
地板
YDCMAN| | 2022-4-24 12:00 | 只看该作者
迪文和淘晶驰的屏价格低些,感觉大彩屏好贵啊

使用特权

评论回复
5
jiulong855|  楼主 | 2022-4-28 10:30 | 只看该作者
大彩的资料丰富,上手快,性价比的话迪文还是好一点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

242

主题

309

帖子

3

粉丝