GPDMA 进行 Byte swap
在新推出的 U5 系列芯片上, 集成了 GPDMA 模块。这是新的通用 DMA 模块,能在传输数据的同时,还有丰富的数据
处理能力。在初始化 GPDMA 时,通过配置源和目的数据位宽为 DMA_SRC_DATAWIDTH_WORD,在数据处理中配
置 DataExchange 为 DMA_EXCHANGE_DEST_BYTE,如下面代码,也能实现 Byte swap 功能。DMA_HandleTypeDef hgpdma_channel0;
DMA_DataHandlingConfTypeDef DataHandlingConfig;
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_GPDMA1_CLK_ENABLE();
hgpdma_channel0.Instance = GPDMA1_Channel0;
hgpdma_channel0.Init.Request = DMA_REQUEST_SW;
hgpdma_channel0.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
hgpdma_channel0.Init.Direction = DMA_MEMORY_TO_MEMORY;
hgpdma_channel0.Init.SrcInc = DMA_SINC_INCREMENTED;
hgpdma_channel0.Init.DestInc = DMA_DINC_FIXED;
hgpdma_channel0.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_WORD;
hgpdma_channel0.Init.DestDataWidth = DMA_DEST_DATAWIDTH_WORD;
hgpdma_channel0.Init.SrcBurstLength = 1;
hgpdma_channel0.Init.DestBurstLength = 1;
hgpdma_channel0.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
hgpdma_channel0.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
hgpdma_channel0.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0 | DMA_DEST_ALLOCATED_PORT1;
hgpdma_channel0.Mode = DMA_NORMAL;
if (HAL_DMA_Init(&hgpdma_channel0) != HAL_OK)
{
Error_Handler( );
}
/* Set data handling block configuration */
//swap bytes in Half-word
DataHandlingConfig.DataExchange = DMA_EXCHANGE_DEST_BYTE;
DataHandlingConfig.DataAlignment = DMA_DATA_RIGHTALIGN_ZEROPADDED;
/* Data handling configuration */
if (HAL_DMAEx_ConfigDataHandling(&hgpdma_channel0, &DataHandlingConfig) != HAL_OK)
{
Error_Handler( );
}
/* DMA interrupt init */
HAL_NVIC_SetPriority(GPDMA1_Channel0_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(GPDMA1_Channel0_IRQn);
HAL_DMA_RegisterCallback(&hgpdma_channel0, HAL_DMA_XFER_CPLT_CB_ID, DMA_Xfer_Cmplt);
}
这样,在图形应用中,既能使用 DMA2D 加速渲染过程,也能使用 GPDMA 的数据处理能力。 通过 GPDMA 直接向
FSMC 接口输出 Byte swap 后的 RGB565 格式的图形数据给 LCD。
|