【原创开源应用第4期】给ili9488,RA8875等类显示屏的emWin底层增加DMA加速,提供RTX,uCOS和FreeRTOS版本
说明: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即可。
static/image/hrline/4.gif
百度云:
链接: https://pan.baidu.com/s/1rP3yBS2zBNlu9bnXSQrNrw 提取码: 855v
例程下载:
http://www.armbbs.cn/static/image/hrline/4.gif
效果:
干货,感谢硬汉 F1可以使用DMA加速吗 Allegro_wang 发表于 2018-12-20 10:44
F1可以使用DMA加速吗
没问题。 eric2013 发表于 2018-12-20 10:57
没问题。
改用DMA后,有没有测试页面刷新时间的变化?
caicaptain2 发表于 2019-1-14 14:06
改用DMA后,有没有测试页面刷新时间的变化?
差不多,重点是还是降低了CPU负担。 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要怎么做呢? void LCD_DmaAccelerator(uint32_t _addr)
{
uint32_t buf; /* 临时定义一个buf,实际操作会切换到有效的地址 */
DMA_InitTypeDefDMA_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对应要怎么改呢? 夏枯草 发表于 2019-1-25 23:18
void LCD_DmaAccelerator(uint32_t _addr)
{
uint32_t buf; /* 临时定义一个buf,实际操作会切换到有效 ...
这个是F4的。
F1的DMA好像每次都要重新初始化一遍,效率不高。你当前可以寄存器操作每次都重新初始化一下,然后逐步精简,看看那些参数可以仅初始化1次后,后面就不用修改了。 下载看看,按键优先级高还是 emWin优先级高:) 廷润 发表于 2019-1-26 09:35
下载看看,按键优先级高还是 emWin优先级高
GUI任务推荐设置为仅空闲任务优先级高 eric2013 发表于 2019-1-26 14:36
GUI任务推荐设置为仅空闲任务优先级高
嗯, 如果平衡考虑 emWin和 按键检测这两个优先级。
感觉emWin优先级高会影响体验,按键检测优先极高就需要评估好时间差来综合把控。 廷润 发表于 2019-1-29 08:50
嗯, 如果平衡考虑 emWin和 按键检测这两个优先级。
感觉emWin优先级高会影响体验,按键检测优先极高就 ...
这里隐含了一个重要的知识点就是emWin做DMA刷图时要死等,放在低优先级任务里面,可以有效的利用DMA。 eric2013 发表于 2019-1-29 09:30
这里隐含了一个重要的知识点就是emWin做DMA刷图时要死等,放在低优先级任务里面,可以有效的利用DMA。
隐含的东西,就是这么有趣:)
好事多磨:handshake 好东西,谢谢楼主分享。
标记一下:给ili9488,RA8875等类显示屏的emWin底层增加DMA加速 这么做体验上会有变化吗? alban 发表于 2021-1-27 10:13
这么做体验上会有变化吗?
降低CPU利用率。 那如果一直是dma操作死等的话, 在低优先级条件下应该没多少意义 jcx0324 发表于 2021-4-25 09:26
那如果一直是dma操作死等的话, 在低优先级条件下应该没多少意义
谈一下常用的 DMA2D,MDMA和通用DMA1,DMA2应用分类,为什么有些DMA应用是死等
http://www.armbbs.cn/forum.php?mod=viewthread&tid=99646&fromuid=58
(出处: 硬汉嵌入式论坛)
请教各位大神,这个程序移植到F1,有关RA8875需要做哪些改动?谢谢 bbtclj 发表于 2021-8-30 10:56
请教各位大神,这个程序移植到F1,有关RA8875需要做哪些改动?谢谢
类似的,主要是16bpp的实现做了个DMA方式 谢谢楼主的回复。再请教一个问题:我现在需要用RA8876,需做那些改动,谢谢 bbtclj 发表于 2021-9-7 10:38
谢谢楼主的回复。再请教一个问题:我现在需要用RA8876,需做那些改动,谢谢
一样,也可以采用同样的方法。 我试试看,能得到您的指点,非常感谢! 很好的资源,感谢分享
页:
[1]