请选择 进入手机版 | 继续访问电脑版

安富莱电子论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1277|回复: 13
收起左侧

[开源应用] 【原创开源应用第4期】给ili9488,RA8875等类显示屏的emWin底层增加DMA加速,提供RTX,uCOS和FreeRTOS版本

  [复制链接]

5398

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43766
QQ
发表于 2018-7-6 13:18:44 | 显示全部楼层 |阅读模式
说明:
1、emWin底层中最重要的一个优化就是16bpp绘制,特此为其增加DMA加速,已经支持RA8875和ili9488。
2、使用中务必将emWin任务设置为除了空闲任务,统计任务以外的最低优先级,这样就可以有效的发挥DMA的优势,CPU可以解放出来处理其他任务。

操作说明:
1. 所有界面支持按键操作
(1)K2按键用于控件焦点的切换,切换时,所选择的控件会出现浅色边框
(2)K3按键用于进入下一个界面
(3)摇杆的OK键用于选择相应控件后,触发控件所对应的的操作。

2. 如果使用电阻触摸操作的话,请运行V5开发板emWin教程第三章中的触摸校准程序,此程序会将触摸参数保
   存到EEPROM中,然后再运行此工程即可。电容屏无需校准。

3. 采用触摸方式操作界面时,如果进入到没有按钮控件的界面时,可以点击屏幕中间部分进入下一页。
4. 界面大小自适应主流分辨率,比如480*272,800*480,480*320。

注意事项:
RTX版的例子使用MDK4.74,其它uCOS-III和FreeRTOS不限制,只要支持F407即可。


例程下载:
基于FreeRTOS的emWin底层DMA加速,支持RA8875和ili9488.7z (5.44 MB, 下载次数: 546)
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

16

主题

182

帖子

214

积分

高级会员

积分
214
发表于 2018-7-6 13:56:00 | 显示全部楼层
干货,感谢硬汉
回复

使用道具 举报

1

主题

9

帖子

11

积分

新手上路

积分
11
发表于 2018-12-20 10:44:37 | 显示全部楼层
F1可以使用DMA加速吗
回复

使用道具 举报

5398

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43766
QQ
 楼主| 发表于 2018-12-20 10:57:29 | 显示全部楼层
Allegro_wang 发表于 2018-12-20 10:44
F1可以使用DMA加速吗

没问题。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

104

主题

772

帖子

980

积分

版主

Rank: 7Rank: 7Rank: 7

积分
980
发表于 2019-1-14 14:06:50 | 显示全部楼层

改用DMA后,有没有测试页面刷新时间的变化?
回复

使用道具 举报

5398

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43766
QQ
 楼主| 发表于 2019-1-15 00:21:51 | 显示全部楼层
caicaptain2 发表于 2019-1-14 14:06
改用DMA后,有没有测试页面刷新时间的变化?

差不多,重点是还是降低了CPU负担。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

0

主题

2

帖子

2

积分

新手上路

积分
2
发表于 2019-1-25 23:02:34 | 显示全部楼层
void ILI9488_DrawHColorLine(uint16_t _usX1 , uint16_t _usY1, uint16_t _usWidth, const uint16_t *_pColor)
{
        ILI9488_SetDispWin(_usX1, _usY1, 1, _usWidth);

        ILI9488_REG = 0x2C;
       
#if 0
        {
                uint16_t i;
               
                /* 写显存 */
                for (i = 0; i <_usWidth; i++)
                {
                        ILI9488_RAM = *_pColor++;
                }
        }
#else
        DMA2_Stream7->PAR = (uint32_t )_pColor;
        DMA2_Stream7->NDTR =_usWidth;
        DMA2_Stream7->CR |= 1<<0;       
       
        while(DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) == RESET);
        DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
#endif
}
@eric2013 大神,这个就是DMA加速吗?F103要怎么做呢?
回复

使用道具 举报

0

主题

2

帖子

2

积分

新手上路

积分
2
发表于 2019-1-25 23:18:36 | 显示全部楼层
void LCD_DmaAccelerator(uint32_t _addr)
{
        uint32_t buf; /* 临时定义一个buf,实际操作会切换到有效的地址 */
        DMA_InitTypeDef  DMA_InitStructure;

       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 , ENABLE);
       
        DMA_DeInit(DMA2_Stream7);
       
        while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE)
        {
        }

        /* 配置DMA */
        DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&buf;
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)_addr;
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
        DMA_InitStructure.DMA_BufferSize = 1;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;         
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
        DMA_Init(DMA2_Stream7, &DMA_InitStructure);
}
还有这个103对应要怎么改呢?
回复

使用道具 举报

5398

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43766
QQ
 楼主| 发表于 2019-1-26 00:43:14 | 显示全部楼层
夏枯草 发表于 2019-1-25 23:18
void LCD_DmaAccelerator(uint32_t _addr)
{
        uint32_t buf; /* 临时定义一个buf,实际操作会切换到有效 ...

这个是F4的。

F1的DMA好像每次都要重新初始化一遍,效率不高。你当前可以寄存器操作每次都重新初始化一下,然后逐步精简,看看那些参数可以仅初始化1次后,后面就不用修改了。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

6

主题

189

帖子

201

积分

高级会员

积分
201
发表于 2019-1-26 09:35:29 | 显示全部楼层
下载看看,按键优先级高还是 emWin优先级高
回复

使用道具 举报

5398

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43766
QQ
 楼主| 发表于 2019-1-26 14:36:04 | 显示全部楼层
廷润 发表于 2019-1-26 09:35
下载看看,按键优先级高还是 emWin优先级高

GUI任务推荐设置为仅空闲任务优先级高
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

6

主题

189

帖子

201

积分

高级会员

积分
201
发表于 2019-1-29 08:50:06 | 显示全部楼层
eric2013 发表于 2019-1-26 14:36
GUI任务推荐设置为仅空闲任务优先级高

嗯, 如果平衡考虑 emWin和 按键检测这两个优先级。
感觉emWin优先级高会影响体验,按键检测优先极高就需要评估好时间差来综合把控。
回复

使用道具 举报

5398

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43766
QQ
 楼主| 发表于 2019-1-29 09:30:31 | 显示全部楼层
廷润 发表于 2019-1-29 08:50
嗯, 如果平衡考虑 emWin和 按键检测这两个优先级。
感觉emWin优先级高会影响体验,按键检测优先极高就 ...

这里隐含了一个重要的知识点就是emWin做DMA刷图时要死等,放在低优先级任务里面,可以有效的利用DMA。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

6

主题

189

帖子

201

积分

高级会员

积分
201
发表于 2019-2-12 09:31:57 | 显示全部楼层
eric2013 发表于 2019-1-29 09:30
这里隐含了一个重要的知识点就是emWin做DMA刷图时要死等,放在低优先级任务里面,可以有效的利用DMA。

隐含的东西,就是这么有趣
好事多磨
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|安富莱电子论坛 ( 鄂ICP备09023347号,公安机关备案号42010602000201 )

GMT+8, 2019-3-23 14:49 , Processed in 0.211462 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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