硬汉嵌入式论坛

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

[JPEG] STM32H7 JPEG 解码数据超过128K解码不成功?

[复制链接]

61

主题

62

回帖

245

积分

高级会员

积分
245
发表于 2021-3-2 22:03:56 | 显示全部楼层 |阅读模式


void HAL_JPEG_MspInit(JPEG_HandleTypeDef *hjpeg)
{
        /* 这两个变量务必设置为静态局部变量或者全局变量,因为退出后,JPEG句柄还要使用 */


        /* 使能JPEG时钟 */
        __HAL_RCC_JPGDECEN_CLK_ENABLE();

        /* 使能MDMA时钟 */
        __HAL_RCC_MDMA_CLK_ENABLE();
       
        /* JPEG输入的MDMA配置 ###########################################*/
        BSP_JPEG_MDMA_IN.Instance                = MDMA_Channel7;                   /* 使用MDMA通道7 */
        BSP_JPEG_MDMA_IN.Init.Priority           = MDMA_PRIORITY_HIGH;              /* 优先级高 */
        BSP_JPEG_MDMA_IN.Init.Endianness         = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端格式 */
        BSP_JPEG_MDMA_IN.Init.SourceInc          = MDMA_SRC_INC_BYTE;               /* 源地址字节递增 */
        BSP_JPEG_MDMA_IN.Init.DestinationInc     = MDMA_DEST_INC_DISABLE;           /* 目的地址无自增 */
        BSP_JPEG_MDMA_IN.Init.SourceDataSize     = MDMA_SRC_DATASIZE_BYTE;          /* 源地址数据宽度字节 */
        BSP_JPEG_MDMA_IN.Init.DestDataSize       = MDMA_DEST_DATASIZE_WORD;         /* 目的地址数据宽度字节 */
        BSP_JPEG_MDMA_IN.Init.DataAlignment      = MDMA_DATAALIGN_PACKENABLE;       /* 小端,右对齐 */
        BSP_JPEG_MDMA_IN.Init.SourceBurst        = MDMA_SOURCE_BURST_32BEATS;       /* 源数据突发传输,32次 */
        BSP_JPEG_MDMA_IN.Init.DestBurst          = MDMA_DEST_BURST_16BEATS;         /* 目的数据突发传输,16次 */
       
        BSP_JPEG_MDMA_IN.Init.SourceBlockAddressOffset = 0;  /* 用于block传输,buffer传输用不到 */
        BSP_JPEG_MDMA_IN.Init.DestBlockAddressOffset   = 0;  /* 用于block传输,buffer传输用不到 */

        BSP_JPEG_MDMA_IN.Init.Request = MDMA_REQUEST_JPEG_INFIFO_TH;           /* JPEG的FIFO阀值触发中断 */
        BSP_JPEG_MDMA_IN.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER; /* 使用MDMA的buffer传输 */
        BSP_JPEG_MDMA_IN.Init.BufferTransferLength = 32;                  /* 每次传输32个字节,JPEG的FIFO阀值是32字节 */

        /* 关联MDMA的句柄到JPEG */
        __HAL_LINKDMA(hjpeg, hdmain, BSP_JPEG_MDMA_IN);

        /* 先复位,然后配置MDMA */
        HAL_MDMA_DeInit(&BSP_JPEG_MDMA_IN);
        HAL_MDMA_Init(&BSP_JPEG_MDMA_IN);

        /* JPEG输出的MDMA配置 ###########################################*/
        BSP_JPEG_MDMA_OUT.Instance             = MDMA_Channel6;                   /* 使用MDMA通道6 */
        BSP_JPEG_MDMA_OUT.Init.Priority        = MDMA_PRIORITY_VERY_HIGH;         /* 优先级最高 */
        BSP_JPEG_MDMA_OUT.Init.Endianness      = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端格式 */
        BSP_JPEG_MDMA_OUT.Init.SourceInc       = MDMA_SRC_INC_DISABLE;            /* 源数据地址禁止自增 */
        BSP_JPEG_MDMA_OUT.Init.DestinationInc  = MDMA_DEST_INC_BYTE;              /* 目的数据地址字节自增 */
        BSP_JPEG_MDMA_OUT.Init.SourceDataSize  = MDMA_SRC_DATASIZE_WORD;          /* 源地址数据宽度字 */
        BSP_JPEG_MDMA_OUT.Init.DestDataSize    = MDMA_DEST_DATASIZE_BYTE;         /* 目的地址数据宽度字节 */
        BSP_JPEG_MDMA_OUT.Init.DataAlignment   = MDMA_DATAALIGN_PACKENABLE;       /* 小端,右对齐 */  
        BSP_JPEG_MDMA_OUT.Init.SourceBurst     = MDMA_SOURCE_BURST_32BEATS;       /* 源数据突发传输,32次 */
        BSP_JPEG_MDMA_OUT.Init.DestBurst       = MDMA_DEST_BURST_32BEATS;         /* 目的数据突发传输,16次 */
       
        BSP_JPEG_MDMA_OUT.Init.SourceBlockAddressOffset = 0;  /* 用于block传输,buffer传输用不到 */
        BSP_JPEG_MDMA_OUT.Init.DestBlockAddressOffset   = 0;  /* 用于block传输,buffer传输用不到 */

        BSP_JPEG_MDMA_OUT.Init.Request              = MDMA_REQUEST_JPEG_OUTFIFO_TH;  /* JPEG的FIFO阀值触发中断 */
        BSP_JPEG_MDMA_OUT.Init.TransferTriggerMode  = MDMA_BUFFER_TRANSFER;          /* 使用MDMA的buffer传输 */
        BSP_JPEG_MDMA_OUT.Init.BufferTransferLength = 32;                            /* 每次传输32个字节,JPEG的FIFO阀值是32字节 */

        /* 先复位,然后配置MDMA */
        HAL_MDMA_DeInit(&BSP_JPEG_MDMA_OUT);  
        HAL_MDMA_Init(&BSP_JPEG_MDMA_OUT);

        /* 关联MDMA的句柄到JPEG */
        __HAL_LINKDMA(hjpeg, hdmaout, BSP_JPEG_MDMA_OUT);
}

BSP_JPEG_YCbCr_SRC_Size =128*1024;
BSP_JPEG_YCbCr_Size_OUT=128*1024;
HAL_JPEG_Decode_DMA(&BSP_JPEG_Handle ,(uint8_t *)BSP_JPEG_YCbCr_SRC_Addr ,BSP_JPEG_YCbCr_SRC_Size ,(uint8_t *)BSP_JPEG_YCbCr_OUT_Addr ,BSP_JPEG_YCbCr_Size_OUT);

当长度大小小于128*1024-1 时,解码成功。 这个两个参数的长度大小是JPEG文件长度大小还是,解码出来的大小?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2021-3-3 08:19:51 | 显示全部楼层
这个是每次加载处理的数据大小。
JPEG文件比它大,可以通过可以每次处理一批,直到处理完毕。比它小,一次处理完毕
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2021-3-3 08:48:21 | 显示全部楼层
特别注意,此JPEG的MDMA是通过HAL_MDMA_Start_IT实现,这个函数的传输的块大小不可以超过65536字节。
回复

使用道具 举报

61

主题

62

回帖

245

积分

高级会员

积分
245
 楼主| 发表于 2021-3-3 09:41:55 | 显示全部楼层
HAL_JPEG_Decode_DMA  第一个数据长度参数不能小于JPEG文件长度,我试过了。
比如图片文件是24K,那么第一个长度参数要大于24K就行。但是第二个参数我就不清楚了,好像设置小于24K也不行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2021-3-3 09:57:22 | 显示全部楼层
vzhaodan 发表于 2021-3-3 09:41
HAL_JPEG_Decode_DMA  第一个数据长度参数不能小于JPEG文件长度,我试过了。
比如图片文件是24K,那么第一 ...

可以啊,我提供的这个例子图片就是小于的

V7-036_硬件JPEG实现图片解码显示(V1.1)
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-3-3 17:24:09 | 显示全部楼层
我的用提供的那个图片数组解码没问题,但是换成摄像头拍照然后解码,经常会解码失败,偶尔可以解码成功,有人知道是为什么吗?
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-3-4 17:12:45 | 显示全部楼层
请问下各位这个错误是什么错误?
HAL_JPEG_ERROR_DMA
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2021-3-5 08:22:21 | 显示全部楼层
17705920878 发表于 2021-3-4 17:12
请问下各位这个错误是什么错误?
HAL_JPEG_ERROR_DMA

注意这个问题没

测试发现STM32H7的硬件JPEG不支持渐进式JPEG文件解析,Baseline标准型没问题
http://www.armbbs.cn/forum.php?m ... 3583&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 04:44 , Processed in 0.175586 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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