中文字库芯片GT30L32S4W在emWin图形库中的应用
2015-07-02赵云
赵 云
(桂林电器科学研究院有限公司,桂林541004)
引 言
随着嵌入式系统已渗透入社会生活的很多领域(如电子消费品、医疗仪器、工业环境),无论是普通消费者还是商业用户,都期待更友好的UI界面体验。emWin图形库是目前广泛应用于嵌入式系统界面开发的中间件,但em-Win中不能直接使用中文,且只提供库文件,不开放源代码,使通过修改emWin源代码实现中文支持非常困难。如何在emWin中实现中文界面显示,一直是嵌入式GUI设计中关注的问题。
常用的emWin支持中文的方法有两种:
①用emWin提供的fontCvt工具生成特定的C语言格式的字库代码,加载在ROM空间供em Win调用,缺点是需要占用ROM资源。
②用第三方工具生成字库文件,然后拷贝到SD卡或烧录到Flash芯片,供em Win用文件系统方式调用,但用Flash需要额外烧录,用SD卡又会拖慢显示速度。
本文的方案把GT30L32S4W字库映射到emWin的字体显示接口,使em Win支持中文显示。这种方式可以避免额外对Flash的烧录工作,降低使用第三方字库的风险,也不需要占用MCU的ROM空间,用emWin做界面设计时,可直接调用GT30L32S4W内全部汉字资源,方案框图如图1所示。
图1 GT30L32S4W方案框图
1 GT30L32S4W和STM32F103ZET6的硬件接口
1.1 简述GT30L32S4W
GT30L32S4W为上海高通(GOTOP)发布的字库芯片,支持国标字符集GB2312(6 763个汉字),支持12×12、16×16、24×24、32×32四种点阵字型,总线接口为SPI,封装为SOP8。
该芯片与STM32F103ZET6的接口电路如图2所示,可以借鉴参考文献[3]给出的SPI时序要求,直接调用STM32的库函数实现GT30L32S4W的SPI读写函数。
图2 STM32F103ZET6和GT30L32S4W硬件SPI1接口电路
1.2 GT30L32S4W连续读出单个汉字字模
这里给出读取以DST为首地址的连续no_bytes个字节的实现方法,读取完成后,字模保存在GUI_Font-DataBuf[]数组,供下一步处理。
2 GT30L32S4W和emWin的软件接口
2.1 emWin的字库接口
①结构体GUI_p UC_API为em Win的字符编码接口,emWin通过 GUI_UC_Set EncodeNone()函数调用了该接口,但是emWin图形库不开放源代码,无法直接修改库文件。对应的方法是打开UCGUI v3.98开源版本中提供的GUI_UC_EncodeNone.c文件,改写里面的_GetChar-Code()、_GetCharSize()、_CalcSizeOfChar()、_Encode()这4个函数,增加GB2312编码的处理,然后把改动过的文件加入工程编译,可以使GUI_p UC_API指向改动过的函数,实现emWin对GB2312汉字的识别。
②emWin的字符显示接口为GUIPROP_DispChar(),这个函数的功能是获取字符字模,再执行画位图的函数将字符显示出来,该函数原型在UCGUI v3.98开源版本的GUICharP.c文件中。修改的方法是参考GUIPROP_DispChar()源代码,改写为 GUIPROP_X_DispChar()函数,在获取字模时先区分英文和汉字,如果为汉字就调用高通字模定位算法,连续读取一个汉字的字模,然后进行显示处理。
③加入新字体还需要修改em Win图形库中提供的头文件GUI.H和GUI_TYPE.H,把新字体的显示方法指向GUIPROP_X_DispChar()函数,这部分的工作在参考文献[2]中有论述,具体源代码可以借鉴参考文献[6]。注意:emWin可以视为是开源的UC/GUI v3.98之后不开源的高级版本。
2.2 高通字库的通用字模的定位算法
GT30L32S4W支持12×12、16×16、24×24、32×32四种点阵字型,由于参考文献[2]、[3]和[4]给出不同点阵字型的计算方式不同,使用不方便。这里归纳出一套通用的字库IC汉字地址计算方法:
①BaseAdd:一套点阵字体在GT30L32S4W芯片中的起始地址,例如16×16点阵的起始地址为0x2 C9D0。
②MSB:一个汉字的内部GB2312编码为16位,MSB表示该汉字GB2312编码的高8位。
③LSB:类似MSB,表示一个汉字GB2312编码的低8位。
④FontByte:单个汉字的存储长度,比如一个12×12点阵汉字需要连续24个字节,32×32点阵需要连续128个字节。如图3所表示,一个24×24汉字需要3×24共72个字节的存储长度,读取字模的时候需要连续读取72个字节,保存到一个数组里,再等待下一步显示处理。
图3 24×24的汉字
⑤Address:由MSB和LSB组成的16位GB2312汉字在字库IC芯片中的字节地址,如图3中汉字“高”的GB2312码为0xB8DF,拆开 MSB就是0xB8,LSB就是0xDF。表1为GT30L32S4W的汉字地址表,可以根据该表将参数代入定位算法得到某个汉字的字模位置。
表1 GT30L32S4W等宽汉字地址表
结 语
本文提供了基于字库芯片GT30L32S4W的em Win中文显示方案。图4所示为em Win调用中文字库IC的实际效果,界面包括BUTTON控件、TEXT控件和DROPDOWN控件,均显示正常。
图4 emWin调用中文字库IC的实际效果
该方案已应用在宝通公司的尿液分析仪上,证明了该方案对emWin有良好的兼容性。该方案使产品量产时免除了字库烧录和测试工序,减少了第三方字符生成软件的风险,节省了Flash芯片成本,是一种值得推广的嵌入式系统中文界面支持方案。此外,高通还提供多国语言的字库芯片,参考该方案可以对emWin显示日文、韩文做进一步研究。
[1]SEGGER.emWin User&Reference Guide V5.28[EB/OL].[2015-03].www.segger.com.
[2]李建红,刘丹,徐展.基于UCGUI库的外扩中文字库研究与实现[J].计算机工程,2014,40(2):271-274.
[3]高通科技.GT30L32S4W标准汉字字库芯片用户手册V1.0[EB/OL].[2015-03].www.genitop.com.
[4]冯月芹,汤小龙.高通字库芯片GT23H32S4W的应用[J].单片机与嵌入式系统应用,2013(12):45-47.
[5]陈新,蒲庆文.基于emWin图形库的电动汽车液晶仪表设计[J].仪表技术与传感器,2013(7):105-110.
[6]jdh99.在emWin中显示字库芯片GT23L24M0140的字模[EB/OL].[2015-03].http://blog.csdn.net/jdh99.