需求

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 的接口函数,实现中用于加速内存复制和颜色混合。

参考