LVGL移植高通矢量字库GT5SLAD3BFA

发布于:2025-05-01 ⋅ 阅读:(25) ⋅ 点赞:(0)

字库芯片: GT5SLAD3BFA

MCU: STM32F429       

LVGL版本:V8.4

一,实现gt_read_data()

gt_read_data()函数的作用:与字库flash进行通信,函数的定义里调用spi发送数据和接收数据的接口。用户只需要实现该函数,就可以调用GT_Font_Init()进行字库初始化。

请参考下面视频 如何在 32 位 MCU 上使用高通点阵字库:

如何在32位MCU上使用高通点阵字库_哔哩哔哩_bilibili

高通字库使用教程(1)硬件链接与注意事项部分:

高通字库使用教程(1)硬件链接与注意事项部分_哔哩哔哩_bilibili

高通字库使用教程(2)SPI底层函数使用:

高通字库使用教程(2)SPI底层函数使用_哔哩哔哩_bilibili

高通字库使用教程(3)SPI底层函数验证:

高通字库使用教程(3)SPI底层函数验证_哔哩哔哩_bilibili

高通字库使用教程(4)关于库函数的讲解:

高通字库使用教程(4)关于库函数的讲解_哔哩哔哩_bilibili

二,移植

注:如果用户的编译环境是keil,可以通过下方链接下载mindcraft,在mindcraft中自动生成库功生成相应的库文件。

高通字库-高通字库芯片开发资料

1,添加库文件(.lib 或 .a 文件)到LVGL项目工程中

2,初始化字库 

    //字库初始化函数返回大于0表示初始化成功
    int ret = GT_Font_Init();
    printf("GT_Font_Init:%d\n", ret);

3,创建一个新的c文件和一个h文件

存放lvgl获取矢量字库的代码

具体c文件代码如下

4,定义 lv_font_t 变量

lv_font_t类型的变量主要用来设置获取字库数据的方法以及获取字符数据信息的方法。函数指针get_glyph_dsc指向的是设置字符宽度和高度的函数;函数指针get_glyph_bitmap指向的是获取字符数据的函数,并返回存储数据的首地址。用户可以只修改这两处,其他参数默认即可。

//获取字符的信息和数据
#if LV_VERSION_CHECK(8, 0, 0)   //lvgl版本号
const lv_font_t gt5slad3bfa_montserrat_24 = {
#else
lv_font_t gt5slad3bfa_montserrat_24 = {
#endif
    .get_glyph_dsc = _get_gt_font_glyph_dsc_24,             //指向获取字符信息的函数
    .get_glyph_bitmap = _get_gt_font_bitmap_fmt_txt_24,     //指向获取字符数据的函数
    .line_height = 16,              //字体需要的最大行数
    .base_line = 3,                 //从线底部测量的基线
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)   //lvgl版本号范围
    .subpx = LV_FONT_SUBPX_NONE,    //lv_font_subpx_t中的一个元素
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8    //lvgl版本号范围
    .underline_position = -1,       //下划线顶部与基线之间的距离(<0表示基线以下)
    .underline_thickness = 1,       //下划线的厚度
#endif
    .dsc = &font_dsc           //存储的字符数据
};

5,定义 lv_font_fmt_txt_dsc_t 变量

lv_font_fmt_txt_dsc_t变量主要用来设置存储字符数据的内存。用户可以提前定义好一个数组,将这个数组的首地址赋值给glyph_bitmap函数指针。

#if LV_VERSION_CHECK(8, 0, 0)   //lvgl版本号
static  lv_font_fmt_txt_glyph_cache_t cache;    //字体的信息:字符的编码和字形的ID
//存储字体的所有自定义数据
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
#endif
    .glyph_bitmap = glyph_bitmap,   // 数据存储数组,最小为一个文字大小 static unsigned char glyph_bitmap[130] = {0};
    .glyph_dsc = NULL,              //描述字形
    .bpp = 1,                       //每像素比特数:1、2、3、4、8
    .cmaps = NULL,                  //“lv_font_cmap_fmt_txt_t”变量数组
    .kern_dsc = NULL,               //*存储字距值。可以是“lv_font_fmt_txt_ern_pair_t*”或“lv_fent_ern_classe_fmt_xt_t” 取决于kern_classes
    .kern_scale = 0,                //以12.4格式缩放kern值
    .cmap_num = 0,                  //cmap表的数量
    .kern_classes = 0,              //kern_dsc类型
    .bitmap_format = 0,             //lv_font_fmt_txt_bitmap_format_t位图的存储格式
#if LV_VERSION_CHECK(8, 0, 0)   //lvgl版本号    
    .cache = &cache                 //缓存最后一个字母和字形id
#endif
};

6,实现 _get_gt_font_glyph_dsc_24() 函数

该函数用来设置lvgl最后显示字符的时候需要的参数信息,例如字符的宽度和高度。

#include "gt_30l24a3w_lvgl.h"
#include "lvgl/src/font/lv_font.h"
#include "GT5SLAD3BFA.h"

tatic unsigned char glyph_bitmap[130] = {0};   //存储字符数据的数组
/**
 * @brief 设置字符的宽度,高度以及位深
 * 
 * @param font 字符信息变量
 * @param dsc_out 字符的宽度和高度信息
 * @param unicode_letter 字符编码 
 * @param unicode_letter_next 下一个字符编码
 * @return true 
 * @return false 
 */
static bool _get_gt_font_glyph_dsc_24(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter,
                                    uint32_t unicode_letter_next)
{
    //判断编码范围
    if(unicode_letter >= 0x20 && unicode_letter < 0x80){
        dsc_out->adv_w = 24;     // 文字的实际宽度
        dsc_out->box_w = 24;     // 文字的显示宽度
        dsc_out->ofs_y = -2;    // 文字的显示位置偏移
    }
    else{
        dsc_out->adv_w = 24;    // 文字的实际宽度
        dsc_out->box_w = 24;    // 文字的显示宽度
        dsc_out->ofs_y = 0;     // 文字的显示位置偏移
    }

    dsc_out->box_h = 24;        // 文字的显示高度
    dsc_out->ofs_x = 0;         // 文字的显示位置偏移
    dsc_out->bpp   = 1;         // 文字的位深
    dsc_out->is_placeholder = false; // 是否是占位符
    return true;
}

7,实现 _get_gt_font_bitmap_fmt_txt_24 函数

该函数内通过调用矢量字库的get_font函数,获取字库flahs里面的字符数据,获取到的字符数据会存放到lv_font_fmt_txt_dsc_t变量的成员glyoh_bitmap指向的数组。get_font可以根据用户的需求设置获取字符的宽度,高度以及粗细。

/**
 * @brief 获取字符数据
 * 
 * @param font 字符信息变量
 * @param unicode_letter 字符编码
 * @return const uint8_t* 
 */
static const uint8_t * _get_gt_font_bitmap_fmt_txt_24(const lv_font_t * font, uint32_t unicode_letter)
{
    lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc;  //赋值存储字符数据的数组的首地址

    //判断位图的存储格式
    if(fdsc->bitmap_format == LV_FONT_FMT_TXT_PLAIN) {
        //判断编码范围
        if(unicode_letter >= 0x20 && unicode_letter < 0x80){
            // 读取 ASCII 字符
            get_font(&fdsc->glyph_bitmap[0], VEC_FT_ASCII_STY, unicode_letter, 24, 24, 24);
            return &fdsc->glyph_bitmap[0];  //返回存储数组的首地址
        }
        else{
    #if 01
            // Unicode 转换为 GBK 编码
            uint32_t gbk = U2G(unicode_letter);
            if(0 == gbk){
                return NULL;
            }
            // 读取 GBK 字符
            get_font(&fdsc->glyph_bitmap[0], VEC_SONG_STY, unicode_letter, 24, 24, 24);
    #else
            U2G_GetData_16X16(unicode_letter, &fdsc->glyph_bitmap[0]);
    #endif
            return &fdsc->glyph_bitmap[0];  //返回存储数组的首地址
        }
    }
    return NULL;
}

8,使用 

lv_obj_set_style_text_font(label, &gt5slad3bfa_montserrat_24, 0);//获取字库数据
  1. 高通字库官网:联系我们,索取样品,获取详尽资料。高通字库官网链接
  2. 加入高通官方企业微信群:获取最新资讯,享受专业技术支持。
  3. 高通官方软件:一键获取字库开发SDK,告别繁琐的手动操作。详细指南,请参考获取高通字库开发资料链接