OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5184|回复: 8

原子哥,我在自己的板子上移植你的硬件解码JPEG失败,还没有定位具体问题所在,求分析

[复制链接]

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2018-6-14
在线时间
54 小时
发表于 2018-6-14 16:10:46 | 显示全部楼层 |阅读模式
1金钱
全速Debug停止后直接HardFault_Handler,当机了,单步调试发现直接掉入HAL_JPEG_Init(JPEG_HandleTypeDef *hjpeg)初始化中的 if(hjpeg==NULL) return HAL_ERROR;
图片是网上随意下载的JPEG图片

放在PICTURE路径下的图片

放在PICTURE路径下的图片

图片详细信息

图片详细信息

最佳答案

查看完整内容[请看2#楼]

官方的hal库还是不能太相信,对比了17年4月的和16年的,优化过后的17年的hal_jpeg竟然有问题,是个坑呀
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2018-6-14
在线时间
54 小时
 楼主| 发表于 2018-6-14 16:10:47 | 显示全部楼层
官方的hal库还是不能太相信,对比了17年4月的和16年的,优化过后的17年的hal_jpeg竟然有问题,是个坑呀
回复

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2018-6-14
在线时间
54 小时
 楼主| 发表于 2018-6-14 16:11:58 | 显示全部楼层
本帖最后由 Hevin 于 2018-6-14 17:07 编辑

主控用的是STM32F769II我的屏幕分辨率是1024*768  
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2018-6-14 17:28:20 | 显示全部楼层
这个你就得硬件调试了,看看是到哪里卡主了
回复

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2018-6-14
在线时间
54 小时
 楼主| 发表于 2018-6-14 18:36:58 | 显示全部楼层
zuozhongkai 发表于 2018-6-14 17:28
这个你就得硬件调试了,看看是到哪里卡主了

软件解码部分能显示出来,但是拉窗帘一样 ,因为IO资源限制所以我板子上和SD卡的接口不是SDIO而是SPI的方式
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-6-15 01:41:53 | 显示全部楼层
试试移植寄存器版本吧
回复

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2018-6-14
在线时间
54 小时
 楼主| 发表于 2018-6-15 11:23:32 | 显示全部楼层
正点原子 发表于 2018-6-15 01:41
试试移植寄存器版本吧

原子哥,我移植完了,还是不行,程序死在u8 hjpgd_decode(u8* pname)函数JPEG硬件解码图片,观察了hjpgd.inbuf[hjpgd.inbuf_write_ptr].sta这个值永远为0x01:
JPEG_DMA_Start();                                                                //启动DMA传输
        while(1)
        {
        SCB_CleanInvalidateDCache();                                //清空D catch
                if(hjpgd.inbuf[hjpgd.inbuf_write_ptr].sta==0&&fileover==0)        //有buf为空
                {
                        res=f_read(ftemp,hjpgd.inbuf[hjpgd.inbuf_write_ptr].buf,JPEG_DMA_INBUF_LEN,&br);//填满一个缓冲区
                        if(res==FR_OK&&br)
                        {
                                hjpgd.inbuf[hjpgd.inbuf_write_ptr].size=br;        //读取
                                hjpgd.inbuf[hjpgd.inbuf_write_ptr].sta=1;        //buf满
                        }else if(br==0)
                        {
                                timecnt=0;        //清零计时器
                                fileover=1;        //文件结束了...
                        }
                        if(hjpgd.indma_pause==1&&hjpgd.inbuf[hjpgd.inbuf_read_ptr].sta==1)//之前是暂停的了,继续传输
                        {
                                JPEG_IN_DMA_Resume((u32)hjpgd.inbuf[hjpgd.inbuf_read_ptr].buf,hjpgd.inbuf[hjpgd.inbuf_read_ptr].size);        //继续下一次DMA传输
                                hjpgd.indma_pause=0;
                        }
                        hjpgd.inbuf_write_ptr++;
                        if(hjpgd.inbuf_write_ptr>=JPEG_DMA_INBUF_NB)hjpgd.inbuf_write_ptr=0;
                }
                if(hjpgd.outbuf[hjpgd.outbuf_read_ptr].sta==1)        //buf里面有数据要处理
                {
                        mcublkindex+=hjpgd.ycbcr2rgb(hjpgd.outbuf[hjpgd.outbuf_read_ptr].buf,(u8*)rgb565buf,mcublkindex,hjpgd.outbuf[hjpgd.outbuf_read_ptr].size);
                        hjpgd.outbuf[hjpgd.outbuf_read_ptr].sta=0;        //标记buf为空
                        hjpgd.outbuf[hjpgd.outbuf_read_ptr].size=0;        //数据量清空
                        hjpgd.outbuf_read_ptr++;
                        if(hjpgd.outbuf_read_ptr>=JPEG_DMA_OUTBUF_NB)hjpgd.outbuf_read_ptr=0;//限制范围
                        if(mcublkindex==hjpgd.total_blks)
                        {
                                break;
                        }
                }else if(hjpgd.outdma_pause==1&&hjpgd.outbuf[hjpgd.outbuf_write_ptr].sta==0)                //out暂停,且当前writebuf已经为空了,则恢复out输出
                {
                        JPEG_OUT_DMA_Resume((u32)hjpgd.outbuf[hjpgd.outbuf_write_ptr].buf,JPEG_DMA_OUTBUF_LEN);//继续下一次DMA传输
                        hjpgd.outdma_pause=0;
                }
                timecnt++;
                if(fileover)//文件结束后,及时退出,防止死循环
                {
                        if(hjpgd.state==JPEG_STATE_NOHEADER)break;        //解码失败了
                        if(timecnt>0X3FFF)break;                                        //超时退出
                }
        }                    //超时退出
                }
        }   
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-6-17 01:57:21 | 显示全部楼层
Hevin 发表于 2018-6-15 11:23
原子哥,我移植完了,还是不行,程序死在u8 hjpgd_decode(u8* pname)函数JPEG硬件解码图片,观察 ...

继续努力
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-6-17 03:36:35 来自手机 | 显示全部楼层
看看你的中断回调函数进去没
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 22:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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