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。
|