最近想使用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格式:
这个需要注意。