本帖最后由 cooldog123pp 于 2024-10-11 08:05 编辑
先介绍一下DMA2D,在实际使用LTDC控制器控制液晶屏时,使LTDC正常工作后,往配置好的显存地址写入要显示的像素数据,LTDC就会把这些数据从显存搬运到液晶面板进行显示,而显示数据的容量非常大,所以我们希望能用DMA来操作,针对这个需求,STM32专门定制了DMA2D外设,它可用于快速绘制矩形、直线、分层数据混合、数据复制以及进行图像数据格式转换,可以把它理解为图形专用的DMA。
我这边也是学习了官方的demo,首先要配置LTDC和DMA2D,LTDC不赘述了,看下DMA2D
配置完成后看下,初始化调用和初始化程序
static void MX_DMA2D_Init(void)
{
/* USER CODE BEGIN DMA2D_Init 0 */
/* USER CODE END DMA2D_Init 0 */
/* USER CODE BEGIN DMA2D_Init 1 */
/* USER CODE END DMA2D_Init 1 */
hdma2d.Instance = DMA2D;
hdma2d.Init.Mode = DMA2D_R2M;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB4444;
hdma2d.Init.OutputOffset = 0;
if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN DMA2D_Init 2 */
/* USER CODE END DMA2D_Init 2 */
}
先要定义一个buffer,然后通过HAL_DMA2D_Start_IT打开DMA2D,画一个蓝色方框
hal_status = HAL_DMA2D_Start_IT(&hdma2d,
0xF0FF, /* Color value in Register to Memory DMA2D mode */
(uint32_t)&aBufferResult, /* DMA2D output buffer */
LAYER_SIZE_X, /* width of buffer in pixels */
LAYER_SIZE_Y); /* height of buffer in lines */
可以看下效果
在此过程中,我用stm32cubeide的工程调试时总是报错,后来换成mdk就OK不知道哪位大神知道原因,报错如下:
|