天天看点

STM32 emWin使用SPI外挂Flash显示xbf字库

emWin使用SPI外挂Flash显示xbf字库

最近在学习emWin,在走到显示汉字时,发现想要使用字库要么使用UCODS字库,和LCD屏自带函数原来类似的显示方式自己重建字库类型。但是UCODS字库我目前真是没有找到可以自己做的,连字库也要去下载,很不方便。使用官方推荐的软件生成xbf文件,可以自己建字库了,但是能找到的教程基本是SD卡的,真是。。。心累。时常SPI外挂flash使用习惯了,想找找这方面的内容,但是这方面的内容要么太少,要么写的不清楚。所以最后就决定自己研究研究,记录下调试的过程。

  1. 建立xbf字库

    这个使用emWin自带的FontCvtST.exe软件即可生成,目前我只测试了标准版

    STM32 emWin使用SPI外挂Flash显示xbf字库
    STM32 emWin使用SPI外挂Flash显示xbf字库
    STM32 emWin使用SPI外挂Flash显示xbf字库
  2. 把这个文件烧录进外挂的Flash里

    这个文件不需要转成其他格式,我是通过串口连接STM32单片机串口直接烧录进去的

  3. 修改添加程序,这部分可以多比对参考一下,程序很少,特别好移植
    static GUI_FONT xbfFont;             /* GUI_FONT structure in RAM */
     static GUI_XBF_DATA XBF_Data;        /* GUI_XBF_DATA structure in RAM */
     
     //这个是使用SPI读取字库的信息,第一个是偏移地址,第二个是读取长度,最后一个是存储的buff
     static int _cbGetData(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer) 
     {
     	 SPI_Flash_Read(Off, NumBytes, pBuffer);	//这是存储位置从0开始,如果不一样,需在偏移上加上位置
         return (0);
     }
     
     //建立这个字体
     void CreateXBF_Font(void) 
     {
         GUI_XBF_CreateFont(&xbfFont,                              /* Pointer to GUI_FONT structure */
     					  &XBF_Data,                         /* Pointer to GUI_XBF_DATA structure */
     					  GUI_XBF_TYPE_PROP,    /* Font type to be created */
     					  _cbGetData,                         /* Pointer to callback function */
     					  NULL);                                  /* Pointer to be passed to callback */
     }
               
  4. 使用前先初始化,设置字体
    CreateXBF_Font();  //创建XBF字体
     GUI_UC_SetEncodeUTF8(); //这个必须要有
     
     //这个xbfFont是前面定义好的
     GUI_SetFont(&xbfFont)
               
  5. 测试显示了,使用基本的显示函数即可
    GUI_DispStringAt("123456ABCDEF测试", 10, 10);	
               
STM32 emWin使用SPI外挂Flash显示xbf字库
关于可能失败的情况
1. 字库没有烧录到flash
2. 建一个.h文件,保存成格式为UTF-16 LE,把需要显示的字符放到这个文件里,可用记事本更改属性
           
STM32 emWin使用SPI外挂Flash显示xbf字库
STM32 emWin使用SPI外挂Flash显示xbf字库
STM32 emWin使用SPI外挂Flash显示xbf字库

使用TEXT控件显示,其他控件或显示方式类似

// TEXT 
    TEXT_SetFont(hItem, &xbfFont);
    TEXT_SetText(hItem, Sys_GetLanguage() ? Text.english : Text.chinese);
	
	// GUI 
    GUI_SetFont(&xbfFont);
    GUI_DispStringAt( Text.chinese, 10, 10);
           

继续阅读