|

楼主 |
发表于 2023-4-25 22:33:16
|
显示全部楼层
[url=]附件[/url]
左侧是FSMC正常的刷屏,右侧是DMA2D的刷屏,数组是16位指针数组
uint16_t *pColor;
pColor=&image_main_bg_image;
BSP_LCD_DrawBitmap(0, 0, 240, 320, pColor);
BSP_DrawBitmapD2D(240, 0, 240, 320,(uint32_t *) pColor);
[url=]好像还是不行,这是我的DMA2D的配置:[/url]
[url=]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_M2M;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;
hdma2d.Init.OutputOffset = 0;
hdma2d.Init.RedBlueSwap = DMA2D_RB_SWAP;
hdma2d.Init.AlphaInverted = DMA2D_REGULAR_ALPHA;
hdma2d.LayerCfg[1].InputOffset = 0;
hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
hdma2d.LayerCfg[1].InputAlpha = 0xFF; /* 完全不透明 */
hdma2d.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;
hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_SWAP;// DMA2D_RB_REGULAR;//DMA2D_RB_SWAP;
//hdma2d.LayerCfg[1].ChromaSubSampling = DMA2D_NO_CSS;
if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
{
Error_Handler();
}
if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN DMA2D_Init 2 */
/* USER CODE END DMA2D_Init 2 */
}
这是刷屏函数:
void BSP_DrawBitmapD2D(uint16_t x, uint16_t y, uint16_t width, uint16_t height,uint32_t *color)
{
DMA2D_HandleTypeDef hdma2d;
BSP_LCD_SetAddressWindow(x,y, x+width- 1, y+height - 1);
DMA2D->CR &= ~(DMA2D_CR_START); // 停止DMA2D
DMA2D->CR = DMA2D_M2M; // 存储器到存储器
DMA2D->FGMAR = color; ; // 源地址
DMA2D->OMAR = LCD_MemoryAdd; // 目标地址; 由于是MCU屏,所以就是基址,因为前面已经有开窗了 //
DMA2D->FGOR = 0;//OffLineSrc; // 源数据偏移(像素)
DMA2D->OOR = 0;//OffLineDst; // 目标地址偏移(像素)
DMA2D->OPFCCR = DMA2D_OUTPUT_RGB565; // 设置颜色格式
DMA2D->FGPFCCR = DMA2D_INPUT_RGB565; // 设置颜色格式
DMA2D->NLR = (uint32_t)(width<<16)|(height); // 设定长度和宽度
DMA2D->CR |= DMA2D_CR_START; // 启动DMA2D
while (DMA2D->CR & DMA2D_CR_START) ; // 等待传输完成
}
[/url]
|
-
|