另一个是GUIConf.c文件,将emWin的动态内存大小设置为12MB,即下面置红的字体。
复制代码
//
// Define the available number of bytes available for the GUI
//
#define EX_SRAM 1/*1 used extern sram, 0 used internal sram */
#if EX_SRAM
#define GUI_NUMBYTES (1024*1024*12)
#else
#define GUI_NUMBYTES (100*1024)
#endif
/* Define the average block size */
#define GUI_BLOCKSIZE 0x80
修改完毕这几个地方后,就没有问题了,使用的时候选取了仿宋体,大小是10MB,系统上电后将其加载到emWin的动态内存里面,也就是SDRAM里面。
[table=98%]
|
第4步:修改系统堆(heap)大小,这一步非常关键。因为矢量库要用到函数malloc和free,而这种函数是从系统堆空间里面申请内存的,鉴于矢量库非常的消耗动态内存,这里将16MB SDRAM的最后1MB空间给系统堆使用,IAR中设置堆使用外部空间比MDK要麻烦些,需要修改本章节配套例程路径\Project\EWARMv7里面的文件stm32f4xx_flash.icf,内容如下(红色字体部分是新添加的或者被修改的):
复制代码
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x081FFFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x0400;
define symbol __ICFEDIT_size_heap__ = 0x100000;
/**** End of ICF editor section. ###ICF###*/
define symbol __region_RAM1_start__ = 0x10000000;
define symbol __region_RAM1_end__ = 0x1000FFFF;
define symbol __region_RAM2_start__ = 0xC0F00000;
define symbol __region_RAM2_end__ = 0xC0FFFFFF;
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define region RAM1_region = mem:[from __region_RAM1_start__ to __region_RAM1_end__];
define region RAM2_region = mem:[from __region_RAM2_start__ to __region_RAM2_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly };
place in RAM_region { readwrite, block CSTACK};
place in RAM1_region { section .sram };
place in RAM2_region { section .sram, block HEAP };
[table=98%]
|
define symbol __ICFEDIT_size_heap__ = 0x100000;
重新设置堆空间大小是1MB。
define symbol __region_RAM2_start__ =0xC0F00000;
define symbol__region_RAM2_end__ = 0xC0FFFFFF;
添加的RAM2的起始地址和结束地址定义,
__region_RAM2_start__:表示堆起始地址为0XC0F00000,即16MB SDRAM最后1MB空间的起始地址。
__region_RAM2_end__ : 堆结束地址0XC0FFFFFF,即16MBSDRAM最后1MB空间的结束地址。
define regionRAM2_region = mem:[from__region_RAM2_start__ to__region_RAM2_end__];
设置新添加RAM2的区间范围。
place in RAM_region { readwrite, block CSTACK};
表示将栈空间放到RAM区域,可读可写。
place in RAM2_region { section .sram, block HEAP };
表示将堆空间放到RAM2区域,可读可写。
[table=98%]
|
通过上面的设置就实现将16MB SDRAM的最后1MB空间给系统堆使用。除了malloc和free要用到堆空间,部分C标准库的其它函数也要用到堆空间,所以一定要及时初始化SDRAM,防止用到堆空间的时候,SDRAM还没有初始化,将导致系统崩溃。当前是将SDRAM的初始化放在了bsp.c文件的bsp_Init函数开始的地方,之前执行的程序都没有用到C标准库,所以可以放在这里。
讲解完这些,还有一点知识要补充的,矢量汉字库是非常大的,稍小点的都得10MB,大点的得20MB,教程配套板子的SDRAM只有16MB,有点捉襟见肘,所以要重新划分下,当前是把前3MB的空间给LCD的显存使用,相关代码不用做任何修改,因为默认的800*480分辨率,RGB565格式的三缓冲大小800*480*2*3 大概是2.19MB(乘以2是因为RGB565格式需要2字节来表示一个像素),小于3MB。中间的12MB用于emWin动态内存,最后1MB用于系统堆空间,这里有两个地方要修改一下,一个是bsp_fmc_sdram.h,修改emWin动态内存的起始地址
复制代码
/*
**********************************************************************************************************
emWin使用
**********************************************************************************************************
*/
/* emWin动态内存首地址 */
#define SDRAM_APP_BUF (EXT_SDRAM_ADDR + 3 * 1024 * 1024
[table=98%]
|
另一个是GUIConf.c文件,将emWin的动态内存大小设置为12MB,即下面置红的字体。
复制代码
//
// Define the available number of bytes available for the GUI
//
#define EX_SRAM 1/*1 used extern sram, 0 used internal sram */
#if EX_SRAM
#define GUI_NUMBYTES (1024*1024*12)
#else
#define GUI_NUMBYTES (100*1024)
#endif
/* Define the average block size */
#define GUI_BLOCKSIZE 0x80
修改完毕这几个地方后,就没有问题了,使用的时候选取了仿宋体,大小是10MB,系统上电后将其加载到emWin的动态内存里面,也就是SDRAM里面
[table=98%]
|
28.5 矢量字体库的使用方法
矢量字体的使用通过下面四步就可以实现:
第1步:定义16点阵大小,24点阵大小,32点阵大小,48点阵大小,72点阵大小和120点阵大小的格式字体。
复制代码
/*
*********************************************************************************************************
* 定义矢量字体
*********************************************************************************************************
*/
GUI_TTF_CS Cs0, Cs1, Cs2, Cs3, Cs4, Cs5;
GUI_TTF_DATA Data;
GUI_FONT Font16, Font24, Font32, Font48, Font72, Font120; |