本帖最后由 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不可以修改,系统需要靠这几个数字识别文件种类,可以加下划线加说明。 每次只更新修改过的文件即可,不用全部文件都下载更新。具体操作后面章节介绍,此处只说明一下下载方式。迪文屏一共有三种下载方式: 1、SD卡下载,缺点是需要频繁插拔SD卡,优点是下载速度快。 需要把所有下载文件拷贝到DWIN_SET文件夹下,复制到SD卡根目录,然后断电插到屏幕SD卡槽,上电后自动下载。然后断电拔出SD卡重新上电即可。 2、串口下载程序,115200的速度下载,缺点速度太慢,优点是使用方便,更新小文件时很好用,如要下载字库等大的文件建议使用SD卡。 3、ED4板下载,实质上和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.html?mod=viewthread&tid=72&highlight=DGUS&_dsign=1745b80f 3.2 图片、图标素材准备注意一定要找和自己屏幕分辨率一致的素材,如背景图和图标。看网上教学视频时经常因为没有素材无法继续进行下去,需要提前在迪文论坛上下载一些demo,里面有很多现成的素材可以分类保存供自己使用。我准备了一些素材,在附件素材包中,背景图是480*800的,匹配4.3寸的竖屏。 图片格式是有要求的,可以用.bmp、.jpg,其他格式不支持,特别需要注意图片的编号,从0开始以数字开头。 3.3 SD卡下载注意事项如要用SD卡必须按如下要求进行格式化 3.4 如何下载出厂demo1、 串口下载:按照下图操作,需要注意的是需要选择正确的串口号和波特率,串口号可在设备管理器查看到。
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的一个串口与迪文屏的RX2、TX2、GND连接即可,下图中使用了一块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: }
|