新手上路
- 积分
- 37
- 金钱
- 37
- 注册时间
- 2020-6-2
- 在线时间
- 12 小时
|
15金钱
大佬们,刚入手阿波罗STM32F7这个板,最近在学习JPEG解码那块,想把图片从U盘读出然后存到SPI flash中,再显示到LCD屏,但是由于SPI flash写入的速度太慢(5s左右),我想,先把U盘的图片文件的数据读取到RAM中,先再LCD显示出来,然后再通过RAM写入到SPI Flash中,这样,占用U盘的时间就大大缩减。可是原子哥的历程中JPEG硬解码是读取文件然后解码,怎么将RAM中的图片数据硬解码显示?不知哪位大佬给些建议。非常感谢。下面是我更改的代码,但是每次执行的时候都会卡死在 SCB_CleanlnvakidateDCache.
u8 hjpgd_decode1(u8* pname,u32 lenth )
{
FIL* ftemp;
u16* rgb565buf,count=0,readsize=0,fileout=0;
vu32 timecnt=0;
u8 fileover=0;
u8 i=0;
u8 res;
u32 mcublkindex=0;
res=JPEG_Core_Init(&hjpgd); //初始化JPEG内核
if(res)return 1;
ftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //申请内存
rgb565buf=mymalloc(SRAMEX,1024*600*2); //申请整帧内存
JPEG_Decode_Init(&hjpgd); //初始化硬件JPEG解码器
for(i=0;i<JPEG_DMA_INBUF_NB;i++)
{
mymemcpy( hjpgd.inbuf[i].buf,&pname[i*JPEG_DMA_INBUF_LEN],JPEG_DMA_INBUF_LEN);
hjpgd.inbuf[i].size=JPEG_DMA_INBUF_LEN; //读取
hjpgd.inbuf[i].sta=1; //标记buf满
fileout = 0;
count = 2;
}
JPEG_IN_OUT_DMA_Init((u32)hjpgd.inbuf[0].buf,(u32)hjpgd.outbuf[0].buf,hjpgd.inbuf[0].size,JPEG_DMA_OUTBUF_LEN);//配置DMA
jpeg_in_callback=jpeg_dma_in_callback; //JPEG DMA读取数据回调函数
jpeg_out_callback=jpeg_dma_out_callback; //JPEG DMA输出数据回调函数
jpeg_eoc_callback=jpeg_endofcovert_callback; //JPEG 解码结束回调函数
jpeg_hdp_callback=jpeg_hdrover_callback; //JPEG Header解码完成回调函数
JPEG_DMA_Start(); //启动DMA传输
while(1)
{
SCB_CleanInvalidateDCache(); //清空D catch
if(hjpgd.inbuf[hjpgd.inbuf_write_ptr].sta==0&&fileover==0) //有buf为空
{
if(fileout == 0)
{
if((count+1)*JPEG_DMA_INBUF_LEN > lenth)
{
readsize = lenth - count*JPEG_DMA_INBUF_LEN;
fileout=1;
}
else
{
readsize = JPEG_DMA_INBUF_LEN;
hjpgd.inbuf[hjpgd.inbuf_write_ptr].sta=1; //buf满
}
mymemcpy( hjpgd.inbuf[i].buf,&pname[count*JPEG_DMA_INBUF_LEN],readsize);//填满一个缓冲区
count++;
hjpgd.inbuf[hjpgd.inbuf_write_ptr].size=readsize; //读取
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;
}
else
{
timecnt=0; //清零计时器
fileover=1; //文件结束了...
}
}
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; //超时退出
}
}
if(hjpgd.state==JPEG_STATE_FINISHED) //解码完成了
{
piclib_fill_color(picinfo.S_XOFF,picinfo.S_YOFF,hjpgd.Conf.ImageWidth,hjpgd.Conf.ImageHeight,rgb565buf);
}
myfree(SRAMIN,ftemp);
myfree(SRAMEX,rgb565buf);
JPEG_Core_Destroy(&hjpgd);
return 0;
}
|
|