【第3版emWin教程】第30章 emWin6.x的SIF格式全字库生成和使用方法(Unicode编码,QSPI Flash方案)
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429
第30章 emWin6.x的SIF格式全字库生成和使用方法(Unicode编码,QSPI Flash方案)
本章节为大家讲解SIF格式全字库的生成和使用方法。显示效果上跟XBF格式字库没有区别,显示速度比使用XBF格式字体稍快,存储方式上面有区别,XBF格式字体是可以存储到任何存储介质里面的,而SIF格式的字库仅可以存储到总线方式寻址的存储介质中,比如SDRAM,SRAM,内存映射方式的QSPI Flash等。
30.1 初学者重要提示
30.2 下载算法存放位置(操作前必看)
30.3 SIF格式字体生成方法
30.4 SIF格式字体使用方法
30.5 内部Flash和QSPI Flash程序调试下载配置(重要必看)
30.6 实验例程说明(RTOS)
30.7 实验例程说明(裸机)
30.8 总结
30.1 初学者重要提示
1、 字体小工具需要使用此贴提供的,其它大部分是Demo版本:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=107218 。
2、 SIF格式字体适合用于总线方式寻址的存储设备中,比如SDRAM,SRAM,并口NOR Flash,内存映射方式的QSPI Flash等,如果内部Flash或者SRAM的空间够,存储到内部也是没有问题的。相比XBF格式字体的优势就是速度稍快点,因为是总线方式读取。虽然XBF格式的字体也可以存储到总线方式寻址的存储器中,但是由于XBF格式字体读取的时候要有一个专门的回调函数去处理,要耽误些时间,所以要稍慢些。根据官方的意思,如果是总线接口方式寻址的存储设备,推荐使用SIF格式字体,如果是SPI Flash,SD卡,NAND Flash等,推荐使用XBF格式字体。
(对于初学者要特别解释下,NOR Flash写入数据是需要发送命令的,而读取的时候却可以跟SRAM一样,直接从总线地址读取即可,所以可以使用SIF格式字体,而NAND Flash虽然也是接到FMC或者FSMC总线接口上的,但是通信却是类似串行方式,读写都需要命名,所以仅适合使用XBF格式字体)
3、 emWin官方提供的字体生成软件FontCvt不支持GB编码,所以只能使用FontCvt支持的Unicode编码。
4、 STM32H7花式玩转QSPI Flash相关章节都已经发布:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=101064 。
这里强烈推荐看:第83章 STM32H7 的内部 Flash 和 QSPI Flash都运行程序的混合方式(强烈推荐)。
5、 下载本章节相关例子前,务必先添加好QSPI Flash的下载算法。本章使用的方法支持内部Flash和外部QSPI Flash可以同时下载,同时仿真。 如此以来,大家可以方便的将流位图存到外部QSPI Flash,简单易用,大大方便大家项目实战。
6、 教程中让大家将要显示汉字的C文件转换为UTF-8编码,指的是将这个汉字所在的C文件转换为UTF-8编码,这点要切记,详情请看28.4小节的说明。
另外特别注意MDK5编译错误missing closing quote,解决办法看本章教程28章的第28.6.2小节。
7、 SIF格式所有API函数在emWin手册中都有讲解,下图是中文版手册里面API函数的位置
下图是英文版手册里面API函数的位置:
30.2 下载算法存放位置(操作前必看)
(注:例子下载地址 http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 )
编译例子:V7-060_QSPI Flash的MDK下载算法制作,生成的算法文件位于此路径下:
生成算法文件后,需要大家将其存到到MDK安装目录,有两个位置可以存放,任选其一,推荐第2种:
- 第1种:存放到MDK的STM32H7软包安装目录里面:\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软包版本不同,数值2.6.0不同)。
- 第2种:MDK的安装目录 \ARM\Flash里面。
30.3 SIF格式字体生成方法
下面以生成16点阵,宋体为例来说明使用FontCvt生成SIF格式字体的方法。
1、 第1步:打开字体生成软件FontCvt,选择字体类型Standard,编码选择16bit Unicode。
点击OK后,弹出如下窗口:
再点击确定后弹出FontCvt界面变成如下效果:
2、 第2步:点击File->Save As
弹出如下窗口:
生成字体的过程中,左下角会有一个Unicode编码值从0x0000开始递增的过程,转换结束后显示Ready。
此时桌面就有生成的SIF格式字库了。如果要生成的点阵字体比较大,此过程比较慢。本次转换生成的文件如下:
同样的方法再生成24点阵带2倍抗锯齿的宋体,使用FontCvt创建的时候字体类型选择此选项:
(注,抗锯齿部分选择Using OS表示生成的抗锯齿字体显示效果与电脑端应用程序显示效果是一样的,如果选择的是Internal,表示使用FontCvt软件生成抗锯齿字体,对于比例字体来说,使用此选项点阵更准确些。实际应用中,用户可以根据显示效果选择一个合适的即可。)
生成的字体文件如下:
本章节配套的例子把这两种生成的字体都进行了测试。
30.4 SIF格式字体使用方法
SIF格式字体的使用通过下面四步就可以实现:
1、 第1步:定义16点阵,24点阵带2倍抗锯齿效果的SIF格式字体
/* ********************************************************************************************************* * SIF字体定义 ********************************************************************************************************* */ GUI_FONT SIF_AA2_Font24; GUI_FONT SIF_Font16;
使用FontCvt生成了几种字体就需要定义几个。
2、 第2步:加载并创建16点阵,24点阵带2倍抗锯齿效果的SIF格式字体
/* ********************************************************************************************************* * 函 数 名: MainTask * 功能说明: GUI主函数 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void MainTask(void) { uint8_t *_acBufferFont16; uint8_t *_acBufferFont24; /* 此处省略未写 */ /* 创建SIF格式字体,16点阵宋体*/ GUI_SIF_CreateFont(_acSong16, &SIF_Font16, GUI_SIF_TYPE_PROP); /* 创建SIF格式字体,24点阵宋体*/ GUI_SIF_CreateFont(_acSong24, &SIF_AA2_Font24, GUI_SIF_TYPE_PROP_AA2); /* 调用此函数会自动的刷新桌面窗口 */ WM_SetDesktopColor(GUI_BLUE); /* 创建对话框 */ GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0); /* 此处省略未写 */ }
其中,创建SIF字体要用到函数:GUI_SIF_CreateFont,关于这个函数有必要说说,函数的原型如下:
void GUI_SIF_CreateFont(void * pFontData, GUI_FONT * pFont, const GUI_SIF_TYPE * pFontType);
- 第1个参数填写SIF字体的首地址,注意,一定要是总线地址,非总线方式不支持。
- 第2个参数填写第1步中定义的SIF字体变量。
- 第3个参数要特别注意,参数类型一定要跟FontCvt创建时的字体类型对应。此参数有以下五种类型。
GUI_SIF_TYPE_PROP
GUI_SIF_TYPE_PROP_AA2
GUI_SIF_TYPE_PROP_AA4
GUI_SIF_TYPE_PROP_EXT
GUI_SIF_TYPE_PROP_FRM
GUI_SIF_TYPE_PROP_AA2_EXT
GUI_SIF_TYPE_PROP_AA4_EXT
而FontCvt创建的时候有以下七种类型:
对应关系是
GUI_SIF_TYPE_PROP = Standard
GUI_SIF_TYPE_PROP_AA2 = Antialiased 2bpp
GUI_SIF_TYPE_PROP_AA4 = Antialiased 2bpp
GUI_SIF_TYPE_PROP_EXT = Extended
GUI_SIF_TYPE_PROP_FRM = Extended,framed
GUI_SIF_TYPE_PROP_AA2_EXT = Extended,antialiased,2bpp
GUI_SIF_TYPE_PROP_AA4_EXT = Extended,antialiased,4bpp
初学者使用的时候,一定要注意这个问题。FontCvt创建时用的哪种字体类型,实际使用时就必须使用哪种类型。
3、 第3步:加载到emWin动态内存并创建了SIF字体后,使用就比较简单了。
用户只需调用函数GUI_UC_SetEncodeUTF8()使能UTF-8编码就可以使用SIF格式的字体了,比如设置按钮的字体,调用如下设置函数即可。
BUTTON_SetFont(hWin, &SIF_Font16); /* hWin是按钮的句柄 */
4、 第4步:最后一步切不可忘记设置汉字显示所在源文件的编码类型,具体MDK和IAR的设置方法请看第28章的28.4小节(本章节配套的例子也是设置的MainTask,c文件),这一步绝对不可以省略。
通过以上四步就实现SIF格式字体的显示了。
30.5 内部Flash和QSPI Flash程序调试下载配置(重要必看)
将下面两个地方配置后,就可以像使用内部Flash一样使用QSPI Flash进行调试了。并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。
30.5.1 将字库文件转换为C数组格式文件
为了方便将bin文件添加到MDK工程中,我们这里使用小软件B2C.exe将其转换为C格式文件(此软件已经放到本章配套例子V7-536_emWin6.x实验_SIF格式全字库生成和使用方法(QSPI Flash RTOS)的Doc文件里面。
转换后生成的文件命名为Song16.c:
const unsigned char _acSong16[1260624UL + 1] = { 0x47, 0x55, 0x49, 0x50, 0x10, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x0B, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x7F, 0x00, 0xA0, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x01, 0x13, 0x01, 0x13, 0x01, 0x1B, 0x01, 0x1B, 0x01, 0x2B, 0x01, 0x2B, 0x01, 0x44, 0x01, 0x44, 0x01, 0x48, 0x01, 0x48, 省略未写 }
30.5.2 设置字库文件到外部QSPI Flash。
下面将流位图文件下载到QSPI Flash,需要大家先在这里添加QSPI Flash地址范围:
然后设置资源文件到外部QSPI Flash:鼠标右击文件分组GUI/Font,选择Options。
30.5.3 下载配置
注意这里一定要够大,否则会提示算法文件无法加载:
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。推荐使用AXI SRAM(地址0x24000000),因为这块RAM空间足够大。
如果要下载程序到内部Flash和外部QSPI Flash里面,需要做如下配置,两个下载算法都要添加进来:
30.5.4 调试配置
注意这里一定要够大,否则会提示算法文件无法加载:
我们这里是将其加到DTCM中,即首地址为0x20000000,大家也可以存储到任意其它RAM地址,只要空间还够加载算法文件即可。
如果要做调试下载,需要做如下配置:
30.6 实验例程说明(RTOS)
配套例子:
V7-536_emWin6.x实验_SIF格式全字库生成和使用方法(QSPI Flash RTOS)
实验目的:
- 学习emWin的的SIF格式全字库的生成和使用方法,Unicode编码
- emWin功能的实现在MainTask.c文件里面。
实验内容:
1、K1按键按下,串口或者RTT打印任务执行情况(串口波特率115200,数据位8,奇偶校验位无,停止位1)。
2、(1) 凡是用到printf函数的全部通过函数App_Printf实现。
(2) App_Printf函数做了信号量的互斥操作,解决资源共享问题。
3、默认上电是通过串口打印信息,如果使用RTT打印信息:
MDK AC5,MDK AC6或IAR通过使能bsp.h文件中的宏定义为1即可
#define Enable_RTTViewer 1
4、各个任务实现的功能如下:
App Task Start 任务 :启动任务,这里用作BSP驱动包处理。
App Task MspPro任务 :消息处理,这里用作LED闪烁。
App Task UserIF 任务 :按键消息处理。
App Task COM 任务 :暂未使用。
App Task GUI 任务 :GUI任务。
μCOS-III任务调试信息(按K1按键,串口打印):
RTT 打印信息方式:
程序设计:
任务栈大小分配:
μCOS-III任务栈大小在app_cfg.h文件中配置:
#define APP_CFG_TASK_START_STK_SIZE 512u
#define APP_CFG_TASK_MsgPro_STK_SIZE 2048u
#define APP_CFG_TASK_COM_STK_SIZE 512u
#define APP_CFG_TASK_USER_IF_STK_SIZE 512u
#define APP_CFG_TASK_GUI_STK_SIZE 2048u
任务栈大小的单位是4字节,那么每个任务的栈大小如下:
App Task Start 任务 :2048字节。
App Task MspPro任务 :8192字节。
App Task UserIF 任务 :2048字节。
App Task COM 任务 :2048字节。
App Task GUI 任务 :8192字节。
系统栈大小分配:
μCOS-III的系统栈大小在os_cfg_app.h文件中配置:
#define OS_CFG_ISR_STK_SIZE 512u
系统栈大小的单位是4字节,那么这里就是配置系统栈大小为2KB
emWin动态内存配置:
GUIConf.c文件中的配置如下:
#define EX_SRAM 1/*1 used extern sram, 0 used internal sram */ #if EX_SRAM #define GUI_NUMBYTES (1024*1024*24) #else #define GUI_NUMBYTES (100*1024) #endif
通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:
#define EX_SRAM 1 表示使用外部SDRAM作为emWin动态内存,大小24MB。
#define EX_SRAM 0 表示使用内部SRAM作为emWin动态内存,大小100KB。
默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。
emWin界面显示效果:
800*480分辨率界面效果。
30.7 实验例程说明(裸机)
配套例子:
V7-535_emWin6.x实验_SIF格式全字库生成和使用方法(QSPI Flash 裸机)
实验目的:
- 学习emWin的的SIF格式全字库的生成和使用方法,Unicode编码
- emWin功能的实现在MainTask.c文件里面。
emWin界面显示效果:
800*480分辨率界面效果。
emWin动态内存配置:
GUIConf.c文件中的配置如下:
#define EX_SRAM 1/*1 used extern sram, 0 used internal sram */ #if EX_SRAM #define GUI_NUMBYTES (1024*1024*24) #else #define GUI_NUMBYTES (100*1024) #endif
通过宏定义来配置使用内部SRAM还是外部的SDRAM做为emWin的动态内存,当配置:
#define EX_SRAM 1 表示使用外部SDRAM作为emWin动态内存,大小24MB。
#define EX_SRAM 0 表示使用内部SRAM作为emWin动态内存,大小100KB。
默认情况下,本教程配套的所有emWin例子都是用外部SDRAM作为emWin动态内存。
30.8 总结
本章节为大家讲解的SIF格式字体是可以用于项目实战的,望初学者务必掌握。另外,SIF格式字体仅可以用于总线方式寻址的存储器中,比如SDRAM,SRAM,内存映射方式的QSPI Flash等。如果芯片内部SRAM或者Flash空间够大,也可以存储到内部SRAM或者Flash里面。