日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/3/26 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STEMWIN开发记录指南—-从外部flash显示图片 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近想使用emwin用于stm32的GUI界面開發(fā)、現(xiàn)在記錄一些遇到的問題,以及一些解決、未解決的方法。
不定期更新匯總。
目前開發(fā)平臺(tái)正點(diǎn)原子的STM32F103ZET6,野火的STM32F429

前景描述:想將圖片存儲(chǔ)在外部存儲(chǔ)器,使用板載spi flash。使用Image2LCD將bmp圖片轉(zhuǎn)化成bin,然后通過SD更新到flash中

問題一:
在從外部調(diào)用該圖片用于顯示的過程中,發(fā)現(xiàn)一個(gè)有趣的事情。
一般emwin顯示bmp圖片是使用emwin自帶工具BmpCvtST.exe生成.C或者流位圖(dta)。生成C數(shù)組一般類似這樣:

extern GUI_CONST_STORAGE GUI_BITMAP bmniao100;static GUI_CONST_STORAGE unsigned short _acniao100[] = {...};GUI_CONST_STORAGE GUI_BITMAP bmniao100 100, // xSize100, // ySize200, // BytesPerLine16, // BitsPerPixel(unsigned char *)_acniao100, // Pointer to picture dataNULL, // Pointer to paletteGUI_DRAW_BMP565 };然后加載到工程里面,用GUI_DrawBitmap(&bmniao100 , 0, 0);調(diào)用即可正常顯示。

這種方法加載圖片很快,但是遇到圖片多的GUI,單片機(jī)RAM不夠,根本扛不住,只能放在外部存儲(chǔ)器。
我在從外部flash調(diào)用bin顯示的時(shí)候發(fā)現(xiàn)。
用于F103:

有意思的來了: 使用emwin自帶 GUI_ALLOC申請動(dòng)態(tài)內(nèi)存 /*申請一塊內(nèi)存空間 并且將其清零*/ hMem = GUI_ALLOC_AllocZero(size); /*把申請到內(nèi)存的句柄轉(zhuǎn)換成指針類型*/ _acBuffer = GUI_ALLOC_h2p(hMem); bindBmpFileData_flash(_acBuffer, (uint8_t *)pName); bitmap.pData = _acBuffer; GUI_DrawBitmap(&bitmap,0,0); GUI_ALLOC_Free(hMem);

顯示結(jié)果如下:

看到?jīng)]有,有重影!!!
如果使用正點(diǎn)原子的mymalloc函數(shù):

_acBuffer = mymalloc(SRAMEX,size); bindBmpFileData_flash_02(_acBuffer, (uint8_t *)pName); bitmap.pData = _acBuffer; GUI_DrawBitmap(&bitmap,0,0); myfree(SRAMEX,_acBuffer);//釋放內(nèi)存

顯示如下:

顯示正常。
有點(diǎn)意思。
移植到野火的F429上面,使用GUI自帶的 GUI_ALLOC_ 我測試是正常的。
我覺得的問題點(diǎn)是在哪,是在GUIConf.c內(nèi)存分配方面。原子的內(nèi)存分配使用如下:

//GUI_X_Config //初始化的時(shí)候調(diào)用,用來設(shè)置emwin所使用的內(nèi)存 void GUI_X_Config(void) {if(USE_EXRAM) //使用外部RAM{U32 *aMemory = mymalloc(SRAMEX,GUI_NUMBYTES); //從外部SRAM中分配GUI_NUMBYTES字節(jié)的內(nèi)存GUI_ALLOC_AssignMemory((void*)aMemory, GUI_NUMBYTES); //為存儲(chǔ)管理系統(tǒng)分配一個(gè)存儲(chǔ)塊GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //設(shè)置存儲(chǔ)快的平均尺寸,該區(qū)越大,可用的存儲(chǔ)快數(shù)量越少GUI_SetDefaultFont(GUI_FONT_6X8); //設(shè)置默認(rèn)字體}else //使用內(nèi)部RAM{U32 *aMemory = mymalloc(SRAMIN,GUI_NUMBYTES); //從內(nèi)部RAM中分配GUI_NUMBYTES字節(jié)的內(nèi)存GUI_ALLOC_AssignMemory((U32 *)aMemory, GUI_NUMBYTES); //為存儲(chǔ)管理系統(tǒng)分配一個(gè)存儲(chǔ)塊GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //設(shè)置存儲(chǔ)快的平均尺寸,該區(qū)越大,可用的存儲(chǔ)快數(shù)量越少GUI_SetDefaultFont(GUI_FONT_6X8); //設(shè)置默認(rèn)字體} }

使用mymalloc內(nèi)存管理。
而野火的內(nèi)存分配

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

沒用內(nèi)存管理,直接映射到SDRAM.。
當(dāng)然,如果配合WM窗口等控件顯示時(shí),則不會(huì)有重影現(xiàn)象,如果單獨(dú)顯示,還是用的正點(diǎn)原子模板,就要注意一下。

問題二:關(guān)于bmp轉(zhuǎn)bin文件格式問題。
使用LSB低位在前,對于emwin,顯示是正常的

如果使用MSB格式:


這個(gè)需要注意。

總結(jié)

以上是生活随笔為你收集整理的STEMWIN开发记录指南—-从外部flash显示图片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。