auqyygtj 发表于 2022-12-11 16:48:52

求助LVGL7读取外部字库

各位大佬们:请教下LVGL7读取外部字库
环境:LVGL7,LvglFontToolV0.4
原先用内部字库是正常可以显示的,现在想更改成外部字库,字库BIN文件已写入,也读出串口打印出来查看过是正常的

static uint8_t *__user_font_getdata(int offset, int size)
        {
    //如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
    //如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset);
                printf("\r\n0x%x%d",offset,size); /*串口打印输出每次来的偏多地址,以及大小*/
        qspi_data_read(offset+3145758, size, __g_font_buf);       
    return __g_font_buf;
}

测试显示中文内容为一个汉字"已"(UTF8格式)
刷新显示的时候调用读外部字库处打印的出信息如下:
传入的偏移地址和大小
0xd84
0x11c4
0x1684
0x1584
0xd84
0x11c4
0x1684
0x1584
0x177504
0xf3c726
0x177504
0x21300046
0x177504
0x177504
0xffe06
0x177504
0xf3c726
0x177504
0x177504
0xf3c726
0x177504
0x21300046
0x177504
0xf3c726
0x177504
0x21300046
0x177504
0x177504
0xffe06
0x177504
0x21311136
0x177504
0xf3c726
0x177504
0xffe06
0x177504
0xf3c726
0x177504


实际“已字的字库偏移地址在0XF3B2F开始为已的编码内容开始地址”
现在就是显示不出来,
如果大佬们能提供下你们读成功的SPIFLASH_Read(__g_font_buf,offset,size);子函数以及子函数里用的一些代码,谢谢



auqyygtj 发表于 2022-12-11 20:06:01

阿里大佬帮忙看看什么原因


static uint8_t __g_font_buf;//如bin文件存在SPI FLASH可使用此buff
extern void qspi_data_read(uint32_t addr, uint32_t total_len, uint8_t* buf);
extern void AT_Flash_ReadU8(u32 FlashAdd,u8 *pBuffer,u16 Leng); //读取指定长度       

static uint8_t *__user_font_getdata(int offset, int size){
    //如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
    //如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset);
//        qspi_data_read(offset, size, __g_font_buf);       
//        memset(__g_font_buf, 0, sizeof(__g_font_buf));
//        AT_Flash_ReadU16(offset+0x8200000,(u16 *)&__g_font_buf,size); //读取指定长度       
                AT_Flash_ReadU8(offset+0x8200000,__g_font_buf,size); //读取指定长度       
//               printf("\r\n0x%x",__g_font_buf);
//          printf("\r\n0x%x\r\n",__g_font_buf);
    return __g_font_buf;
}




        /*《已连接网络》标签*/       
                   temp_obj = lv_label_create(CON_OBJ.Tab, NULL);
//                                                                        lv_obj_set_style_local_text_font (temp_obj,LV_LABEL_PART_MAIN,LV_STATE_DEFAULT, &chineseFont_Wide20); /*内部字库显示正常*/
                                                                        lv_obj_set_style_local_text_font (temp_obj,LV_LABEL_PART_MAIN,LV_STATE_DEFAULT, &chineseFont_Wide20E); /*使用外部字库只能显示连接*/
                                                                        lv_obj_set_style_local_text_color(temp_obj,LV_LABEL_PART_MAIN,LV_STATE_DEFAULT, lv_BackColor_blue); //文本深蓝色颜色。
                                                                        lv_obj_set_style_local_text_opa (temp_obj,LV_LABEL_PART_MAIN,LV_STATE_DEFAULT, LV_OPA_100 );//文本的不透明度。默认值:LV_OPA_COVER 。
                                                                        lv_label_set_text(temp_obj," 宸茶繛鎺ョ綉缁?");   /*已连接网络*/
//                                                                        lv_label_set_text(temp_obj,(char *)pConv_UTF8((unsigned char *)&"已连接网络"));
                                                                        lv_label_set_recolor(temp_obj, true);
                                                                        lv_obj_set_auto_realign(temp_obj, true);//自动对齐
                                                                        lv_obj_align(temp_obj,NULL,LV_ALIGN_IN_LEFT_MID,30,0);


auqyygtj 发表于 2022-12-11 20:35:00

显示的内容图片

admin 发表于 2022-12-11 22:50:04

auqyygtj 发表于 2022-12-11 20:35
显示的内容图片

1、offset+3145758,其中的3145758是你保存字体BIN所在的地方吗?如果是QSPI支持直接寻址,可以直接返回偏移地址即可,如SDRAM一样。
2、后面的offset+0x8200000,其中的0x8200000又是什么存储。

读取函数已经非常简单了,就是按要求返回字体BIN,按offset偏移,size大小的内容,有这么难理解吗。

auqyygtj 发表于 2022-12-12 10:14:15


1、offset+3145758,其中的3145758是你保存字体BIN所在的地方吗?如果是QSPI支持直接寻址,可以直接返回偏移地址即可,如SDRAM一样。这是保存在QSPI里的,显示不出来这个存储的地址是全部的中文字库地址,3145758是QSPI字库的偏移地址(前面留了3M);
2、后面的offset+0x8200000,其中的0x8200000又是什么存储。这个是后来缩小问题原因,另搞了将原本可以显示的内部字库内容生成BIN文件,单独写入到单片机的Flash里的2M开始地址,测试

auqyygtj 发表于 2022-12-12 10:18:50

admin 发表于 2022-12-11 22:50
1、offset+3145758,其中的3145758是你保存字体BIN所在的地方吗?如果是QSPI支持直接寻址,可以直接返回 ...



1、offset+3145758,其中的3145758是你保存字体BIN所在的地方吗?如果是QSPI支持直接寻址,可以直接返回偏移地址即可,如SDRAM一样。这是保存在QSPI里的,显示不出来这个存储的地址,内容是全部的中文字库地址,3145758是QSPI字库的开始偏移地址(前面留了3M);
2、后面的offset+0x8200000,其中的0x8200000又是什么存储。这个是后来缩小问题原因,没有采用外部QSPI方式,采用读单片机内部地址,另搞了将原本可以显示的内部小字库内容生成BIN文件,单独写入到单片机的Flash里的2M开始地址,测试

阿里兄 发表于 2022-12-12 10:23:57

auqyygtj 发表于 2022-12-12 10:18
1、offset+3145758,其中的3145758是你保存字体BIN所在的地方吗?如果是QSPI支持直接寻址,可以直接返 ...

不行你就把bin文件转以C数组编译进工程,直接返回数组数据的偏移

auqyygtj 发表于 2022-12-12 12:32:03

阿里兄 发表于 2022-12-12 10:23
不行你就把bin文件转以C数组编译进工程,直接返回数组数据的偏移

嗯,谢谢阿里兄!我试试

auqyygtj 发表于 2022-12-12 12:38:57

阿里兄 发表于 2022-12-12 10:23
不行你就把bin文件转以C数组编译进工程,直接返回数组数据的偏移

阿里兄:你所说的把BIN文件转换成C数组是指1、将直接将BIN格式的文件通过工具转换成C数组,加入到工程中写入测试?2、同样的内容用你的字库软件重新生成一个内部数组的C文件加入到工程?

阿里兄 发表于 2022-12-12 13:48:18

auqyygtj 发表于 2022-12-12 12:38
阿里兄:你所说的把BIN文件转换成C数组是指1、将直接将BIN格式的文件通过工具转换成C数组,加入到工程中 ...

直接将BIN格式的文件通过工具转换成C数组

auqyygtj 发表于 2022-12-13 10:10:45

本帖最后由 auqyygtj 于 2022-12-13 10:15 编辑

阿里兄 发表于 2022-12-12 13:48
直接将BIN格式的文件通过工具转换成C数组
阿里兄:直接返回偏移地址可以显示,读到缓存不能显示是什么原因呢
      
#if 1         /*不能显示*/
FlashAdd=offset+0x8200000;      
      for(i=0;i<size/2;i++)
      {
                tempdata=*(vu16*)FlashAdd;
                __g_font_buf= (unsigned char)(tempdata);
                __g_font_buf= (unsigned char)(tempdata>>8);
                FlashAdd+=2;//偏移2个字节.      
      }      
    return __g_font_buf;   
#else         /*能显示*/
      return (uint8_t*)(0x8200000+offset);
#endif

阿里兄 发表于 2022-12-13 10:17:41

本帖最后由 阿里兄 于 2022-12-13 10:18 编辑

auqyygtj 发表于 2022-12-13 10:10
阿里兄:直接返回偏移地址可以显示,读到缓存不能显示是什么原因呢
      
#if 1         /*不能显示*/

这是你读取函数有问题,一到要读取可以使用
memcpy(__g_font_buf, (void*)(0x8200000+offset), size);
因为你的内存可以直接访问,所以可以直接内存拷贝;

如果是在SPI FLASH等不支持直接地址访问的,就要读到BUF,前面你使用SPI FLASH不行,肯定是读取有错或是存的时候有出错。

auqyygtj 发表于 2022-12-13 10:21:32

阿里兄 发表于 2022-12-13 10:17
这是你读取函数有问题,一到要读取可以使用

因为你的内存可以直接访问,所以可以直接内存拷贝;

存的没有错误,因为我把从写入的数据读出与BIN文件比较过,确定是没有错误的,你说的一定要读取可以使用,这个条件怎么界定判断呢

阿里兄 发表于 2022-12-13 10:25:00

auqyygtj 发表于 2022-12-13 10:21
存的没有错误,因为我把从写入的数据读出与BIN文件比较过,确定是没有错误的,你说的一定要读取可以使用, ...

意思是你一定要读取到BUF的话,可以使用内存拷贝的函数。

就这样吧,其它问题你自己找找原因了。

auqyygtj 发表于 2022-12-13 10:27:09

阿里兄 发表于 2022-12-13 10:25
意思是你一定要读取到BUF的话,可以使用内存拷贝的函数。

就这样吧,其它问题你自己找找原因了。 ...

嗯嗯好的谢谢
页: [1]
查看完整版本: 求助LVGL7读取外部字库