STEMWIN开发记录指南—-从外部flash显示图片

最近想使用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格式:
在这里插入图片描述
在这里插入图片描述
这个需要注意。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Terry.Z_1009

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值