Question
stm32 DMA request per channel + multple peripherals
Posted on November 23, 2015 at 16:16
Hi,
I would like to use the DMA with diferent peripherals of a stmHere are the resuming points.
target MCU: STM32L0 purpose : Dma + uart1+uart2+uart3 +spi+i2c For instance i succeded configuring the uart2 with the dma with the following configuration://UART2
hdma_tx.Instance = DMA1_Channel4;
hdma_tx.Init.Request = DMA_REQUEST_4;
__HAL_LINKDMA(UartObject_tS, hdmatx, hdma_tx);
//(...)
HAL_DMA_Init(&hdma_tx);
hdma_rx.Instance = DMA1_Channel5;
hdma_rx.Init.Request = DMA_REQUEST_4;
__HAL_LINKDMA(UartObject_tS, hdmarx, hdma_rx);
//(...)
if i change the configuration to uart1 it would give something like this:
//UART1
hdma_tx.Instance = DMA1_Channel2;
hdma_tx.Init.Request = DMA_REQUEST_3;
__HAL_LINKDMA(UartObject_tS, hdmatx, hdma_tx);
//(...)
HAL_DMA_Init(&hdma_tx);
hdma_rx.Instance = DMA1_Channel3;
hdma_rx.Init.Request = DMA_REQUEST_3;
__HAL_LINKDMA(UartObject_tS, hdmarx, hdma_rx);
//(...)
I tested each one separately and the corresponfding IRQ handler is triggered.
Now if i would like to use the UART1, UART2 and LPUART1 (aka UART3). I would apply the same reasoning.//UART3 aka LPUART1
hdma_tx.Instance = DMA1_Channel7;
hdma_tx.Init.Request = DMA_REQUEST_5;
__HAL_LINKDMA(UartObject_tS, hdmatx, hdma_tx);
//(...)
hdma_rx.Instance = DMA1_Channel6;
hdma_rx.Init.Request = DMA_REQUEST_5;
__HAL_LINKDMA(UartObject_tS, hdmarx, hdma_rx);
//(...)
At this point i think all is ok as each DMA channel has individual peripheral request signals.
But what happens if i need to use the spi2 in the same way knowing that all dma channel request are used?
According the datasheet ( ''only one request shall be enabled at a time'' (p240)) and the dma request mapping (p241) , how can I achieve this ? is it possible ? Shall another strategy be followed? Can other peripheral request signals be mapped in the same dma channel ??
If yes, how are they handdled ?
Thanks in advance. #stm32 #uart #spi #dma