需求
stm32 使用 dma2d 来加速显示
解决
DMA2D 的优点
主要就是图像中的局部矩形区域的硬件数据传输。比 DMA 的好处,就是局部矩形区域中,换行的时候,自动计算地址,并转到局部区域第二行的首地址。
其他的就是颜色格式转换和透明度混合。
DMA2D 加速 lcd 显示
DMA2D 加速 LCD 显示的前提是,LCD 的驱动是硬件驱动,比如说,使用 FMC 或者 LTDC 之类的硬件驱动 LCD,程序只需要向地址写入数据,就可以显示。
能够加速的主要是: 图像数据,直线,清屏等。主要需要实现的其实就是两个函数: Dma2dCopy
, Dma2dFill
.
// fill color
void Dma2dFill(void * dest, uint32_t width, uint32_t height,
uint32_t line_offset, uint32_t color, uint32_t pixel_format)
{
DMA2D->CR = DMA2D_R2M;//0x00030000UL | (1 << 9);
DMA2D->OCOLR = color;
DMA2D->OMAR = (uint32_t)dest;
DMA2D->OOR = line_offset;
DMA2D->OPFCCR = pixel_format; //LTDC_PIXEL_FORMAT_RGB565;
DMA2D->NLR = (uint32_t)(width << 16) | (uint16_t)height;
DMA2D->CR |= DMA2D_CR_START;
while (DMA2D->CR & DMA2D_CR_START) {}
}
// copy color data
void Dma2dCopy(void * dest, const void * src, uint32_t width, uint32_t height,
uint32_t dest_line_offset, uint32_t src_line_offset, uint32_t pixel_format)
{
DMA2D->CR = DMA2D_M2M;//0x00000000UL | (1 << 9);
DMA2D->FGMAR = (uint32_t)src;
DMA2D->OMAR = (uint32_t)dest;
DMA2D->FGOR = src_line_offset;
DMA2D->OOR = dest_line_offset;
DMA2D->FGPFCCR = pixel_format; //LTDC_PIXEL_FORMAT_RGB565;
DMA2D->OPFCCR = pixel_format; //LTDC_PIXEL_FORMAT_RGB565;
DMA2D->NLR = (uint32_t)(width << 16) | (uint16_t)height;
DMA2D->CR |= DMA2D_CR_START;
while (DMA2D->CR & DMA2D_CR_START) {}
}
DMA2D 加速显存
主要是用在实现各种 gui 的接口函数,实现中用于加速内存复制和颜色混合。