如何解决使用 STM32H7 硬件 jpeg 解码器 w/o dma2d
我正在研究 stm32h747,我已将其设置为使用 hjpeg 外围设备解码 jpeg 文件,但我需要在没有 dma2d 的情况下进行。我的第一种方法是使用包含 ycbcr -> rgb 方法的 jpeg utils 文件夹,但由于未知原因,它无法按预期工作。
以下图片说明了我的意思。
似乎 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 举报,一经查实,本站将立刻删除。