|
8#

楼主 |
发表于 2025-2-23 01:29:58
|
只看该作者
结帖了,感谢站主里飞大佬的指点,期间思考过是不是大端小端的问题。通过一步步的解决,最终发现了问题,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);
}可以看到我添加了如果超出偏移范围直接退出该函数。
最后总结一下:站主大佬开源的东西以及代码考虑情况为最后,因为有很多已经成功了的前辈。优先考虑我说的三点 |
|