重庆企业网站定制开发公司,建站素材图片,网站建设团队管理怎么写,本科毕业设计代做网站最近有个带UI的项目#xff0c;采用STM32F429做主控方案#xff0c;对比touchgfx、lvgl和emwin#xff0c;发现TouchGFX性能最好#xff0c;并且界面设计工具也很好用#xff0c;于是选择此图形引擎。
最开始是熟悉UI设计工具#xff0c;需要一个表格控件#xff0c;无…最近有个带UI的项目采用STM32F429做主控方案对比touchgfx、lvgl和emwin发现TouchGFX性能最好并且界面设计工具也很好用于是选择此图形引擎。
最开始是熟悉UI设计工具需要一个表格控件无奈没有大概研究了一下设计特性找到了解决方法还真好用并且还支持用其他控件作为CELL内容而lvgl和emwin都没这功能。设计了两个界面后开始研究输入法看到了这个大佬的视频
https://www.bilibili.com/video/BV1Ba411o7tk/?spm_id_from333.337.search-card.all.clickvd_source30b48b29951e4676ebb3f21245a65bcf
太帅了还直接公布源码于是下载下来。这里又得夸奖一下TouchGFX支持Container导入超出于是直接使用此方法将键盘相关的内容搬到了我当前项目上顺利生成代码。
编译时重大问题出现了st芯片的空间不够了。于是又开始研究字库外置。
1.配置designer激活bin文件方法最后生成的字库文件大于8M了外部flash只有8M于是修改bpp参数调到2近5M的样子又生成了另一个小点的字体近3M的样子刚好合适。这里只是找到了字库的参数设置使其能放入外部flash中但最开始并没有说要用这个文件。
2.在官方文档里找到两篇文章
使用非内存映射闪存存储字体数据 | TouchGFX Documentation使用串行闪存存储图像和字体 | TouchGFX Documentation
着手研究这个本来TouchGFX可以支持映射方式读取数据什么是映射方式呢我的理解就是直接寻址但至少也得是QSPI接口我这个硬件只是普通SPI接口另外芯片也不支持QSPI映射模式听说至少得F7所以这个方式不行只能采用非内存映射方式那么这又是个什么模式呢说白了就是不支持直接寻址举个例子直接寻址就是东西放那儿你想要什么直接去拿非直接寻址就是东西在另一个地方这个地方可能比较高你直接拿不到需要用楼梯或者其他人帮你拿你就稍微等一下。这儿也是这样GFX有读取数据的接口需要你去实现他。
但是也不是那么容易首先生成的代码是包含字库数据的肯定直接构建项目是链接不通过的需要修改链接脚本将字库部分的数据链接到另外的地址通过写外部flash烧写算法将数据写入到flash中这个功能又研究了两天最后实现了至于怎么做网上有不少资料。构建成功后查看map文件确实将字库数据链接到了指定的地方然后整个项目也能烧写成功但是运行时直接进hardfault了。
接下来还是继续研究那两篇文章官方有个针对G071芯片的模板生成代码后进行对比我这边少了几个文件而我本身那个项目完全不知道怎么才会生成那些文件这点应该是没做好。简单复制那几个文件后添加了几个实现代码段编译下载能正常运行起来了但是文字的地方是空白也就是说没有读出数据。接下来重点对比两个项目文件内容把不一样的地方分析一下进行合并最后又测试很不幸又开始进hardfault了。
到这里很想放弃了因为GFX内部代码无法看到已经不知道从哪儿着手了。直到我在armbbs论坛里进行了求助得到了管理员的点播可以采用另一个方式解决在此向他表示诚挚的谢意
3.这个方式结合上面两个方式。因为板子有设计16M的SDRAM前8M都剩很多后面8M完全可以用来放字库数据。于是着手测试此方法项目最开始移植过fatfs直接跑一遍将flash格式化再下载usb-spi文件系统的程序插电脑上将两个字库文件复制进去。
完事后又遇到一个问题这里被Notepad坑惨了流程是这样的我在电脑上用它打开其中一个字库文件使用hexeditor查看然后板子这边用fatfs读取数据出来进行对比结果开始那几个字节都不一样于是又下载usb那个程序复制出里面的字库文件依然用打开发现是一样的。这就麻烦了肯定问题出在fatfs这边了吧各种查原因也没发现哪儿错了我都准备不用文件系统了想直接通过串口写数据到flash中开始用C#编写上位机写了一条代码那就是读取对应文件的所有Byte我调试时发现数据竟然和我板子里的一样这时才想起换一个工具查看文件内容果不其然notepad里面的hexeditor有问题真tm操蛋。好了又回到起点将下面代码针对我板子的情况修改一下
#define FONT_CACHE_SIZE 0xA00000 //字符缓冲区大小,这里设为10MB uint8_t *fontCacheAddr (uint8_t *)(SDRAM_START_ADDRframe_size*3BITMAP_CACHE_SIZE);//分配内存空间 int fd; struct stat fileState; fd open(/sdcard/touchgfx/font.bin, O_RDONLY); if(fd 0) { stat(/sdcard/touchgfx/font.bin,fileState); read(fd, fontCacheAddr, fileState.st_size); close(fd); //placement new 就地new-不需要重新分配新的空间 new (binaryFont)BinaryFont((const touchgfx::BinaryFontData *)fontCacheAddr); TypedTextDatabase::setFont(Typography::TEST, binaryFont); } else { rt_kprintf(open failed!\r\n); }
最后编译下载启动时屏幕还是花屏怀着忐忑的心情等了几秒最后正常弹出那一刻心里是无比激动。
总结采用此方式前提有可直接寻址的存储并且容量要足够大。然后开机需要等几秒需要做一个启动界面。至于速度可以采用dma方式进行优化或者用更快的接口比如sdio。