我从stm32一路学到esp32,发现这款芯片挺好玩的,主要是还是stm32太贵了,stm32主要是很多坑有人遇到了,并给出了解决方法,esp32这方面就少点,有时候找不到的,只能靠自己了。

本文使用vscode加esp32 idf环境,主要是解决esp32 idf使用esp32自带的falsh,存字库,显示中文,之前使用文件系统来显示,使用上比较卡顿,我这里使用esp32自带的函数显示,解决卡顿问题。我这里是使用的我也是借鉴许多大佬的经验。本文主要目的也是一则分享经验,给大家一个思路,二则是记录一下。

第一步是制作字体,字体制作使用“lvlgFontTool V0.4”这软件,大家网上自行下载即可,先选择字体,字体可以自行去网上下载字体即可,我这里使用的是阿里巴巴的字体,字体高度,可以根据自己要求改,然后确定就行。

第二步根据自己flash的大小,看情况选择常用汉字还是全部汉字,然后选择版本6.0版本以上,类型选择XBF字体,外部bin文件,然后开始转换,选择好路径保存即可。打开保存的文件夹,可以看到一个c文件和一个bin文件,之后我们需要用到。



第三步:制作分区表,因为我们需要把字库存到esp32自带的falsh里面,我们需要制作分区表,打开自己工程的目录下有个partitions.csv文件,没有自己建一个,然后根据下面图的内容进行填写即可。我这里不讲原理,有兴趣的可以去查esp32分区表。只要关注最后一行是我们的存字库的地方,其中最后一列是填写这个分区多大,我这里bin文件1.5m多,我直接填了2M,大家可以根据自己的生成的字库大小填写。

注意自己的esp32自带的falsh多大,我的是4m的,esp32默认设置是2m,大家可以esp32在vscode,点击那个小齿轮,然后找到flash size的选择,改成自己实际的大小,然后再找到那个csv选择,改成下图所示,然后编译一下上传,然后看看重启后看看串口打印消息的,其中lenth是不是自己设置的,我这里是00200000。





然后现在我们需要将我们制作的bin文件烧写到esp32中,我们打开刚才的文件夹,然后我们这边需要使用到一个下载工具“esptool.py”,这个文件可以自行到你们的esp32的安装目录里面搜索,把他复制到现在的文件夹即可。
然后打开命令提示符,我们首先需要看看自己的python是否正常运行,输入python,看他会不会打印版本消息,如果是提示报错的话,自行百度安装pyhon即可,然后我们输入cd加bin文件的目录,然后转到该目录下然后输入以下代码。
其中[port] 是当前esp32连接的串口,根据自己的实际填写,[baud]是波特率,一般是115200,0x1b9000是先前分区表第四行第四列的值,代表该文件存放的起始位,myFont.bin是我们生成的bin文件名,然后回车,然后等待进度走完,如果没报错,我们就成功的一大半了。

python esptool.py --chip esp32 --port [port] --baud [baud] write_flash -z 0x1b9000 myFont.bin


第四步,我们应该是把那个c文件拷贝到自己工程的components\lvgl\src\font目录下,因为我一直没明白CMakeLists,所以我这边一直出现找不到“"esp_partition.h"这个头文件,如果有知道的大神可以在评论区回复下哈
我这边因为这个原因,我就放在我自己工程下的components\uart0\src目录下,这是我自己创建的组件,然后记得在CMakeLists.txt文件中添加PRIV_REQUIRES lvgl和REQUIRES spi_flash,不然找不到头文件,然后把那个myFont.c里面的,添加#include “esp_partition.h”,然后改写static uint8_t *__user_font_getdata(int offset, int size)这个函数,具体看下面的内容

//CMakeLists.txt文件,这个文件根据实际需要的组件填写,我这里引入了许多的组件,
//来支撑其他文件,我的工程和你的可能不一样,不要全部复制,你需要是添加添加PRIV_REQUIRES lvgl和REQUIRES spi_flash
set(uart0_srcs "src/myFont.c")
idf_component_register(SRCS "${uart0_srcs}"INCLUDE_DIRS "include"PRIV_REQUIRES nvs_flashPRIV_REQUIRES lvglPRIV_REQUIRES lvgl_esp32_driversREQUIRES esp_http_clientREQUIRES jsonREQUIRES mqtt REQUIRES fatfsREQUIRES spiffsREQUIRES spi_flash)
/*
*---------------------------------------------------------------
*                        Lvgl Font Tool
*
* 注:使用unicode编码
* 注:本字体文件由Lvgl Font Tool V0.4 生成
* 作者:阿里(qq:617622104)
*---------------------------------------------------------------
*/
//这是myFont.c文件#include "lvgl.h"
#include "esp_partition.h"typedef struct{uint16_t min;uint16_t max;uint8_t  bpp;uint8_t  reserved[3];
}x_header_t;
typedef struct{uint32_t pos;
}x_table_t;
typedef struct{uint8_t adv_w;uint8_t box_w;uint8_t box_h;int8_t  ofs_x;int8_t  ofs_y;uint8_t r;
}glyph_dsc_t;static x_header_t __g_xbf_hd = {.min = 0x0020,.max = 0x9fa5,.bpp = 2,
};static uint8_t __g_font_buf[300];//如bin文件存在SPI FLASH可使用此buffesp_partition_t* partition_res=NULL;
static uint8_t *__user_font_getdata(int offset, int size)
{static uint8_t first_in = 1;  if(first_in==1){      partition_res=esp_partition_find_first(0x01,0x40,NULL);//这个函数第一个参数是我们分区表的第四行的,第二列的参数,第二个是第三列的值first_in=0;if (partition_res == NULL){printf("Failed to open file for reading\n");return;}else{printf("Successfully open file for reading\n");}}esp_err_t res=esp_partition_read(partition_res,offset,__g_font_buf,size);//读取数据if(res!=ESP_OK){printf("Failed to reading\n");}return __g_font_buf;
}static 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;uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4);if( p_pos[0] != 0 ) {uint32_t pos = p_pos[0];glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(pos, sizeof(glyph_dsc_t));return __user_font_getdata(pos+sizeof(glyph_dsc_t), gdsc->box_w*gdsc->box_h*__g_xbf_hd.bpp/8);}return NULL;
}static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) {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;uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4);if( p_pos[0] != 0 ) {glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(p_pos[0], sizeof(glyph_dsc_t));dsc_out->adv_w = gdsc->adv_w;dsc_out->box_h = gdsc->box_h;dsc_out->box_w = gdsc->box_w;dsc_out->ofs_x = gdsc->ofs_x;dsc_out->ofs_y = gdsc->ofs_y;dsc_out->bpp   = __g_xbf_hd.bpp;return true;}return false;
}//Alibaba PuHuiTi,,-1
//字模高度:22
//XBF字体,外部bin文件
lv_font_t myFont = {.get_glyph_bitmap = __user_font_get_bitmap,.get_glyph_dsc = __user_font_get_glyph_dsc,.line_height = 22,.base_line = 0,
};

第五步,然后我们可以测试一下,首先引入字库,然后测试一下

LV_FONT_DECLARE(myFont);//引入字库
static lv_label_t* other_btn_label;//创建对象
other_btn_label = lv_label_create(lv_scr_act());//获取默认屏幕
lv_obj_set_style_text_font(other_btn_label,&myFont,0);// 设置风格的字体
lv_label_set_text(other_btn_label,"你好世界");//显示文字

至此,完成中文显示。我也是刚玩esp32没多久,这是我第一次发文,所以内容上有错误大家可以提出,出现问题也可以在评论区提出了,我看能不能解决,可能有些问题我也无法回答,请大家善用搜索,我也是借鉴了许多大神的经验而来的。如果文章觉得可以的,可以点个赞呦!

ESP32 IDF LVGL8.0 flash 外部字库显示 中文显示相关推荐

  1. 物联网开发笔记(63)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:显示中文

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程的第一步:显示中文. 二.环境 ESP32 + 3.2寸 ILI9341触 ...

  2. kivy mysql_Kivy中文显示

    [Kivy中文显示]的更多相关文章 Win7系统 下载 DroidSansFallback.ttf字体(android设备上自带了) 源代码第一行增加#-*- coding:utf-8 -*- 创建w ...

  3. python教程-数据分析-matplotlib绘制折线图1(改变图片大小,保存图片,改变坐标的间距,显示中文,快捷键出对应文档)

    matplotlib学习笔记: `matplotlib`之缘起 导入包 绘制简单的折线图 改变图片大小 保存图片 改变坐标轴的间距 调整图片的密集程度 学到这,要来一题练练手了! 在matplotli ...

  4. js前台页面显示中文,后台存对应的value值实现

    field: 'rightType',title: '权益类型',//width: 100,align: 'left',valign: 'top',sortable: true,formatter:r ...

  5. STM32移植Littlevgl(LVGL)V8.0.2使用文件系统+BMP解码显示外部FLASH中图片

    说明:选择BMP解码图片的方式,是因为此方式不需要占用太多的RAM 一.主要参数及版本 MCU:STM32F103ZET6 LCD:2.8寸ILI9341,使用FSMC驱动 SPI FLASH:W25 ...

  6. 【STM32H7】第20章 ThreadX GUIX汉字显示(QSPI Flash全字库)

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第20章       ThreadX GUIX汉字显示(QSPI ...

  7. ESP32 ESP-IDF LVGL8 显示中文

    陈拓 2022/12/15-2022/12/16 1. 开发环境 <ESP32 ESP-IDF LVGL8.3.3移植> ESP32 ESP-IDF LVGL8.3.3移植_晨之清风的博客 ...

  8. emwin从外部flash中读取bmp图片显示

    在emwin中有提供了一个从外部读取图片数据进行显示的函数,如下: 而且提供了官方例程,不过官方历程中从外部读取是从外部文件系统中进行读取的bmp图片进行显示,官方例程如下 /* ********** ...

  9. littlevgl 6.0 外部spiflash 显示中文

    I.简介 littlevgl 6.0 显示中文,从查找的资料来看,一种利用内部flash,通过官方工具或网友制作的工具,生成.C文件放到内部编译,在声明下,就可以显示中文.这种方法只是用少量字体,毕竟 ...

最新文章

  1. Atitit.论垃圾文件的识别与清理 文档类型垃圾文件 与api概要设计pa6.doc
  2. 公共交通伸展城市智慧
  3. python声明_【瞎折腾-03】在Python里面写类型“声明”
  4. 邮件发送代码--网易服务器代理
  5. [复变函数]第17堂课 5 解析函数的 Laurent 展式与孤立奇点 5. 1 解析函数的 Laurent 展式...
  6. mongo3.5 java cursor,Spring Data MongoDB-需要'cursor'选项
  7. ADOQUERY,CLIENTDATASET,ADOSTOREPROC执行存储过程【多种方法】
  8. 客户端工具收取邮件提示-ERR maildrop alredy locked
  9. 格力分红55亿,董明珠能拿多少?
  10. 台式计算机没有外放声音,台式电脑外放无声音怎么办
  11. 维基百科怎么做_维基百科创建修改技巧分享!
  12. 手把手制作前端图标字体
  13. Go语言核心之美 2.5-字符串
  14. Flask入门教程(视频教程笔记)
  15. 人工智能药物设计_用AI革新药物安全
  16. 图像拼接缝融合之加权融合
  17. java web 流媒体播放_实时流(直播流)播放、上墙(大屏播放)解决方案
  18. 新手对于分布式系统的谬误
  19. Quest3d 贴图,反射
  20. web前端知识总结一(HTMl+CSS)

热门文章

  1. 视觉slam中的相机类型
  2. 2021年中国IP改编移动游戏市场收入达1297.7亿元,同比增长4.38%[图]
  3. 利用爬虫获取猫眼电影热门前100数据
  4. 自动保存微信的小视频
  5. HTML怎么制作金字塔,html+css实现分层金字塔的实例
  6. 从零开始搭建个人博客
  7. 计算机开题报告指导教师意见,开题报告指导老师的意见
  8. Spring Boot配置文件的位置和优先级
  9. 使用R读取mtx文件
  10. 如何用bat语句锁定计算机,如何用bat命令重启电脑或关机