因为项目需要驱动800*480的TFT液晶屏,同时客户对成本比较敏感,经过对比选型,最终确定使用了华芯微特的SWM32SRET6-LQFP64,这款芯片先说说优势:
硬件方面:
优点:
主频120MHZ, 集成TFT控制器,集成8MBtyes的SDRAM,可以静态驱动最大1024*768分辨率的屏,我项目驱动的是800*480的TFT,具有CAN,SPI,SDIO,UART,I2C等长用接口,并且价格很具有优势。外设设计的都很简洁实用,不像ST的外设,为了迎合很多应用场景,外设的功能设计的灵活多变,好是好,但是这样一来,寄存器太多,需要设置的太多,太繁琐,有一些有关联的功能,需要花比较多的时间研读手册,才能找出问题。 华芯微特整个开发下来,给人的感觉就是功能不花哨,能满足大部分的常规应用,写代码的时候,不需要太关注那些寄存器,直接调库,对照例程来,一切OK,经过实际调试,没有发现什么BUG之类的问题。
缺点:
1. 管脚封装最大LQFP64脚,对于外围功能较多的应用需要外部扩展IO口,我的项目中就是由于IO不够,后来扩展了IO芯片,也不知道官方是怎么想的,扩展个100脚的,它不香吗,这样应用的面就更广了,这点真的很窝火。不过,这款芯片的IO的映射功能那是真爽,可以说每个外设都可以映射到每个管脚,不过要注意的是,管脚功能分奇偶分配原则,比如说串口的RXD可以分配到所有奇数编号的引脚PXn上(n=1,3,5,7...),TXD则可以分配到所有偶数编号的引脚PXn(n=0,2,4,6,8...),如果搞反了,就只能改板子了。
2. 内部SDRAM的时钟频率太低,只有四分之一的主频,120MHZ/4 = 30MHZ,基本上驱动个7寸的屏就满带宽了,不过这款芯片的主频可以超频到200MHZ,官方放出的TFT驱动的demo就将主频超频到200MHZ,我实际项目也是用的200MHZ,在2个月的调试的过程中,没有发现什么死机之类的问题。
3. SDRAM只能按照字对齐方式读写,不能半字或者字节方式读写,也是很窝火。真是浪费了这么好的架构。
4. 驱动LCD屏的时候,如果单步调试停止,TFT会停止向SDRAM读写数据,LCD屏会白屏,不过在实际调试的时候,没有太大影响。
5. TFT没有硬件加速单元,而且无法使用DMA传输,这点太窝火了,LittleVGL驱动接口部分,只能使用纯软件打点,占用CPU资源,而且由于只能字访问SDRAM,由于使用的RGB565色彩模式,打点的时候,需要软件判断图形边界,然后做读-改-写的操作,进一步降低了FPS,我将官方的打点函数进行了重写优化,有一定的效果。另外,使用单缓冲刷新时,有比较明显的飘动感和轻微的撕裂感,帧率10帧左右,改成官方的双缓冲方式,还是有飘动感,帧率没有什么变化。并且使用双缓冲是使用纯软件复制的方式。非常耗费CPU资源。后来直接干成了单缓冲方式,有一点撕裂感,但是能接受,关键是可以腾出一块帧显存空间出来,用作它用。另外,相同的硬件配置下,LittleVGL驱动起来没有EMWIN流畅,但是,官方并没有出EMWIN的工程例子,我对EMWIN的底层不是很熟悉,猜测可能是因为SDRAM字访问限制的原因,无法使用EMWIN。 如果有朋友移植到EMWIN,可以在评论区交流交流。
软件方面:
这里必须给华芯微特点赞,库文件做的很简洁,驱动函数接口很实用,不像ST,功能多,对照例程写初始化,基本不用看芯片手册。
开发工具:
可以使用JLINK,也可以使用STLINK,实际项目是使用MDK开发的,没有使用IAR,MDK的环境的设置,可以直接复制官方的工程文件,进行修改即可,现在算法的设置和选择如下图:
如果源码文件使用了中文字符串,编译出现乱码警告,设置如下部分:
基于SWM32的LIttleVGL打点函数优化,下载地址:
有需要的学习或者有兴趣的朋友可以下载运行测试,如果期待大幅度提升效果的朋友,不要浪费你的资源/C币,谢谢!