Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 63 additions & 1 deletion Processors/TFT_eSPI_STM32.c
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,69 @@ bool TFT_eSPI::initDMA(bool ctrl_cs)

return DMA_Enabled = true;
}
#endif // End of STM32F1/2/4/7xx

#elif defined (STM32L4xx)
/***************************************************************************************
** Function name: DMA1_ChannelX_IRQHandler
** Description: Override the default HAL DMA interrupt handler for STM32L4
***************************************************************************************/
#if (TFT_SPI_PORT == 1)
extern "C" void DMA1_Channel3_IRQHandler();
void DMA1_Channel3_IRQHandler(void)
#elif (TFT_SPI_PORT == 2)
extern "C" void DMA1_Channel5_IRQHandler();
void DMA1_Channel5_IRQHandler(void)
#endif
{
HAL_DMA_IRQHandler(&dmaHal);
}

/***************************************************************************************
** Function name: initDMA
** Description: Initialise DMA for STM32L4xx (CSELR-based request routing)
***************************************************************************************/
bool TFT_eSPI::initDMA(bool ctrl_cs)
{
(void)ctrl_cs; // Not used for STM32

__HAL_RCC_DMA1_CLK_ENABLE(); // Enable DMA1 clock

// The SPI peripheral is already configured and enabled by Arduino's SPI.begin(),
// but spiHal is a separate HAL handle with only Instance set. HAL_SPI_Transmit_DMA
// requires State == HAL_SPI_STATE_READY, so we must set it here. After each
// completed DMA transfer, the HAL callback resets State back to READY automatically.
spiHal.State = HAL_SPI_STATE_READY;

// STM32L4xx uses CSELR register for DMA request routing (not DMAMUX)
// DMA_REQUEST_1 routes SPI TX to the selected DMA channel via CSELR
// Ref: STM32CubeL4 SPI_FullDuplex_ComDMA example (NUCLEO-L432KC)
dmaHal.Init.Request = DMA_REQUEST_1;

dmaHal.Init.Direction = DMA_MEMORY_TO_PERIPH;
dmaHal.Init.PeriphInc = DMA_PINC_DISABLE;
dmaHal.Init.MemInc = DMA_MINC_ENABLE;
dmaHal.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
dmaHal.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
dmaHal.Init.Mode = DMA_NORMAL;
dmaHal.Init.Priority = DMA_PRIORITY_HIGH;

__HAL_LINKDMA(&spiHal, hdmatx, dmaHal);

if (HAL_DMA_Init(&dmaHal) != HAL_OK) {
return DMA_Enabled = false;
}

#if (TFT_SPI_PORT == 1)
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
#elif (TFT_SPI_PORT == 2)
HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
#endif

return DMA_Enabled = true;
}
#endif // End of STM32F1/2/4/7xx/L4xx

/***************************************************************************************
** Function name: deInitDMA
Expand Down
12 changes: 12 additions & 0 deletions Processors/TFT_eSPI_STM32.h
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,18 @@
#define INIT_TFT_DATA_BUS spiHal.Instance = SPI2; \
dmaHal.Instance = DMA1_Channel5
#endif

#elif defined (STM32L4xx)
// STM32L4xx series with CSELR-based DMA request routing
#define STM32_DMA
#if (TFT_SPI_PORT == 1)
#define INIT_TFT_DATA_BUS spiHal.Instance = SPI1; \
dmaHal.Instance = DMA1_Channel3
#elif (TFT_SPI_PORT == 2)
#define INIT_TFT_DATA_BUS spiHal.Instance = SPI2; \
dmaHal.Instance = DMA1_Channel5
#endif

#else
// For STM32 processor with no implemented DMA support (yet)
#if (TFT_SPI_PORT == 1)
Expand Down