里飞网

 找回密码
 立即注册
查看: 881|回复: 14

求助LVGL7读取外部字库

[复制链接]

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2022-12-11 16:48:52 | 显示全部楼层 |阅读模式
各位大佬们:请教下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);子函数以及子函数里用的一些代码,谢谢



回复

使用道具 举报

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
 楼主| 发表于 2022-12-11 20:06:01 | 显示全部楼层
阿里大佬帮忙看看什么原因


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);


回复

使用道具 举报

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
 楼主| 发表于 2022-12-11 20:35:00 | 显示全部楼层
显示的内容图片
003.jpg
回复

使用道具 举报

0

主题

0

帖子

50

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
50
发表于 2022-12-11 22:50:04 | 显示全部楼层

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

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

使用道具 举报

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
 楼主| 发表于 2022-12-12 10:14:15 | 显示全部楼层

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

使用道具 举报

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
 楼主| 发表于 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开始地址,测试
回复

使用道具 举报

45

主题

285

帖子

2454

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2454
发表于 2022-12-12 10:23:57 | 显示全部楼层
auqyygtj 发表于 2022-12-12 10:18
1、offset+3145758,其中的3145758是你保存字体BIN所在的地方吗?如果是QSPI支持直接寻址,可以直接返 ...

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

使用道具 举报

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
 楼主| 发表于 2022-12-12 12:32:03 | 显示全部楼层
阿里兄 发表于 2022-12-12 10:23
不行你就把bin文件转以C数组编译进工程,直接返回数组数据的偏移

嗯,谢谢阿里兄!我试试
回复

使用道具 举报

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
 楼主| 发表于 2022-12-12 12:38:57 | 显示全部楼层
阿里兄 发表于 2022-12-12 10:23
不行你就把bin文件转以C数组编译进工程,直接返回数组数据的偏移

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

使用道具 举报

45

主题

285

帖子

2454

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2454
发表于 2022-12-12 13:48:18 | 显示全部楼层
auqyygtj 发表于 2022-12-12 12:38
阿里兄:你所说的把BIN文件转换成C数组是指1、将直接将BIN格式的文件通过工具转换成C数组,加入到工程中 ...

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

使用道具 举报

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
 楼主| 发表于 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[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
回复

使用道具 举报

45

主题

285

帖子

2454

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2454
发表于 2022-12-13 10:17:41 | 显示全部楼层
本帖最后由 阿里兄 于 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不行,肯定是读取有错或是存的时候有出错。
回复

使用道具 举报

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
 楼主| 发表于 2022-12-13 10:21:32 | 显示全部楼层
阿里兄 发表于 2022-12-13 10:17
这是你读取函数有问题,一到要读取可以使用

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

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

使用道具 举报

45

主题

285

帖子

2454

积分

版主

Rank: 7Rank: 7Rank: 7

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

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

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

使用道具 举报

1

主题

10

帖子

27

积分

新手上路

Rank: 1

积分
27
 楼主| 发表于 2022-12-13 10:27:09 | 显示全部楼层
阿里兄 发表于 2022-12-13 10:25
意思是你一定要读取到BUF的话,可以使用内存拷贝的函数。

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

嗯嗯好的谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|里飞网  

GMT+8, 2024-3-29 04:45 , Processed in 0.142138 second(s), 5 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表