使用 STM32H7 硬件 jpeg 解码器 w/o dma2d

问题描述

我正在研究 stm32h747,我已将其设置为使用 hjpeg 外围设备解码 jpeg 文件,但我需要在没有 dma2d 的情况下进行。我的第一种方法是使用包含 ycbcr -> rgb 方法的 jpeg utils 文件夹,但由于未知原因,它无法按预期工作。

以下图片说明了我的意思。

Result with jpeg out buffer size at (768 * 4) bytes

Result with jpeg out buffer size at (768 * 64) bytes

似乎 jpeg 缓冲区大小等于 768x64 字节是最佳位置,但图片 仍然有故障。此外,在尝试了不同的事情之后,我能够意识到唯一的 从 f7 变为 h7 的东西,与 hjpeg 有关,是 h7 中的新 mdma 控制器 家庭。

另外说同样的代码在 stm32f7 上运行得很好。

我更改了 mdma 控制器中的每个参数,试图在 f7 上模拟 dma,但没有 结果。

这是ST带来的示例代码,我正在使用,用于设置hjpeg和mdma stm32h7。

void HAL_JPEG_MspInit(JPEG_HandleTypeDef *hjpeg)
{
  static MDMA_HandleTypeDef   hmdmaIn;
  static MDMA_HandleTypeDef   hmdmaOut;

  /* Enable JPEG clock */
  __HAL_RCC_JPGDECEN_CLK_ENABLE();

  /* Enable MDMA clock */
  __HAL_RCC_MDMA_CLK_ENABLE();

  HAL_NVIC_SetPriority(JPEG_IRQn,0x07,0x0F);
  HAL_NVIC_EnableIRQ(JPEG_IRQn);

  /* Input MDMA */
  /* Set the parameters to be configured */
  hmdmaIn.Init.Priority           = MDMA_PRIORITY_HIGH;
  hmdmaIn.Init.Endianness         = MDMA_LITTLE_ENDIANnesS_PRESERVE;
  hmdmaIn.Init.sourceInc          = MDMA_SRC_INC_BYTE;
  hmdmaIn.Init.DestinationInc     = MDMA_DEST_INC_disABLE;
  hmdmaIn.Init.sourceDataSize     = MDMA_SRC_DATASIZE_BYTE;
  hmdmaIn.Init.DestDataSize       = MDMA_DEST_DATASIZE_WORD;
  hmdmaIn.Init.DataAlignment      = MDMA_DATAALIGN_PACKENABLE;
  hmdmaIn.Init.sourceBurst        = MDMA_SOURCE_BURST_32BEATS;
  hmdmaIn.Init.DestBurst          = MDMA_DEST_BURST_16BEATS;
  hmdmaIn.Init.sourceBlockAddressOffset = 0;
  hmdmaIn.Init.DestBlockAddressOffset  = 0;

  /*Using JPEG Input FIFO Threshold as a trigger for the MDMA*/
  hmdmaIn.Init.Request = MDMA_REQUEST_JPEG_INFIFO_TH; /* Set the MDMA HW trigger to JPEG Input    FIFO Threshold flag*/
  hmdmaIn.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER;
  hmdmaIn.Init.BufferTransferLength = 32; /*Set the MDMA buffer size to the JPEG FIFO threshold size i.e 32 bytes (8 words)*/

  hmdmaIn.Instance = MDMA_Channel2;

  /* Associate the DMA handle */
  __HAL_LINKDMA(hjpeg,hdmain,hmdmaIn);

  /* DeInitialize the DMA Stream */
  HAL_MDMA_DeInit(&hmdmaIn);
  /* Initialize the DMA stream */
  HAL_MDMA_Init(&hmdmaIn);

  /* Output MDMA */
  /* Set the parameters to be configured */
  hmdmaOut.Init.Priority        = MDMA_PRIORITY_VERY_HIGH;
  hmdmaOut.Init.Endianness      = MDMA_LITTLE_ENDIANnesS_PRESERVE;
  hmdmaOut.Init.sourceInc       = MDMA_SRC_INC_disABLE;
  hmdmaOut.Init.DestinationInc  = MDMA_DEST_INC_BYTE;
  hmdmaOut.Init.sourceDataSize  = MDMA_SRC_DATASIZE_WORD;
  hmdmaOut.Init.DestDataSize    = MDMA_DEST_DATASIZE_BYTE;
  hmdmaOut.Init.DataAlignment   = MDMA_DATAALIGN_PACKENABLE;
  hmdmaOut.Init.sourceBurst     = MDMA_SOURCE_BURST_32BEATS;
  hmdmaOut.Init.DestBurst       = MDMA_DEST_BURST_32BEATS;
  hmdmaOut.Init.sourceBlockAddressOffset = 0;
  hmdmaOut.Init.DestBlockAddressOffset  = 0;

  /*Using JPEG Output FIFO Threshold as a trigger for the MDMA*/
  hmdmaOut.Init.Request              = MDMA_REQUEST_JPEG_OUTFIFO_TH; /* Set the MDMA HW trigger to JPEG Output FIFO Threshold flag*/
  hmdmaOut.Init.TransferTriggerMode  = MDMA_BUFFER_TRANSFER;
  hmdmaOut.Init.BufferTransferLength = 32; /*Set the MDMA buffer size to the JPEG FIFO threshold size i.e 32 bytes (8 words)*/

  hmdmaOut.Instance = MDMA_Channel1;
  /* DeInitialize the DMA Stream */
  HAL_MDMA_DeInit(&hmdmaOut);
  /* Initialize the DMA stream */
  HAL_MDMA_Init(&hmdmaOut);

  /* Associate the DMA handle */
  __HAL_LINKDMA(hjpeg,hdmaout,hmdmaOut);

  HAL_NVIC_SetPriority(MDMA_IRQn,0x08,0x0F);
  HAL_NVIC_EnableIRQ(MDMA_IRQn);
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)