里飞网

标题: 各位前辈好,我使用的lvgl是8.2,碰到如下问题。 [打印本页]

作者: cainiaoxiaoyu_    时间: 2025-2-19 20:26
标题: 各位前辈好,我使用的lvgl是8.2,碰到如下问题。
前提背景:我使用的工具是站主里飞大佬提供的0.5测试版,LVGL使用的是8.2版本,操作系统使用的是Freertos,我给lvgl提供了互斥锁,保证其他线程不会影响,我想通过将bin文件烧置外置flash然后.c文件进行读取显示
问题:1.我在使用站主开源的0.5测试版的时候发现,我的static uint8_t __g_font_buf [0];为0
2.我在将bin文件烧录置flash之后,程序卡死跑飞。
解决:1.关于SPI-FLASH是否烧录正确,我通过仿真可以查到结构体的大小和文件大小是一致的,,内容不是0xFF,起始地址也是正常的。
2.将使用中文的.c文件转换成UTF-8格式

我想请教一下各位前辈,有没有碰到过类似的问题,如果有希望前辈能够点拨一下。希望站长里飞大佬能够指点一下。
作者: cainiaoxiaoyu_    时间: 2025-2-19 20:32
各位前辈好,还有一点补充就是,我使用内部字库是能够正常实现的
作者: 阿里兄    时间: 2025-2-20 08:43
要使用bin格式字体的话,请使用V0.4版本,0.5生成的C文件有个错误,即高度为0没有设置正确。
作者: cainiaoxiaoyu_    时间: 2025-2-20 21:31
阿里兄 发表于 2025-2-20 08:43
要使用bin格式字体的话,请使用V0.4版本,0.5生成的C文件有个错误,即高度为0没有设置正确。 ...

谢谢里飞前辈的指点,但是你说的情况我有使用,在0.5生成不了对应的.c文件之后,我使用的是0.4版本的,但是同样的结果,我烧录进去发现显示不了中文,所以希望有类似情况的前辈有解决方法
作者: cainiaoxiaoyu_    时间: 2025-2-20 21:54
通过调试发现程序进入:
if(style->is_const) {
        LV_LOG_ERROR("Cannot set property of constant style");
        return;
    }
这个日志中,所以只能显示英文不能显示中文,我的LVGL学习不是很深,希望前辈们不要笑话是,是不是我的样式设置不对?
这是我的部分代码:
static lv_style_t *font_style;
    static lv_obj_t *font_label;

    lv_style_init(font_style);
    lv_style_set_text_font(font_style, &myFont);
    lv_style_set_text_color(font_style, lv_color_black());

    font_label = lv_label_create(lv_scr_act());
    lv_obj_add_style(font_label, font_style, 0);
    lv_label_set_text(font_label, "LVGL 字库的读取");
    lv_obj_align(font_label, LV_ALIGN_TOP_MID, 0, 0);
作者: 阿里兄    时间: 2025-2-21 09:54
cainiaoxiaoyu_ 发表于 2025-2-20 21:54
通过调试发现程序进入:
if(style->is_const) {
        LV_LOG_ERROR("Cannot set property of constant s ...

内部字体使用正常,说明样式设置没问题。肯定是移植BIN字库出的问题,你这大概率是读取函数那里没做好,或是BIN烧录到FLASH出错,这些你要想办法验证。
作者: cainiaoxiaoyu_    时间: 2025-2-22 13:25
阿里兄 发表于 2025-2-21 09:54
内部字体使用正常,说明样式设置没问题。肯定是移植BIN字库出的问题,你这大概率是读取函数那里没做好, ...

非常谢谢里飞大佬的指导,但是我通过打印外部flash存入的信息和文件进行对比发现一致,可能问题出现在了别的地方,只能等有缘的其他大佬指点一下了。
作者: cainiaoxiaoyu_    时间: 2025-2-23 01:29
结帖了,感谢站主里飞大佬的指点,期间思考过是不是大端小端的问题。通过一步步的解决,最终发现了问题,BIN字库生成的有问题。在这里给大家分享一下调试思路,避免大家走很多的弯路。
1.首先判断编写中文的字体是否是UTF-8类型,可以同时内部字体打印看看能否正常显示。
2.其次判断烧录是否正确,烧录至SPI-FLASH的内容可以通过串口调试打印出来,只需要打印起始地址+文件大小-4096,打印最后4K的内容即可。
3.如果以上都正确,先判断BIN文件是否生成正确,BIN文件包含信息为头部Unicode编码范围,我的是0x0020~0xf029,站主提供的为小端存储方式,所以为20 00 29 f0,如果发现和你的编码范围不一致可以生成BIN文件进行烧录。
期间怀疑过大小端的问题,以为是反了。甚至还犯了一个错误,代码如下:
tatic const uint8_t *__user_font_get_bitmap(const lv_font_t *font, uint32_t unicode_letter)
{
    if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min)
    {
        return NULL;
    }
    uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4;
    // printf("Unicode: 0x%04X, Offset: %lu\n", unicode_letter, unicode_offset);
    uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4);
#if DUBUGE_ENABLE
    printf("Read Pos value: %02X %02X %02X %02X\n", __g_font_buf[0], __g_font_buf[1], __g_font_buf[2], __g_font_buf[3]);
    printf("Pos: %lu\n", pos);
#endif
    if (p_pos[0] == 0 || p_pos[0] > ftinfo.lv_fontsize)
    {
        printf("Error: Invalid Pos value!\n");
        return NULL;
    }

    glyph_dsc_t *gdsc = (glyph_dsc_t *)__user_font_getdata(p_pos[0], sizeof(glyph_dsc_t));
    return __user_font_getdata(p_pos[0] + sizeof(glyph_dsc_t), gdsc->box_w * gdsc->box_h * __g_xbf_hd.bpp / 8);
}可以看到我添加了如果超出偏移范围直接退出该函数。
最后总结一下:站主大佬开源的东西以及代码考虑情况为最后,因为有很多已经成功了的前辈。优先考虑我说的三点




欢迎光临 里飞网 (http://dz.lfly.xyz/) Powered by Discuz! X3.3