硬汉嵌入式论坛

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

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

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106420
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即可。


百度云:
链接: https://pan.baidu.com/s/1rP3yBS2zBNlu9bnXSQrNrw 提取码: 855v

例程下载:
基于FreeRTOS的emWin底层DMA加速,支持RA8875和ili9488.7z (5.44 MB, 下载次数: 976)
基于RTX的emWin底层DMA加速,支持RA8875和ili9488.7z (4.33 MB, 下载次数: 625)
基于uCOS-III的emWin底层DMA加速,支持RA8875和ili9488.7z (5.64 MB, 下载次数: 524)


效果:
12_58_9a416c156bb41bd.png




回复

使用道具 举报

32

主题

295

回帖

391

积分

高级会员

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

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

没问题。
回复

使用道具 举报

332

主题

2031

回帖

3032

积分

版主

Rank: 7Rank: 7Rank: 7

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

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

差不多,重点是还是降低了CPU负担。
回复

使用道具 举报

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对应要怎么改呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106420
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次后,后面就不用修改了。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

GUI任务推荐设置为仅空闲任务优先级高
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

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

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

这里隐含了一个重要的知识点就是emWin做DMA刷图时要死等,放在低优先级任务里面,可以有效的利用DMA。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

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

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

使用道具 举报

3

主题

39

回帖

48

积分

新手上路

积分
48
QQ
发表于 2020-8-24 09:02:38 | 显示全部楼层
好东西,谢谢楼主分享。
标记一下:给ili9488,RA8875等类显示屏的emWin底层增加DMA加速
回复

使用道具 举报

4

主题

16

回帖

28

积分

新手上路

积分
28
发表于 2021-1-27 10:13:29 | 显示全部楼层
这么做体验上会有变化吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106420
QQ
 楼主| 发表于 2021-1-27 14:59:19 | 显示全部楼层
alban 发表于 2021-1-27 10:13
这么做体验上会有变化吗?

降低CPU利用率。
回复

使用道具 举报

116

主题

798

回帖

1146

积分

至尊会员

积分
1146
QQ
发表于 2021-4-25 09:26:50 | 显示全部楼层
那如果一直是dma操作死等的话, 在低优先级条件下应该没多少意义
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106420
QQ
 楼主| 发表于 2021-4-26 12:34:32 | 显示全部楼层
jcx0324 发表于 2021-4-25 09:26
那如果一直是dma操作死等的话, 在低优先级条件下应该没多少意义

谈一下常用的 DMA2D,MDMA和通用DMA1,DMA2应用分类,为什么有些DMA应用是死等
http://www.armbbs.cn/forum.php?m ... 9646&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2021-8-30 10:56:59 | 显示全部楼层
请教各位大神,这个程序移植到F1,有关RA8875需要做哪些改动?谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106420
QQ
 楼主| 发表于 2021-8-30 13:24:23 | 显示全部楼层
bbtclj 发表于 2021-8-30 10:56
请教各位大神,这个程序移植到F1,有关RA8875需要做哪些改动?谢谢

类似的,主要是16bpp的实现做了个DMA方式
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2021-9-7 10:38:36 | 显示全部楼层
谢谢楼主的回复。再请教一个问题:我现在需要用RA8876,需做那些改动,谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106420
QQ
 楼主| 发表于 2021-9-7 11:56:02 | 显示全部楼层
bbtclj 发表于 2021-9-7 10:38
谢谢楼主的回复。再请教一个问题:我现在需要用RA8876,需做那些改动,谢谢

一样,也可以采用同样的方法。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2021-9-7 15:38:44 | 显示全部楼层
我试试看,能得到您的指点,非常感谢!
回复

使用道具 举报

5

主题

14

回帖

29

积分

新手上路

积分
29
发表于 2021-9-9 18:16:37 | 显示全部楼层
很好的资源,感谢分享
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 15:55 , Processed in 0.258163 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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