【STM32H7】第20章 ThreadX GUIX汉字显示(QSPI Flash全字库)

2021-01-07 17:15:36 浏览数 (1)

第20章 ThreadX GUIX汉字显示(QSPI Flash全字库)

本章节为大家讲解GUIX汉字显示的全字库方式。

20.1初学者重要提示

20.2下载算法存放位置(操作前必看)

20.3 GUIX Studio设置汉字显示

20.4 GUIX汉字显示设置

20.5 GUIX窗口任意位置汉字显示

20.6 内部Flash和QSPI Flash程序调试下载配置(重要必看)

20.7 实验例程设计框架

20.8实验例程

20.9 总结

20.1 初学者重要提示

1、 务必看第11章学习GUIX Studio的使用方法和第12章学习GUIX Studio生成的代码移植到硬件平台的方法。

2、GUIX Studio生成的汉字是采用的UTF-8编码。

3、 GUIX Studio V6.0.2设置字体语言后不能立即生效,关闭软件重新打开后解决

http://www.armbbs.cn/forum.php?mod=viewthread&tid=99661 。

4、 STM32H7花式玩转QSPI Flash相关章节都已经发布:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=101064 。

这里强烈推荐看:第83章 STM32H7 的内部 Flash 和 QSPI Flash都运行程序的混合方式(强烈推荐)。

5、 下载本章节相关例子前,务必先添加好QSPI Flash的下载算法。本章使用的方法支持内部Flash和外部QSPI Flash可以同时下载,同时仿真。如此以来,大家可以方便的将全字库存到外部QSPI Flash,简单易用,大大方便大家项目实战。

20.2 下载算法存放位置(操作前必看)

(注:例子下载地址 http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 )

编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:

生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:

  • 第1种:存放到MDK的STM32H7软包安装目录里面:KeilSTM32H7xx_DFP2.6.0CMSISFlash(软包版本不同,数值2.6.0不同)。
  • 第2种:MDK的安装目录 ARMFlash里面。

20.3 GUIX Studio设置汉字显示

GUIX Studio的设置和第18的界面差不多,效果如下:

20.3.1 为窗口添加Drawing Function

这个知识点在第13章有详细讲解,我们这里添加的函数为_cbWindow0:

20.3.2 添加中文

首先,我们要在Languages对话框添加中文语言。打开菜单Configure->Languages:

打开后的效果如下:

点击按钮Add Language:

添加后的效果如下:

这样就完成了在原来英文的基础上再添加一种语言。

20.3.3 删除英文

添加了新的语言后,删除GUIX Studio默认创建的英文,在Language Index里面选择1,然后点击Delecte Languagle:

删除后,Number of Languages语言数变成了1:

20.3.4 设置语言ID

Language ID这里,我们要选项使用Chinese[zh]

20.3.5 添加字库

在GUIX Studio的如下位置添加新的字库(推荐将此字库和GUIX Studio工程文件放到一起):

点击后,弹出的对话框如下:

1、Browse按钮用于选择字库。

2、此处推荐选择Project Relative Path相当路径。

3、设置字体高度为24点阵。

4、此处的勾选比较重要,用于添加扩展字符范围,GUIX Studio默认没有包含全角字字符。

这里将上面三个地址范围打对勾了,其中User Defined Page1范围FF00到FFEF是全角字符范围,这个范围是我们手动添加上的。其它两个勾选的地址范围是中文全字库。

5、使用1bpp,没有使用抗锯齿。

6、生成完毕后,别忘了点击保存。

20.3.6 为Text Button控件设置汉字

选中创建的BUTTON控件,设置Text内容:安富莱电子,设置Font采用我们前面创建的NotoSerifSC。

20.4 GUIX汉字显示设置

20.4.1 第1步:设相关宏定义

设置了显示汉字,函数gx_studio_display_configure的第3个参数要根据GUIX Studio的设置来选择。

  • 我们这里设置显示中文,在文件guiapp_resources.h里面会生成专门的宏:
代码语言:javascript复制
#define LANGUAGE_CHINESE 0
#define DISPLAY_1_LANGUAGE_TABLE_SIZE 1
  • 根据这个宏,修改MainTask.c文件里面函数gx_studio_display_configure的第3个参数:
代码语言:javascript复制
gx_studio_display_configure(DISPLAY_1, stm32h7_graphics_driver_setup_565rgb,
        LANGUAGE_CHINESE, DISPLAY_1_THEME_1, &root);
  • 由于上一步开启了扩展字符范围,这里要在gx_user.h文件中使能相应宏定义:
代码语言:javascript复制
#define GX_EXTENDED_UNICODE_SUPPORT

20.4.2 第2步:设置汉字所在源文件编码格式为UTF-8

比如我们这里是将汉字显示放在MainTask.c文件,那么将此文件编码格式设置为UTF-8即可。简单点的办法,大家可以用记事本打开这个文件,然后设置为UTF-8并保存:

20.4.3 第3步:配置MDK,防止编码错误

MDK5 AC5编译UTF-8编码源文件容易出错,解决办法是在此位置添加--locale=english

MDK AC6无需设置。

20.4.4 第4步:设置GUIX资源文件到外部QSPI Flash。

下面将GUIX资源文件下载到QSPI Flash,需要大家先在这里添加QSPI Flash地址范围:

然后设置资源文件到外部QSPI Flash:鼠标右击文件guiapp_resources.c,选择Options。

20.5 GUIX窗口任意位置显示汉字

GUIX窗口任意位置汉字的实现如下:

代码语言:javascript复制
VOID _cbWindow0(GX_WINDOW *widget)
{
    GX_RECTANGLE drawto;
    GX_CANVAS *mycanvas; 
    

    /* 默认的窗口绘制回调函数,即默认界面效果绘制 */
    gx_window_draw(widget);

    /* 定义一个矩形框,后续的2D绘制函数都是在这个矩形范围内绘制的 */
    gx_utility_rectangle_define(&drawto,
                                10, 
                                100,
                                400, 
                                265);
 
    /* 返回窗口对应的canvas画布 */
    gx_widget_canvas_get(widget, &mycanvas);
    
    /* 
      在指定的画布上启动绘图。此功能在内部被延迟绘图算法调用,GUIX在需要画布时自动执行更新。 
      但是允许应用程序绕过延期绘图算法并立即执行。
      首先调用gx_canvas_drawing_inititate在画布上绘画。
      然后调用所需的绘图函数,最后然后调用gx_canvas_drawing_complete即可。
    */
    gx_canvas_drawing_initiate(mycanvas, widget, &drawto);

    /* 设置笔刷画线的颜色值 */
    gx_context_raw_line_color_set(0xff000000);

    /* 设置笔刷填充的颜色值 */   
    gx_context_raw_fill_color_set(0xff00ff00);

    gx_context_font_set(GX_FONT_ID_NOTOSERIFSC);
    gx_canvas_text_draw(10, 130, "故人西辞黄鹤楼,烟花三月下扬州Ab", -1);
    gx_canvas_text_draw(10, 160, "孤帆远影碧空尽,唯见长江天际流Cd", -1);
   
    /* 用于强制立即绘制,注意,务必和gx_canvas_drawing_initiate成对调用 */
    gx_canvas_drawing_complete(mycanvas, GX_TRUE);
}
  • 字体的颜色是函数gx_context_raw_line_color_set设置的。
  • 字体设置通过函数gx_context_font_set实现,形参GX_FONT_ID_NOTOSERIFSC是在guiapp_resourecs.h定义。这个形参就是我们前面创建的全字库ID。
  • 文本的绘制通过函数gx_canvas_text_draw实现。

20.6 内部Flash和QSPI Flash程序调试下载配置(重要必看)

将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。

20.6.1 下载配置

注意这里一定要够大,否则会提示算法文件无法加载:

我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。

如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:

20.6.2 调试配置

注意这里一定要够大,否则会提示算法文件无法加载:

我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。

如果要做调试下载,需要做如下配置:

20.7 实验例程设计框架

本章例程的重点是GUIX的中文显示。

20.8 实验例程

(注,如果是电阻屏,需要做触摸校准,校准方法看本教程附件章节A)

配套例子:

本章节配套了如下两个例子供大家移植参考:

  • V7-2024_GUIX Chinese Font(QSPI Flash)

GUIX Studio生成的代码在硬件平台实际运行的工程,含有MDK AC5和AC6四个版本工程。

  • V7-2025_GUIX Studio Chinese Font(QSPI Flash)

GUIX Studio工程模板,设计界面后,生成的文件可直接添加到MDK,IAR和GCC软件平台使用。

实验目的:

  1. 本章主要学习GUIX的汉字显示(QSPI Flash)。

实验内容:

  1. 共创建了如下几个任务,通过按下按键K1可以通过串口打印任务堆栈使用情况

App Task Start任务 :启动任务,这里用作BSP驱动包处理。

App Task MspPro任务 :消息处理,这里用作LED闪烁。

App Task UserIF任务 :按键消息处理。

App Task GUI任务 :GUI应用任务。

App Task STAT任务 :统计任务。

App Task IDLE任务 :空闲任务。

GUIX System Thread :GUI系统任务。

System Timer Thread任务:系统定时器任务。

实验效果:

GUIX Studio的界面设计如下:

串口打印任务执行情况:

IAR,MDK AC5和AC6工程可以串口打印任务执行情况:按开发板的按键K1可以打印,波特率 115200,数据位 8,奇偶校验位无,停止位 1:

20.9 总结

本章节主要为大家讲解了GUIX汉字显示的全字库方式,推荐大家熟练掌握本章节的函数用法。

0 人点赞