使用SDRAM加载,确定是没问题的。之前我给emWin移植的硬件JPEG支持就是SDRAM加载
[C] 纯文本查看 复制代码 /*
*********************************************************************************************************
* 函 数 名: JPEG_X_Draw
* 功能说明: 硬件JPEG绘制
* 形 参: ---
* 返 回 值: 绘制是否成功
*********************************************************************************************************
*/
int JPEG_X_Draw(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0)
{
U8 *ppData;
GUI_LOCK();
_Context.xPos = x0;
_Context.yPos = y0;
_Context.pfGetData = pfGetData;
_Context.pVoid = p;
_Context.Error = 0;
/* 初始化硬件JPEG,并申请空间 */
if (_IsInitialized == 0)
{
_IsInitialized = 1;
JPEG_Handle.Instance = JPEG;
HAL_JPEG_Init(&JPEG_Handle);
#if AutoMalloc == 0
/* 申请一块内存空间,用于加载JPEG图片 */
_Context.hWorkBuffer = GUI_ALLOC_AllocNoInit(LoadPicSize);
_Context.pWorkBuffer = GUI_ALLOC_h2p(_Context.hWorkBuffer);
/* 申请一块内存空间,用于存放解码完成的数据 */
_Context.hOutBuffer = GUI_ALLOC_AllocNoInit(DrawPicSize);
_Context.pOutBuffer = GUI_ALLOC_h2p(_Context.hOutBuffer);
#endif
}
#if AutoMalloc == 1
/* 申请一块内存空间,用于加载JPEG图片 */
_Context.hWorkBuffer = GUI_ALLOC_AllocNoInit(LoadPicSize);
_Context.pWorkBuffer = GUI_ALLOC_h2p(_Context.hWorkBuffer);
/* 申请一块内存空间,用于存放解码完成的数据 */
_Context.hOutBuffer = GUI_ALLOC_AllocNoInit(DrawPicSize);
_Context.pOutBuffer = GUI_ALLOC_h2p(_Context.hOutBuffer);
#endif
/* 读取JPEG数据,并解码 */
_Context.NumBytesInBuffer = _Context.pfGetData(_Context.pVoid, (const U8 **)&ppData, LoadPicSize, 0);
JPEG_Decode_DMA(&JPEG_Handle, (uint32_t)ppData, _Context.NumBytesInBuffer, (uint32_t)_Context.pWorkBuffer);
/* 解码完成 */
while(Jpeg_HWDecodingEnd == 0)
{
}
/* 获取JPEG图片格式信息后,做颜色格式转换 */
HAL_JPEG_GetInfo(&JPEG_Handle, &JPEG_Info);
DMA2D_Copy_YCbCr_To_RGB((uint32_t *)_Context.pWorkBuffer,
(uint32_t *)_Context.pOutBuffer ,
0,
0,
JPEG_Info.ImageWidth,
JPEG_Info.ImageHeight,
PicPixelFormat,
JPEG_Info.ChromaSubsampling);
/* 绘制JPEG图片 */
_DrawBitmap(_Context.xPos, _Context.yPos, (void const *)_Context.pOutBuffer , JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ImageWidth*2, 16);
#if AutoMalloc == 1
/* 释放动态内存hMem */
GUI_ALLOC_Free(_Context.hWorkBuffer);
GUI_ALLOC_Free(_Context.hOutBuffer );
#endif
GUI_UNLOCK();
return _Context.Error;
} |