硬汉嵌入式论坛

 找回密码
 立即注册
查看: 987|回复: 6
收起左侧

[STM32H7] Stm32H7 硬件解码从U盘读取的jpeg文件卡死

[复制链接]

4

主题

8

回帖

20

积分

新手上路

积分
20
发表于 2024-9-1 22:58:17 | 显示全部楼层 |阅读模式
在解码C数组形式的jpeg图像时没有问题,但在解码从U盘读取的jpeg图片时,卡死在JPEG_Decode_DMA(&JPEG_Handle,OLED_JPG1,info.fsize,OLED_JPG2)这里,试过多种尺寸的图片,也确认了图片为基本型jpeg。keil的debug突然用不了了,所以用串口调测,发现是在HAL_StatusTypeDef HAL_MDMA_Start_IT(MDMA_HandleTypeDef *hmdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t BlockDataLength, uint32_t BlockCount)这里挂掉的
void Disk2Jpeg(char *path)
{
        uint32_t color;
        uint32_t  br;
        FILINFO info;
        static uint8_t buffer[300];
       
        if(f_open(&File,path,FA_READ | FA_OPEN_EXISTING) == FR_OK)
        {
                f_stat(path,&info);
                USART1_printf("size:%d,name:%s\n",info.fsize,info.fname);
                if(f_read(&File,(uint32_t*)OLED_JPG1,info.fsize,&br)==FR_OK)
                {
                        USART1_printf("jpg read ok br:%d\n",br);
                        JPEG_Decode_DMA(&JPEG_Handle,OLED_JPG1,info.fsize,OLED_JPG2);
                        while(Jpeg_HWDecodingEnd == 0);
                        HAL_JPEG_GetInfo(&JPEG_Handle, &JPEG_Info);
                        USART1_printf("jpg decode ok w:%d,h:%d\n",JPEG_Info.ImageWidth,JPEG_Info.ImageHeight);
                        DMA2D_Copy_YCbCr_To_RGB((uint32_t*)OLED_JPG2,(uint32_t*)OLED_DIS1,0,0,JPEG_Info.ImageWidth,JPEG_Info.ImageHeight,LTDC_PIXEL_FORMAT_ARGB8888,JPEG_Info.ChromaSubsampling);                                       
                }
        }
        else USART1_printf("jpg decode open err\n");
}
void HAL_JPEG_ErrorCallback(JPEG_HandleTypeDef *hjpeg)
{
        USART1_printf("hard error\n");
}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2024-9-2 08:39:31 | 显示全部楼层
提取加载到内部RAM并和C数组的原生数据比较,看看是否一样。
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2024-9-2 13:04:35 | 显示全部楼层
eric2013 发表于 2024-9-2 08:39
提取加载到内部RAM并和C数组的原生数据比较,看看是否一样。

打印出来内容是一样的,但还是会在原先那个函数那里卡死
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2024-9-2 15:10:10 | 显示全部楼层
上川下流 发表于 2024-9-2 13:04
打印出来内容是一样的,但还是会在原先那个函数那里卡死

有没有可能是 地址对齐 造成的 ??
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2024-9-2 17:53:53 | 显示全部楼层
hpdell 发表于 2024-9-2 15:10
有没有可能是 地址对齐 造成的 ??

很奇怪,当用sdram存储jpeg文件时,调用解码函数就会卡死,但是调用memcpy()把sdram里的jpeg数据复制到用32的RAM里,在调用解码函数就能正常运行。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2024-9-3 00:42:38 | 显示全部楼层
使用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;
}
回复

使用道具 举报

0

主题

40

回帖

40

积分

新手上路

积分
40
发表于 2024-9-4 09:19:18 | 显示全部楼层
对齐方式有问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-15 22:23 , Processed in 0.054391 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表