|
最近从库房找出了几块落灰几年的奋斗V3板子,搭载一块3.0寸的显示屏,分辨率240*400,整体外设还可以吧,有按键,FM,MP3,NRF24L01,以太网,CAN总线等。主芯片是STM32F103ZET6, QFP100封装,64K片内SRAM,512K片内FLASH,也算是丰富了。
板子自带的例程是ucos ii + ucgui,我对ucos不大感兴趣,反正是看着FreeRTOS挺顺眼,加上ucgui和Stemwin都是出于emwin,因此果断选择了FreeRTOS + Emwin的模式,stemwin是st从seeger公司购买的版权,只要是他自家的芯片,就可以免费使用,也挺好。就算是以后不用st的芯片了,但原理都是相通的,自然也是没关系的。
板子到手之后,先是看了一下硬件原理图,说明文档之类的,然后将之前我那个mini开发板上的rtos直接修改一些参数,就可以使用了。至于屏幕,使用的是瑞萨的R61509驱动芯片,去st官网下载emwin源码包后,本以为找到官网的STM3210E-EVAL项目,在此基础上改一下目标型号和初始化函数就ok了呢,结果尝试之后一直白屏,只因为操控的型号不对,驱动方式为GUIDRV_CompactColor_16,一般网上流传的都是GUIDRV_FlexColor方式。按照文档说明,应该是在LCDConf_CompactColor_16.h文件中配置,但我怎么都找不到这个文件,o(╯□╰)o,甚至从网上下载了一个文件,也没弄成功。网上搜索结果显示很多人都和我一样迷惑,最后在网上原子哥这里http://www.openedv.com/posts/list/37054.htm,看到一个同样是用这个型号芯片的网友,他自己写了底层驱动,然后发现还有一些别的问题。还看到一个网友,13年开始移植,14年帖子下面还问着有没有解决的,哎,坑爹的文档啊。
前面说过,ucgui和emwin有很多相同的地方,那么既然能驱动ucgui,我想,自然也是可以用在emwin上的,参考http://218.244.144.132/posts/list/0/27697.htm 还有http://www.openedv.com/posts/list/11666.htm,建立起模板,大致如下:
其中,GUIConf.c和GUIConf.h以及LCDConf.c都是自己从别的地方拷贝过来的,lcd_r1509.c包含最底层的基本操作(写命令和写数据以及初始化等)和画点以及获取点颜色,画线画矩形等API需要调用的函数,GUIDRV_Template.c则是底层函数与emwin之间衔接的部分,通过完善指定的函数以达到目标。这些函数包括但不局限于_DrawBitLine1BPP(),_DrawBitLine4BPP(),_DrawBitLine8BPP(),_DrawBitLine16BPP(),_DrawBitmap(),_DrawHLine(),_DrawVLine(),_SetPixelIndex(),_GetPixelIndex(),_XorPixel(),这些可能是必须的,还有一些,基本都是相互调用了,不修改一般也不会出错。具体可以看附带的源码。这里说一些细节,一般ucgui的函数都是以LCD_L0_开头,而emwin则是下划线_开头,虽然很多函数名也都相同,但一个重要的地方是ucgui中有多处调用GUI_Context这个结构体,但是emwin中没有,一开始我自定义了一个放在GUI_Private.h中,类型为GUI_CONTEXT,这当然是错误的,一开始没有开启官方demo之前,这样做还看不出差错,但是等到编译demo冲突的时候就知道不对劲了,而且之前可以清屏,画矩形但就是显示不出来字符,不知道是不是这里的原因。还有一个需要注意的地方是,之前我没改动_DrawBitLine1BPP()等函数时,出现了无法打印字符的现象。
因为ucgui和emwin的关系,所以我了解了如何去做之后,这部分并没有花费很久的时间,复制修改一致就好了。注意函数命名别错了就没事。很快就可以看到界面了,因为没有配置_DrawBitmap()函数,所以虽然可以设置背景色但是无法显示文本,这个前面说过。之后添加将demo文件夹直接复制到工程下面,并添加和配置相应的头文件,然后编译,根据错误进行修改,没声明的声明,实在是不知道怎么声明的就先写一个空函数,没打开的功能打开。这些网上都可以找到资料的。也可以阅读我提供的源代码,里面有注释的。
随后,修改完这些,官方demo基本可以跑起来了,然后移植触摸屏,使用官方模拟器下面的一个\Sample\Tutorial\TOUCH_Sample.c来校准,通过那个函数找到四个点的值,然后修改配置LCDConf.c中四个顶点的值,至于触摸的底层驱动只要没使用emwin之前可用就好了。触摸屏底层与api交互的文件是GUI_X_Touch_Analog.c,完善里面的函数,读取x轴,y轴即可。
然后,可以自己尝试使用官方的GUIBuilder.exe自己画一个界面,这个也可以看看示例,我那个是随手画的,太丑请不要太介意。。。这里注意一下,GUIBuilder首次运行会保存当前路径到配置文件,如果改动GUIBuilder.exe文件路径的同时也复制了GUIBuilder.ini,那么可能会导致存储路径出现问题。
主函数使用了宏定义来方便编译
|
|