分享我的STM32刷图测试代码:STM32F103+SDIO+ILI9325 播放60fps视频

2019-12-10 18:10发布

最近看到有网友用NAND flash刷屏,刷到20fps。我想起来原来测试STM32 SDIO读写速度时,有10MB/s的速度。用这个速度放未压缩的视频,可以超过60fps。于是我写个代码试试看效果。

经过测试,不限制速度的话,可以达到72fps。320 x 240 x 2byte/pixel x 72fps = 11,059,200 byte/second。

我用Yadif+Bob产生60fps的视频,转成一张张BMP,然后写程序转成RGB565的,写到SD卡里,最后STM32直接从指定扇区开始读数据到LCD。全程用DMA操作,CPU使用率<1%

拍了一段视频,声音是后来加上去的。拍的视频是30fps的,显得不那么流畅了。实际是非常流畅的。
http://v.youku.com/v_show/id_XNzg3OTQwNDk2.html

代码:
STM32F103_SD2LCD.rar (195.7 KB, 下载次数: 900) 2014-9-22 12:17 上传 点击文件名下载附件

有兴趣的网友可以试试,Keil 和 IAR的工程都有。不过需要根据自己的板子改一下GPIO配置、FSMC地址等。硬件需要用4bit的SDIO模式。还有SD卡要能有10MB/s的读速度,不过一般的卡都有这个速度了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
99条回答
caixiuwen
2019-12-10 21:44
这是我转BMP的代码。把一张张RGB888的BMP转成连续的RGB565数据,并且转90度。这个代码写得比较粗糙。。。供参考

  1. // RGB24toRGB565.cpp
  2. //

  3. #include "stdafx.h"
  4. #include "windows.h"

  5. unsigned char SrcBMP[320 * 240 * 3];
  6. unsigned char DstBMP[240 * 320 * 2];

  7. #define RGB565(r, g, b)                        
  8.                         ((((r) & 0x1f) << 11) |
  9.                         (((g) & 0x3f) << 5)   |
  10.                         (((b) & 0x1f) ))


  11. int _tmain(int argc, _TCHAR* argv[])
  12. {
  13.     HANDLE hSrcFile;
  14.     HANDLE hDstFile;
  15.     DWORD r,g,b;
  16.     unsigned char * SrcPixel;
  17.     DWORD  dwBytesRead, dwBytesWritten, dwPos;
  18.     unsigned short * DstPixel;
  19.     TCHAR SrcFileName[MAX_PATH];

  20.     hDstFile = CreateFile(TEXT("J:\grab_bmp\!output.img"), // open DST file
  21.             GENERIC_WRITE,            // open for writing
  22.             0,                        // do not share
  23.             NULL,                     // no security
  24.             OPEN_ALWAYS,              // open or create
  25.             FILE_ATTRIBUTE_NORMAL,    // normal file
  26.             NULL);                    // no attr. template

  27.     for (int FileIndex = 484; FileIndex <= 6951; FileIndex++)
  28.     {
  29.         _stprintf (SrcFileName, TEXT("J:\grab_bmp\grab%05d.bmp"), FileIndex);

  30.         hSrcFile = CreateFile(SrcFileName,                // open SRC file
  31.                                 GENERIC_READ,             // open for reading
  32.                                 0,                        // do not share
  33.                                 NULL,                     // no security
  34.                                 OPEN_EXISTING,            // existing file only
  35.                                 FILE_ATTRIBUTE_NORMAL,    // normal file
  36.                                 NULL);                    // no attr. template

  37.         if (hSrcFile == INVALID_HANDLE_VALUE)
  38.         {
  39.             printf("Could not open source file.");
  40.             return 0;
  41.         }

  42.         SetFilePointer(hSrcFile, 0x1A, NULL, FILE_BEGIN);
  43.         ReadFile(hSrcFile, SrcBMP, sizeof(SrcBMP), &dwBytesRead, NULL);
  44.         if (dwBytesRead != sizeof(SrcBMP))
  45.         {
  46.             printf("Read file error.");
  47.             return 0;
  48.         }

  49.         CloseHandle(hSrcFile);

  50.         for( int x = 0; x < 240; x++)
  51.         {
  52.             for( int y = 0; y < 320; y++)
  53.             {
  54.                 SrcPixel = SrcBMP + ((319 - y) * 3) + ((239 - x) * 320 * 3);
  55.                 b = SrcPixel[0];
  56.                 g = SrcPixel[1];
  57.                 r = SrcPixel[2];
  58.                 DstPixel = (unsigned short *)(DstBMP + x * 2 + y * 240 * 2);
  59.                 *DstPixel = RGB565(r >> 3, g >> 2, b >> 3);

  60.             }
  61.         }

  62.         WriteFile(hDstFile, DstBMP, sizeof(DstBMP), &dwBytesWritten, NULL);

  63.     }
  64.     CloseHandle(hDstFile);
  65.     return 0;
  66. }
复制代码

一周热门 更多>