Rose980 发表于 2024-1-31 14:23:07

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

我想使用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.AlphaMode = DMA2D_REPLACE_ALPHA;
DMA2D_Handle.LayerCfg.InputAlpha = 0xFF;
DMA2D_Handle.LayerCfg.InputColorMode = DMA2D_INPUT_YCBCR;
DMA2D_Handle.LayerCfg.ChromaSubSampling = cssMode;
DMA2D_Handle.LayerCfg.InputOffset = inputLineOffset;
DMA2D_Handle.LayerCfg.RedBlueSwap = DMA2D_RB_REGULAR; /* No ForeGround Red/Blue swap */
DMA2D_Handle.LayerCfg.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直接缓存刷入,这个函数是否需要修改?

eric2013 发表于 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

Rose980 发表于 2024-1-31 16:18:51

C:\Users\rose\Desktop\1
运行之后目标地址的值还是0,DMA2D寄存器的值 还是0:'(

Rose980 发表于 2024-1-31 16:38:58

大佬,用这个函数运行之后目标地址的数值还是0,:'(

eric2013 发表于 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?mod=viewthread&tid=93843&fromuid=58
(出处: 硬汉嵌入式论坛)

Rose980 发表于 2024-2-1 15:38:02

大佬,启动DMA2D之后寄存器的值还都是0,会不会是这个芯片和这个库函数有点差异啊,我直接用的HAL库的例程,和你的例程都是这样,JEPG可以解码,DMA2D寄存器都是0
页: [1]
查看完整版本: STM32H7B芯片JPEG硬解以及DMA2D转换的问题