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

速度刷大图的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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版