硬汉嵌入式论坛

 找回密码
 立即注册
查看: 339|回复: 5
收起左侧

[JPEG] STM32H7B芯片JPEG硬解以及DMA2D转换的问题

[复制链接]

5

主题

24

回帖

39

积分

新手上路

积分
39
发表于 2024-1-31 14:23:07 | 显示全部楼层 |阅读模式
我想使用STM32H7B0进行JPEG图片的硬解,然后通过DMA2D将格式转为RGB565,缓存是初始化一个数组存储,然后使用SPI通讯ST7789芯片的显示屏传输缓存,显示图片。
现在已经硬解完成了,卡在DMA2D格式转为RGB565这一步,想问问这个的路线可以实现吗?


static void DMA2D_CopyBuffer(uint32_t *pSrc, uint32_t *pDst, uint16_t x, uint16_t y, uint16_t xsize, uint16_t ysize, uint32_t ChromaSampling)
{   
  
  uint32_t cssMode = DMA2D_CSS_420, inputLineOffset = 0;  
  uint32_t destination = 0;
  
  if(ChromaSampling == JPEG_420_SUBSAMPLING)
  {
    cssMode = DMA2D_CSS_420;
   
    inputLineOffset = xsize % 16;
    if(inputLineOffset != 0)
    {
      inputLineOffset = 16 - inputLineOffset;
    }   
  }
  else if(ChromaSampling == JPEG_444_SUBSAMPLING)
  {
    cssMode = DMA2D_NO_CSS;
   
    inputLineOffset = xsize % 8;
    if(inputLineOffset != 0)
    {
      inputLineOffset = 8 - inputLineOffset;
    }   
  }
  else if(ChromaSampling == JPEG_422_SUBSAMPLING)
  {
    cssMode = DMA2D_CSS_422;
   
    inputLineOffset = xsize % 16;
    if(inputLineOffset != 0)
    {
      inputLineOffset = 16 - inputLineOffset;
    }      
  }  
  
  /*##-1- Configure the DMA2D Mode, Color Mode and output offset #############*/
  DMA2D_Handle.Init.Mode         = DMA2D_M2M;
  DMA2D_Handle.Init.ColorMode    = DMA2D_OUTPUT_RGB565;
  DMA2D_Handle.Init.OutputOffset = 240 - xsize;
  DMA2D_Handle.Init.AlphaInverted = DMA2D_REGULAR_ALPHA;  /* No Output Alpha Inversion*/  
  DMA2D_Handle.Init.RedBlueSwap   = DMA2D_RB_REGULAR;     /* No Output Red & Blue swap */  
  
  /*##-2- DMA2D Callbacks Configuration ######################################*/
  DMA2D_Handle.XferCpltCallback  = NULL;
  
  /*##-3- Foreground Configuration ###########################################*/
  DMA2D_Handle.LayerCfg[1].AlphaMode = DMA2D_REPLACE_ALPHA;
  DMA2D_Handle.LayerCfg[1].InputAlpha = 0xFF;
  DMA2D_Handle.LayerCfg[1].InputColorMode = DMA2D_INPUT_YCBCR;
  DMA2D_Handle.LayerCfg[1].ChromaSubSampling = cssMode;
  DMA2D_Handle.LayerCfg[1].InputOffset = inputLineOffset;
  DMA2D_Handle.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR; /* No ForeGround Red/Blue swap */
  DMA2D_Handle.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA; /* No ForeGround Alpha inversion */  
  
  DMA2D_Handle.Instance          = DMA2D;
  
  /*##-4- DMA2D Initialization     ###########################################*/
  HAL_DMA2D_Init(&DMA2D_Handle);
  HAL_DMA2D_ConfigLayer(&DMA2D_Handle, 1);
  
  /*##-5-  copy the new decoded frame to the LCD Frame buffer ################*/
  destination = (uint32_t)pDst + ((y *320) + x) * 2 ;// + ((y *320) + x) * 4

  HAL_DMA2D_Start(&DMA2D_Handle, (uint32_t)pSrc, destination, xsize, ysize);
  HAL_DMA2D_PollForTransfer(&DMA2D_Handle, 25);  /* wait for the previous DMA2D transfer to ends */


这个是我使用例程的函数
由于我不是通过LTDC直接缓存刷入,这个函数是否需要修改?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2024-1-31 15:12:29 | 显示全部楼层
整理了一个STM32H7的寄存器方式YCbCr转RGB函数并DMA2D到显示屏,支持采样比4:4:4,4:2:2和4:2:0
https://www.armbbs.cn/forum.php?mod=viewthread&tid=93536
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2024-1-31 16:18:51 | 显示全部楼层
C:\Users\rose\Desktop\1
运行之后目标地址的值还是0,DMA2D寄存器的值 还是0
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2024-1-31 16:38:58 | 显示全部楼层
大佬,用这个函数运行之后目标地址的数值还是0,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2024-2-1 08:08:20 | 显示全部楼层
Rose980 发表于 2024-1-31 16:38
大佬,用这个函数运行之后目标地址的数值还是0,

这个是完整的例子,供参考。

基于V7开发板的裸机和各种RTOS版本的emWin程序模板,支持硬件JPEG,已发布(2019-05-26)
https://www.armbbs.cn/forum.php? ... 3843&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2024-2-1 15:38:02 | 显示全部楼层
大佬,启动DMA2D之后寄存器的值还都是0,会不会是这个芯片和这个库函数有点差异啊,我直接用的HAL库的例程,和你的例程都是这样,JEPG可以解码,DMA2D寄存器都是0
Dingtalk_20240131161648.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 21:51 , Processed in 0.192006 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表