|
发表于 2023-5-24 18:30:49
|
显示全部楼层
剩下的能优化的我都优化过了,可能就是32bitSDRAM和16bit双片SDRAM组合的问题了。
int JPEG_X_Draw(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0) ;这个函数的下面这里进行调整;
/* 绘制JPEG图片 */
if(PicPixelFormat==LTDC_PIXEL_FORMAT_ARGB8888)
_DrawBitmap(_Context.xPos, _Context.yPos, (void const *)_Context.pOutBuffer , JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ImageWidth*4, 32);
else if(PicPixelFormat==LTDC_PIXEL_FORMAT_RGB888)
_DrawBitmap(_Context.xPos, _Context.yPos, (void const *)_Context.pOutBuffer , JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ImageWidth*3, 24);
else
_DrawBitmap(_Context.xPos, _Context.yPos, (void const *)_Context.pOutBuffer , JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ImageWidth*2, 16);
/*
*********************************************************************************************************
* 函 数 名: HAL_JPEG_MspInit
* 功能说明: 初始化JEPG所需要的底层
* 形 参: JPEG_HandleTypeDef句柄指针
* 返 回 值: 无
*********************************************************************************************************
*/
void HAL_JPEG_MspInit(JPEG_HandleTypeDef *hjpeg)
{
/* 这两个变量务必设置为静态局部变量或者全局变量,因为退出后,JPEG句柄还要使用 */
static MDMA_HandleTypeDef hmdmaIn;
static MDMA_HandleTypeDef hmdmaOut;
/* 使能JPEG时钟 */
__HAL_RCC_JPGDECEN_CLK_ENABLE();
/* 使能MDMA时钟 */
__HAL_RCC_MDMA_CLK_ENABLE();
/* 使能JPEG中断并配置优先级 */
HAL_NVIC_SetPriority(JPEG_IRQn, 0x03, 0x00);
HAL_NVIC_EnableIRQ(JPEG_IRQn);
/* JPEG输入的MDMA配置 ###########################################*/
hmdmaIn.Instance = MDMA_Channel7; /* 使用MDMA通道7 */
hmdmaIn.Init.Priority = MDMA_PRIORITY_HIGH; /* 优先级高 */
hmdmaIn.Init.Endianness = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端格式 */
hmdmaIn.Init.SourceInc = MDMA_SRC_INC_WORD; /* 源地址字节递增 */
hmdmaIn.Init.DestinationInc = MDMA_DEST_INC_DISABLE; /* 目的地址无自增 */
hmdmaIn.Init.SourceDataSize = MDMA_SRC_DATASIZE_WORD; /* 源地址数据宽度字节 */
hmdmaIn.Init.DestDataSize = MDMA_DEST_DATASIZE_WORD; /* 目的地址数据宽度字节 */
hmdmaIn.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE; /* 小端,右对齐 */
hmdmaIn.Init.SourceBurst = MDMA_SOURCE_BURST_32BEATS; /* 源数据突发传输,32次 */
hmdmaIn.Init.DestBurst = MDMA_DEST_BURST_32BEATS; /* 目的数据突发传输,16次 */
hmdmaIn.Init.SourceBlockAddressOffset = 0; /* 用于block传输,buffer传输用不到 */
hmdmaIn.Init.DestBlockAddressOffset = 0; /* 用于block传输,buffer传输用不到 */
hmdmaIn.Init.Request = MDMA_REQUEST_JPEG_INFIFO_TH; /* JPEG的FIFO阀值触发中断 */
hmdmaIn.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER; /* 使用MDMA的buffer传输 */
hmdmaIn.Init.BufferTransferLength = 32; /* 每次传输32个字节,JPEG的FIFO阀值是32字节 */
/* 关联MDMA的句柄到JPEG */
__HAL_LINKDMA(hjpeg, hdmain, hmdmaIn);
/* 先复位,然后配置MDMA */
HAL_MDMA_DeInit(&hmdmaIn);
HAL_MDMA_Init(&hmdmaIn);
/* JPEG输出的MDMA配置 ###########################################*/
hmdmaOut.Instance = MDMA_Channel6; /* 使用MDMA通道6 */
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_WORD; /* 目的数据地址字节自增 */
hmdmaOut.Init.SourceDataSize = MDMA_SRC_DATASIZE_WORD; /* 源地址数据宽度字 */
hmdmaOut.Init.DestDataSize = MDMA_DEST_DATASIZE_WORD; /* 目的地址数据宽度字节 */
hmdmaOut.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE; /* 小端,右对齐 */
hmdmaOut.Init.SourceBurst = MDMA_SOURCE_BURST_32BEATS; /* 源数据突发传输,32次 */
hmdmaOut.Init.DestBurst = MDMA_DEST_BURST_32BEATS; /* 目的数据突发传输,16次 */
hmdmaOut.Init.SourceBlockAddressOffset = 0; /* 用于block传输,buffer传输用不到 */
hmdmaOut.Init.DestBlockAddressOffset = 0; /* 用于block传输,buffer传输用不到 */
hmdmaOut.Init.Request = MDMA_REQUEST_JPEG_OUTFIFO_TH; /* JPEG的FIFO阀值触发中断 */
hmdmaOut.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER; /* 使用MDMA的buffer传输 */
hmdmaOut.Init.BufferTransferLength = 32; /* 每次传输32个字节,JPEG的FIFO阀值是32字节 */
/* 先复位,然后配置MDMA */
HAL_MDMA_DeInit(&hmdmaOut);
HAL_MDMA_Init(&hmdmaOut);
/* 关联MDMA的句柄到JPEG */
__HAL_LINKDMA(hjpeg, hdmaout, hmdmaOut);
/* 使能MDMA中断并配置优先级 */
HAL_NVIC_SetPriority(MDMA_IRQn, 0x04, 0x00);
HAL_NVIC_EnableIRQ(MDMA_IRQn);
}
这个函数进行优化应该还能提升一点速度。
我这边已经测试过是可行的,解码速度有一定提升。
|
|