里飞网

标题: 求助LVGL7读取外部字库 [打印本页]

作者: auqyygtj    时间: 2022-12-11 16:48
标题: 求助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格式)
刷新显示的时候调用读外部字库处打印的出信息如下:
传入的偏移地址和大小
0xd8  4
0x11c  4
0x168  4
0x158  4
0xd8  4
0x11c  4
0x168  4
0x158  4
0x17750  4
0xf3c72  6
0x17750  4
0x2130004  6
0x17750  4
0x17750  4
0xffe0  6
0x17750  4
0xf3c72  6
0x17750  4
0x17750  4
0xf3c72  6
0x17750  4
0x2130004  6
0x17750  4
0xf3c72  6
0x17750  4
0x2130004  6
0x17750  4
0x17750  4
0xffe0  6
0x17750  4
0x2131113  6
0x17750  4
0xf3c72  6
0x17750  4
0xffe0  6
0x17750  4
0xf3c72  6
0x17750  4


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




作者: auqyygtj    时间: 2022-12-11 20:06
阿里大佬帮忙看看什么原因


static uint8_t __g_font_buf[504];//如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[0]);
//          printf("\r\n0x%x\r\n",__g_font_buf[1]);
    return __g_font_buf;
}




        /*《已连接网络》标签*/       
                   temp_obj = lv_label_create(CON_OBJ.Tab[SET_NET_Connect_CONT_N], 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
显示的内容图片

作者: admin    时间: 2022-12-11 22:50
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

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

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

嗯,谢谢阿里兄!我试试
作者: auqyygtj    时间: 2022-12-12 12:38
阿里兄 发表于 2022-12-12 10:23
不行你就把bin文件转以C数组编译进工程,直接返回数组数据的偏移

阿里兄:你所说的把BIN文件转换成C数组是指1、将直接将BIN格式的文件通过工具转换成C数组,加入到工程中写入测试?2、同样的内容用你的字库软件重新生成一个内部数组的C文件加入到工程?
作者: 阿里兄    时间: 2022-12-12 13:48
auqyygtj 发表于 2022-12-12 12:38
阿里兄:你所说的把BIN文件转换成C数组是指1、将直接将BIN格式的文件通过工具转换成C数组,加入到工程中 ...

直接将BIN格式的文件通过工具转换成C数组
作者: auqyygtj    时间: 2022-12-13 10:10
本帖最后由 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[i*2]= (unsigned char)(tempdata);
                __g_font_buf[i*2+1]= (unsigned char)(tempdata>>8);
                FlashAdd+=2;//偏移2个字节.        
        }        
    return __g_font_buf;   
#else         /*能显示*/
        return (uint8_t*)(0x8200000+offset);
#endif
作者: 阿里兄    时间: 2022-12-13 10:17
本帖最后由 阿里兄 于 2022-12-13 10:18 编辑
auqyygtj 发表于 2022-12-13 10:10
阿里兄:直接返回偏移地址可以显示,读到缓存不能显示是什么原因呢
        
#if 1         /*不能显示*/

这是你读取函数有问题,一到要读取可以使用
  1. memcpy(__g_font_buf, (void*)(0x8200000+offset), size);
复制代码

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

如果是在SPI FLASH等不支持直接地址访问的,就要读到BUF,前面你使用SPI FLASH不行,肯定是读取有错或是存的时候有出错。
作者: auqyygtj    时间: 2022-12-13 10:21
阿里兄 发表于 2022-12-13 10:17
这是你读取函数有问题,一到要读取可以使用

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

存的没有错误,因为我把从写入的数据读出与BIN文件比较过,确定是没有错误的,你说的一定要读取可以使用,这个条件怎么界定判断呢
作者: 阿里兄    时间: 2022-12-13 10:25
auqyygtj 发表于 2022-12-13 10:21
存的没有错误,因为我把从写入的数据读出与BIN文件比较过,确定是没有错误的,你说的一定要读取可以使用, ...

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

就这样吧,其它问题你自己找找原因了。
作者: auqyygtj    时间: 2022-12-13 10:27
阿里兄 发表于 2022-12-13 10:25
意思是你一定要读取到BUF的话,可以使用内存拷贝的函数。

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

嗯嗯好的谢谢




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