你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

速度刷大图的3种方法分享(f429,f469已经测试) 精华  

[复制链接]
sun-2034138 提问时间:2016-9-23 13:32 /
  现在手头有两个开发板一个是f429的一个是f469的(都是800*480的分辨率,所以程序很针对)。这两种开发板都是带有屏幕控制器的,于是我就试着操练一下。发现如果用stemwin读取bmp文件刷图的是一帧一帧的。就算开启存储设备也是很纠结。
  之后参考了官方的flash烧写法。发现也是不适合我的项目应用。官方的是把bmp文件转换成.C文件之后用编译器编译后烧进flash,如果flash比较大还好说,如果flash小你就完蛋了。例如一张800*480的565bmp就要1.5m。关键是我要存这种图片100多张啊。。。
  所以我的办法是把这些图片放在sd卡中。一张512的sd卡才10块钱足够放几百张了。而且还有音频文件和视频文件。更重要的是sdio真的快。

11.jpg

评分

参与人数 2 ST金币 +11 收起 理由
NASA + 1
zero99 + 10

查看全部评分

1 收藏 9 评论42 发布时间:2016-9-23 13:32

举报

42个回答
sun-2034138 回答时间:2016-9-26 02:14:55
最后提一下这个东西。有人会问为什么  不用这个函数LCD_SetDevFunc。其实说了也很纠结,因为读出.bmp在window的控件里面是不卡的,但是如果你调用GUI_BMP_Draw去显示bmp或者其他什么的类型的图片文件就会很卡,可能是因为调用存储机制?反正是为什么lib库你也看不到。我也没有进行深入的探究。但是可以确定的就是你可以通过我说的这几种方法快速的画图。
第一在没有stemwin的情况下。这种方式你可以放很多图片,总比官方的qspi的快。同时也省去你去一点一点去解析bmp文件的时间。一举两得。速度很快的。

第二在有stemwin的情况下你单纯的想绘制bmp。好处是把官方例程本该运行在qspiflash上的代码重新放回芯片内部(官方例程在图片多的时候就是这样做的),也摆脱了flash大小的问题。说实在的你要是飞想放qspiflash也行,用我的方法同样靠谱。程序还是在芯片里面靠谱我个人觉得。

第三使用stemwin的windows下的窗口控件image,好处同二。

其实st的例程把f4f7带加速器的程序更改已经在手册中写出来了,详情看英文版的中文版的没有5.28。就是下面那段程序。但是追求更快肯定没有什么错误。而且我已经在之前说了。我这样做的主要目的是把几百张图放进去。。。其实少的情况下你按照官方的例程走也是没有问题的。
从始至终的思路是没有问题的,首先不要解析,其次放进内存,之后显示。


    /* Set custom functions for several operations */
    LCD_SetDevFunc(i, LCD_DEVFUNC_COPYBUFFER, (void(*)(void))LCD_LL_CopyBuffer);
    LCD_SetDevFunc(i, LCD_DEVFUNC_COPYRECT,   (void(*)(void))LCD_LL_CopyRect);

    /* Filling via DMA2D does only work with 16bpp or more */
    LCD_SetDevFunc(i, LCD_DEVFUNC_FILLRECT, (void(*)(void))LCD_LL_FillRect);
    LCD_SetDevFunc(i, LCD_DEVFUNC_DRAWBMP_8BPP, (void(*)(void))LCD_LL_DrawBitmap8bpp);
    LCD_SetDevFunc(i, LCD_DEVFUNC_DRAWBMP_16BPP, (void(*)(void))LCD_LL_DrawBitmap16bpp);  
    LCD_SetDevFunc(i, LCD_DEVFUNC_DRAWBMP_32BPP, (void(*)(void))LCD_LL_DrawBitmap32bpp);

    /* Set VRAM address */
    LCD_SetVRAMAddrEx(i, (void *)(layer_prop.address));




        GUICC_M4444I_SetCustColorConv(Color2IndexBulk_M4444IDMA2D,Index2ColorBulk_M4444IDMA2D);
        GUICC_M888_SetCustColorConv(Color2IndexBulk_M888DMA2D,Index2ColorBulk_M888DMA2D);   
        GUICC_M8888I_SetCustColorConv(Color2IndexBulk_M8888IDMA2D,Index2ColorBulk_M8888IDMA2D);
        GUI_SetFuncAlphaBlending(DMA2D_AlphaBlending);                                            
        GUI_SetFuncGetpPalConvTable(_LCD_GetpPalConvTable);
        GUI_SetFuncMixColors(DMA2D_MixColors);
        GUI_SetFuncMixColorsBulk(LCD_MixColorsBulk);

sun-2034138 回答时间:2016-9-23 13:32:22
本帖最后由 sun-2034138 于 2016-9-23 13:33 编辑

  之后把你需要的这些文件放到sd卡中,前提是你必须做好内存管理和内存管理。之后就可以进行第二步了。也就是显示了。先说下不带操作系统不带stemwin的显示方式。
  这样就要使能ltdc和dma2d了。因为ltdc的双层显示是需要一定的内存的,所以在做内存管理时一定要注意要把内存管理的起始地址找好,留好ltdc所需要的内存。

__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0XC0200000)));这个是我在f469discovery里面定义的,这块开发板的sdram是8m,分两兆给ltdc,这样你就只剩下6m了,之后我又在后面为stemwin预留了3兆,所以你真正可用的内存不到3m。所以要记得内存溢出的问题。
  内存做好了这样就可以读文件了,用fatfa直接读出你所要显示的文件。
  就这样。。。
2.png
sun-2034138 回答时间:2016-9-23 13:32:30
另外就是我还在研究第三种方法就是用guibuilder显示图片。但是guibuilder遇到一些问题。在我转换大图的时候会直接死掉。。。所以我不知道它的图片格式的头,没有办法进行替换。builder转换的头并不是bmpcvt.exe转换的那种格式。它有自己的格式,而且它属于窗口挂饰。如果那位朋友有解决方案或者知道怎么用guibuilder转换,或者guibuilder的image转换过后的格式。请大家帮助一下。在此谢过大家了。
sun-2034138 回答时间:2016-9-23 13:32:21
本帖最后由 sun-2034138 于 2016-9-23 12:42 编辑

现在的思路是在外部解析好你所需要的图片的,节省mcu解析的时间。之后存成一个后缀为bmp的文件。这个bmp不同于正常的bmp它没有头,是一个纯的hex文件只不过后缀让我叫bmp。。。 是名bmp,又非bmp,又名bmp。。。下面两张截图是我用java写的小插件,用法很简单就是把bmp文件解析为565或者argb8888的纯hex文件。按照ltdc的dma2d控制器的读取数据方式放好。
4.png
1.png
sun-2034138 回答时间:2016-9-23 13:32:23
之后我在前面定义了这种东西,这是应对argb8888的显示和rgb565的文件做不同的测试。先说句题外话就是用f469或者f429显示argb8888的尺寸为800*480的图片会闪屏的。降低ltdc的频率就应该能好一些不过我没有试。反正当时做也就是为了玩一玩才试的argb。
3.png
sun-2034138 回答时间:2016-9-23 13:32:24
如果是用f469dicovery就直接用LCDConf_stm32469i_discovery.c中的提供的函数就好。因为f469discovery用的是ltdc驱动otm8009来做的,所以直接用它的就好不用考虑其它。如果是直接接的天马,群创的液晶屏那就直接写一下加速器dma2d的程序就好。
5.png
sun-2034138 回答时间:2016-9-23 13:32:25
楼上那张图是刷565的bmp的这层的是刷argb8888双层显示的
6.png
sun-2034138 回答时间:2016-9-23 13:32:26
至此第一种方式介绍完毕。开始第二种方式。如果想用stemwin显示bmp那刷图又觉得慢怎么搞呢,不用你转.C文件一招教你搞定。
sun-2034138 回答时间:2016-9-23 13:32:27
同样需要我写的java小插件把文件转换过后存在sd中,这种转换过程要比stemwin的转换快的多。转换过后还是这样。。。
2.png
sun-2034138 回答时间:2016-9-23 13:32:28
之后建立一个这样的结构体。记得调整里面的参数。
7.png
sun-2034138 回答时间:2016-9-23 13:32:29
最后使用drawbitmao就可以了。就这样图片就在你的屏幕上显示了而且速度很快。在此需要注意的是你要记得你的内存能存几张图片避免溢出,还有就是如果图片比较多的时候要注意存到sdram中的时间可能会有延迟。
8.png
sun-2034138 回答时间:2016-9-23 13:32:31
麻烦大神了 谁给点提示啊
Inc_brza 回答时间:2016-9-23 18:02:58
xmodem-1k,直接传输,直接烧flash
zbber 回答时间:2016-9-23 19:13:56
楼上那张图是刷565的bmp的这层的是刷argb8888双层显示的
sun-2034138 回答时间:2016-9-23 19:51:00
zbber 发表于 2016-9-23 19:13
楼上那张图是刷565的bmp的这层的是刷argb8888双层显示的

怎么了
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版