OpenEdv-开源电子网

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

emWin5.44开始支持STM32F7的硬件JPEG解码了!!

[复制链接]

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2018-6-20 15:01:02 | 显示全部楼层 |阅读模式
最近在做RT1052和H7的emWin例程,下载了最新的emWin5.26版本,发现在38章新增了硬件JPEG解码章节,明确支持了是个STM32F7用的。我们都知道STM32F767/769开始带了硬件JPEG解码,现在emWin支持了这个硬件JPEG解码,以后用emWIn做有图片的界面将会大大的提高刷屏速度!!


4@FSK~UCQQ2TUF76PMS9.png
可以看到需要emOS的支持,其实其他的OS也可以,就是用到了emOS做任务同步用的。emWin官方已经提供了JPEG硬件解码层的代码,安装最新的MDK就可以得到最新的emWin,我这里安装的是MDK5.25,路径如下:D:\Keil_v5\ARM\PACK\Keil\MDK-Middleware\7.6.0\emWin\Sample\JPEGConf,如下图:
(WTU1QEL(M$W4HO2AN8D2BX.png
理论上把这两个文件放到工程里面即可。可以看一下源码,如下:

ZA$Y}GTS6QBZF(AH5$RN(`V.png
源码里面用到了emOS的东西,明显是做任务同步用的,可以用UCOS或者FreeRTOS的信号量或者事件替换掉






开往春天的手扶拖拉机
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

259

主题

806

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2012-10-28
在线时间
353 小时
发表于 2018-6-21 09:28:19 | 显示全部楼层
本帖最后由 hpdell 于 2018-6-21 09:29 编辑

你好,我安装的也是 mdk v5.25 版本的,没有找到你所说的那个目录啊,

我的目录貌似是 v7.4.1的,路径如下

C:\Keil_v5\ARM\PACK\Keil\MDK-Middleware\7.4.1\emWin\Sample

另外,这个emwin v5.44 版本的哪里可以下载到啊 ???

如果方面的话,能否发上来共享一下 ???
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
 楼主| 发表于 2018-6-21 10:01:21 | 显示全部楼层
hpdell 发表于 2018-6-21 09:28
你好,我安装的也是 mdk v5.25 版本的,没有找到你所说的那个目录啊,

我的目录貌似是 v7.4.1的,路径如 ...

那是因为你没有更新整个MDK的包!
OT)LM0BOD]5P8]B5[2X5[A5.png
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

259

主题

806

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2012-10-28
在线时间
353 小时
发表于 2018-6-22 11:00:55 | 显示全部楼层
zuozhongkai 发表于 2018-6-21 10:01
那是因为你没有更新整个MDK的包!

好的,我试试看
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-7-15 23:04:30 | 显示全部楼层
目前  用硬解码遇到了问题,使用的实例图片进行解码,横屏只能显示600*480的部分,显示正常。
然后  我吧图片放倒,在进行解码,于是乎图片就会错位
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-7-15 23:27:57 | 显示全部楼层
600*320的图片倒着放好着呢,800*480的图却有问题
1531668126232.jpg
1531668303102.jpg
1531668385746.jpg
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-7-15 23:31:08 | 显示全部楼层
void LCD_CopyBuffer_YCbCr_To_RGB(uint32_t *pSrc, uint16_t x, uint16_t y,uint16_t xsize, uint16_t ysize,uint32_t ChromaSampling)
{
        uint32_t psx,psy,xnum,ynum;
        uint32_t cssMode = DMA2D_CSS_420;
        uint32_t inputLineOffset = 0;
        uint32_t destination;
        uint32_t regValue, regMask;  
        uint32_t timeout=0;

        if(ChromaSampling == JPEG_420_SUBSAMPLING)
        {
                cssMode = DMA2D_CSS_420;
                inputLineOffset = xsize % 16;
                if(inputLineOffset != 0)
                {
                        inputLineOffset = 16 - inputLineOffset;
                }   
        }
        else if(ChromaSampling == JPEG_444_SUBSAMPLING)
        {
                cssMode = DMA2D_NO_CSS;
                inputLineOffset = xsize % 8;
                if(inputLineOffset != 0)
                {
                        inputLineOffset = 8 - inputLineOffset;
                }   
        }
        else if(ChromaSampling == JPEG_422_SUBSAMPLING)
        {
                cssMode = DMA2D_CSS_422;
                inputLineOffset = xsize % 16;
                if(inputLineOffset != 0)
                {
                        inputLineOffset = 16 - inputLineOffset;
                }      
        }
       
        destination = ((u32)ltdc_framebuf[lcdltdc.activelayer] + lcdltdc.pixsize*(lcdltdc.pwidth*y + x));  

        regValue = DMA2D_INPUT_YCBCR | (DMA2D_REPLACE_ALPHA << 16) | \
                        (DMA2D_REGULAR_ALPHA << 20)| \
                        (DMA2D_RB_REGULAR << 21)   | \
                        (0xFFU << 24)               | \
                        (cssMode << 18);
                       
        regMask  = DMA2D_BGPFCCR_CM | DMA2D_BGPFCCR_AM | DMA2D_BGPFCCR_ALPHA | DMA2D_BGPFCCR_AI | DMA2D_BGPFCCR_RBS | DMA2D_FGPFCCR_CSS;

        RCC->AHB1ENR   |= 1<<23;                                                                        //使能DM2D时钟
        DMA2D->CR              = 1<<16;                                                                        //Memory-to-memory with PFC
        DMA2D->OPFCCR          = DMA2D_OUTPUT_RGB565;                                                //色彩
    DMA2D->OOR                = lcdltdc.pwidth - xsize;                                        //行偏移量
        DMA2D->OPFCCR  |= (DMA2D_REGULAR_ALPHA << 20);                                //常规混合
        DMA2D->OPFCCR  |= (DMA2D_RB_REGULAR << 21);                                    //Regular mode (RGB or ARGB)       
        DMA2D->FGPFCCR |= (regMask & regValue);                                      //前景PFC控制       
        DMA2D->FGOR            = inputLineOffset;                                                        //前景抵消
        DMA2D->NLR             = (uint32_t)(xsize << 16) | (uint16_t)ysize;  //行和列
        DMA2D->OMAR            = (uint32_t)destination;                                        //显示位置
        DMA2D->FGMAR           = (uint32_t)pSrc;  
       
    DMA2D->CR          |= 1<<0;                        //启动DMA2D
        while((DMA2D->ISR&(1<<1))==0)        //等待传输完成
        {
                timeout++;
                if(timeout>0X1FFFFF)break;        //超时退出
        }
        DMA2D->IFCR|=1<<1;                                //清除传输完成标志         
}
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-7-16 11:32:38 | 显示全部楼层
解决了,图片的问题。我用电脑的照片查看器改变的方向,解码就会出问题。后来用画图软件修改就可以了。刷图就是快,1024*600的只用46ms
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-7-16 11:33:01 | 显示全部楼层
目前的问题在于不能连续刷,第一个刷完,第二个图就不能刷了
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
 楼主| 发表于 2018-7-16 15:22:21 | 显示全部楼层
qiousanxi 发表于 2018-7-16 11:33
目前的问题在于不能连续刷,第一个刷完,第二个图就不能刷了

连续刷的话检查一下是不是你的函数里面用到了一些全局变量,这些全局变量在第二次调用的时候没有清零
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-7-16 16:24:14 | 显示全部楼层
zuozhongkai 发表于 2018-7-16 15:22
连续刷的话检查一下是不是你的函数里面用到了一些全局变量,这些全局变量在第二次调用的时候没有清零

现在好了,连续刷  刷的时间长了就会卡死。正在检查原因
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-7-24 16:05:36 | 显示全部楼层
zuozhongkai 发表于 2018-7-16 15:22
连续刷的话检查一下是不是你的函数里面用到了一些全局变量,这些全局变量在第二次调用的时候没有清零

关于硬件JPEG解码  双缓冲的方式去解码,SD卡 就会卡在状态获取。
如果用单缓冲的机制,就没问题。开哥你现在弄得怎么样了???
回复 支持 反对

使用道具 举报

37

主题

595

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1572
金钱
1572
注册时间
2017-7-17
在线时间
308 小时
发表于 2019-1-23 17:25:23 | 显示全部楼层
qiousanxi 发表于 2018-7-16 16:24
现在好了,连续刷  刷的时间长了就会卡死。正在检查原因

怎么搞定的呀,我也是用硬解码刷了一次后就不能刷第二次了。但是emwin的软解码可以接着刷。
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2019-1-25 09:41:05 | 显示全部楼层
candylife9 发表于 2019-1-23 17:25
怎么搞定的呀,我也是用硬解码刷了一次后就不能刷第二次了。但是emwin的软解码可以接着刷。

看下我别的帖子
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-23 18:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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