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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/3/26 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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, // xSize100, // ySize200, // BytesPerLine16, // BitsPerPixel(unsigned char *)_acniao100, // Pointer to picture dataNULL, // Pointer to paletteGUI_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_EXTMEMHEAPGUI_ALLOC_AssignMemory(HeapMem, GUI_NUMBYTES);#else GUI_ALLOC_AssignMemory(extMem, GUI_NUMBYTES); #endif }

沒用內存管理,直接映射到SDRAM.。
當然,如果配合WM窗口等控件顯示時,則不會有重影現象,如果單獨顯示,還是用的正點原子模板,就要注意一下。

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

如果使用MSB格式:


這個需要注意。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。