STM32 DMA2D 使用

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

<span title='2023-11-22 18:59:00 +0800 CST'>2023-11-22</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;167 words&nbsp;·&nbsp;RamLife

stm32使用FMC控制 LCD 时,图像不正常

需求 stm32 使用 fmc 来控制 Lcd 显示时,碰到了两个问题: 图像变小了,并且是双份显示 屏幕只显示了 4/5,最下面花屏 解决 经过网络搜索和反复的调试,终于找到问题。 图像变小 这个是 fmc 的时序配置有问题,导致使用 DMA2D 进行数据传输时,lcd 会丢数据,然后图像就变小了。这个解决只需要对照 lcd 的芯片中的时间参数,重新设置 fmc 的时序参数即可解决。 图像只显示 4/5 这个是 FMC 的地址线的问题。 我们需要重新考虑一下为什么可以使用 fmc 来控制 lcd 显示,理论上来说, DMA2D 写入数据的时候,地址是自动增长的啊! 其实因为我们只使用了一根地址线,那么写入数据的时候,这个地址线的低位就算增长也没有关系,毕竟我们只使用了最高位作为地址线,只要使用 DMA2D 写入的数据不会超过最高位,那么就不会有影响。 所以这次的错误就是 DMA2D 在全屏写入的时候, 320*240 = 76800, 而当前的地址线使用的是 A16,那么能够提供的空间只有 2的16次方 = 65536,已经溢出了。解决的方法也很简单,使用 A17 地址线即可。 参考 DMA2D skips pixels when sending directly to display over FMC STM32 FMC Display STM32的FSMC时序解析 【12】、STM32F767——————>FMC之LCD屏 STM32H755BIT DMA2D + FMC + External SRAM Write Issue

<span title='2023-11-22 18:59:00 +0800 CST'>2023-11-22</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;76 words&nbsp;·&nbsp;RamLife