1、回顾
链接: 利用FreeRTOS驱动ILI9488液晶
前面我写了“FreeRTOS驱动ILI9488液晶”的代码,但是全程是使用CPU进行数据传送的,效率很低,所以本章进行DMA数据传输,解放CPU。整个工程代码可以第四章链接中免费下载
2、配置DMA
CubeMX中配置DMA,如下图所示
配置说明:
1、使用DMA传输数据的路径是从内存传输到FSMC中,都是在单片机内部进行,所以是Memory To Memory;
2、按照正常模式即可;
3、因为只是实现刷屏一种颜色,所以不需要源地址自增,而目的地址只能是FSMC的映射地址0x64000002,所以也不自增;
4、因为使用的是RGB565格式,所以字宽为半字。
完成上述配置后,将DMA相关配置代码添加进上期代码中,如下图所示
3、修改代码
void LCD_WritePixels(uint16_t color)
{
// 写入命令不能被打断
taskENTER_CRITICAL();
LCDSendCmd(0X2C);
taskEXIT_CRITICAL();
// DMA传输是不会被打断的,是硬件行为,相当于原子操作
// 设置DMA最多传送2的16次方,也就是65536,而屏幕像素的大小为153600,于是让DMA分3次传输数据,每次51200个数据
// 判断DMA传输完成的标志可用AL_DMA_PollForTransfer()函数实现
/* 传送第一次 */
HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)&colorx, 0x64000002, 51200);
HAL_DMA_PollForTransfer(&hdma_memtomem_dma1_channel1, HAL_DMA_FULL_TRANSFER, 51200);
/* 传送第二次 */
HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)&colorx, 0x64000002, 51200);
HAL_DMA_PollForTransfer(&hdma_memtomem_dma1_channel1, HAL_DMA_FULL_TRANSFER, 51200);
/* 传送第三次 */
HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)&colorx, 0x64000002, 51200);
HAL_DMA_PollForTransfer(&hdma_memtomem_dma1_channel1, HAL_DMA_FULL_TRANSFER, 51200);
}
4、工程代码
链接: DMA传输LCD数据