|

楼主 |
发表于 2017-11-8 21:02:42
|
显示全部楼层
回 eric2013 的帖子
eric2013:
不是的,这样使用的话,属于用法错误了。你要先绘制到存储设备里面,然后才可以调用存储设备的API函数进行显示。
另外,你将你的程序中三缓冲使能函数注释掉,如果开启了窗口使用存储设备函数,也将其注释掉。然后测试,看看是否有问题。  回头又想了一下,觉得很奇怪,为何会死在GUI_JPEG_Draw函数内
我现在是这样操作的:
GUI_HMEM _ShowJpg(const char *sFilename, int px, int py)
{
GUI_HMEM PicMem;
GUI_MEMDEV_Handle hMEMjpg;
GUI_JPEG_INFO JpegInfo;
if(GetAlocMem(sFilename,PicMem)) //将SD卡jpg文件加载至内存
{
GUI_JPEG_GetInfo(_acBuffer,flist.fsize,&JpegInfo); //获取图片的尺寸
hMEMjpg = GUI_MEMDEV_CreateEx(0,0,JpegInfo.XSize,JpegInfo.YSize,GUI_MEMDEV_HASTRANS); //创建内存设备
GUI_MEMDEV_Select(hMEMjpg); //激活(手册上说的)
GUI_JPEG_Draw(_acBuffer,flist.fsize,0,0); //绘制图像
GUI_MEMDEV_CopyToLCDAt(hMEMjpg,px,py); //显示
GUI_MEMDEV_Delete(hMEMjpg); //释放内存
}
GUI_ALLOC_Free(PicMem); //释放动态内存
f_close(&flist); //关闭文件,flist是全局变量
return hMEMjpg;
}
这里应该是先绘制进存储设备吧?
对于GUI_MEMDEV_Selec(0)函数,是激活LCD,但是不明白,向新申请的存储设备绘制图像,完成后使用该函数,而后是否要释放存储设备?还有,我这里先前也是这个用法,不是死机就是不显示。
另外,是否该函数表明申请存储设备时,EMWIN已经将已存在的LCD图像拷贝进存储设备了,否则会有现有图像(背景)不显示。
我也怀疑配置有问题,今天也仔细核对,没有发现问题。
相关配置如下:
#define emWin_Optimize 0
//
// Physical display size
//
#define XSIZE_PHYS 800
#define YSIZE_PHYS 480 //根据实际屏的像素尺寸定义
/* 2. 多缓冲 / 虚拟屏,多缓冲和虚拟屏不可同时大于1使用,emWin不支持 */
#define NUM_BUFFERS 2 /* 定义多缓冲个数,仅可以设置1,2和3,也就是最大支持三缓冲 */
#define NUM_VSCREENS 1 /* 定义虚拟屏个数 */
/* 3. 没有图层激活时,背景色设置, 暂时未用到 */
#define BK_COLOR GUI_DARKBLUE
/*
4. 重定义图层数,对于STM32F429/439,用户可以选择一个图层或者两个图层,不支持三图层
(1). 设置GUI_NUM_LAYERS = 1时,即仅使用图层1,默认触摸值是发送给图层1的。
(2). 设置GUI_NUM_LAYERS = 2时,即图层1和图层2都已经使能,此时图层2是顶层,
用户需要根据自己的使用情况设置如下两个地方。
a. 需要将触摸数据发送给图层2
b. 调用GUI_Init函数后,调用函数GUI_SelectLayer(1), 设置当前操作的是图层2。
*/
#undef GUI_NUM_LAYERS
#define GUI_NUM_LAYERS 1
#define COLOR_MODE_0 _CM_RGB565 //定义为_CM_ARGB8888时,大图像显示不正常,貌似LTDC显存地址配置错误,且解码后的颜色格式有问题
GUIConf配置如下:
#define USE_EXRAM 1 //使用外部存储器则配置位1
#if USE_EXRAM
#define GUI_NUMBYTES (1024*1024*8) //使用外部存储器,此处需根据实际情况修改
#else
#define GUI_NUMBYTES (100*1024) //使用芯片内部RAM
#endif
#define GUI_BLOCKSIZE 0x200 //定义emWin使用的存储块的平均尺寸
void GUI_X_Config(void) {
#if USE_EXRAM
static U32 *aMemory;
aMemory = (U32*)(SDRAM_BANK_ADDR+8*1024*1024); //使用外部存储器时需要定义该缓冲地址
/* Assign memroy to emWin */
GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES); //配置STemWIN使用的存储区及大小
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //配置存储块的平均尺寸
#else
/* 32 bit aligned memory area */
static U32 aMemory[GUI_NUMBYTES / 4];
/* Assign memroy to emWin */
GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
#endif
/* Set default font */
GUI_SetDefaultFont(GUI_FONT_6X8);
} |
|