STEMWIN开发记录指南

您所在的位置:网站首页 flash中导入图片为什么图片不出现在工作区域 STEMWIN开发记录指南

STEMWIN开发记录指南

2024-02-13 21:38| 来源: 网络整理| 查看: 265

最近想使用emwin用于stm32的GUI界面开发、现在记录一些遇到的问题,以及一些解决、未解决的方法。 不定期更新汇总。 目前开发平台正点原子的STM32F103ZET6,野火的STM32F429

前景描述:想将图片存储在外部存储器,使用板载spi flash。使用Image2LCD将bmp图片转化成bin,然后通过SD更新到flash中 在这里插入图片描述

问题一: 在从外部调用该图片用于显示的过程中,发现一个有趣的事情。 一般emwin显示bmp图片是使用emwin自带工具BmpCvtST.exe生成.C或者流位图(dta)。生成C数组一般类似这样:

extern GUI_CONST_STORAGE GUI_BITMAP bmniao100; static GUI_CONST_STORAGE unsigned short _acniao100[] = {...}; GUI_CONST_STORAGE GUI_BITMAP bmniao100 100, // xSize 100, // ySize 200, // BytesPerLine 16, // BitsPerPixel (unsigned char *)_acniao100, // Pointer to picture data NULL, // Pointer to palette GUI_DRAW_BMP565 }; 然后加载到工程里面,用GUI_DrawBitmap(&bmniao100 , 0, 0);调用即可正常显示。

这种方法加载图片很快,但是遇到图片多的GUI,单片机RAM不够,根本扛不住,只能放在外部存储器。 我在从外部flash调用bin显示的时候发现。 用于F103:

有意思的来了: 使用emwin自带 GUI_ALLOC申请动态内存 /*申请一块内存空间 并且将其清零*/ hMem = GUI_ALLOC_AllocZero(size); /*把申请到内存的句柄转换成指针类型*/ _acBuffer = GUI_ALLOC_h2p(hMem); bindBmpFileData_flash(_acBuffer, (uint8_t *)pName); bitmap.pData = _acBuffer; GUI_DrawBitmap(&bitmap,0,0); GUI_ALLOC_Free(hMem);

显示结果如下: 在这里插入图片描述 看到没有,有重影!!! 如果使用正点原子的mymalloc函数:

_acBuffer = mymalloc(SRAMEX,size); bindBmpFileData_flash_02(_acBuffer, (uint8_t *)pName); bitmap.pData = _acBuffer; GUI_DrawBitmap(&bitmap,0,0); myfree(SRAMEX,_acBuffer);//释放内存

显示如下: 在这里插入图片描述

显示正常。 有点意思。 移植到野火的F429上面,使用GUI自带的 GUI_ALLOC_ 我测试是正常的。 我觉得的问题点是在哪,是在GUIConf.c内存分配方面。原子的内存分配使用如下:

//GUI_X_Config //初始化的时候调用,用来设置emwin所使用的内存 void GUI_X_Config(void) { if(USE_EXRAM) //使用外部RAM { U32 *aMemory = mymalloc(SRAMEX,GUI_NUMBYTES); //从外部SRAM中分配GUI_NUMBYTES字节的内存 GUI_ALLOC_AssignMemory((void*)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块 GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少 GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体 }else //使用内部RAM { U32 *aMemory = mymalloc(SRAMIN,GUI_NUMBYTES); //从内部RAM中分配GUI_NUMBYTES字节的内存 GUI_ALLOC_AssignMemory((U32 *)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存储块 GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存储快数量越少 GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体 } }

使用mymalloc内存管理。 而野火的内存分配

void GUI_X_Config(void) { #ifdef USE_EXTMEMHEAP GUI_ALLOC_AssignMemory(HeapMem, GUI_NUMBYTES); #else GUI_ALLOC_AssignMemory(extMem, GUI_NUMBYTES); #endif }

没用内存管理,直接映射到SDRAM.。 当然,如果配合WM窗口等控件显示时,则不会有重影现象,如果单独显示,还是用的正点原子模板,就要注意一下。

问题二:关于bmp转bin文件格式问题。 使用LSB低位在前,对于emwin,显示是正常的 在这里插入图片描述 在这里插入图片描述

如果使用MSB格式: 在这里插入图片描述 在这里插入图片描述 这个需要注意。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3