Skip to main content
SGuic.1
Associate
Feb 22, 2021 9:42 AM UTC
Solved

MDMA transfer not working STM32H7xx

Hello,

I've been trying to transfer some data from AXI-SRAM to DTCM via MDMA but it seems not functional.

The transfer occurs the flag of end of transfer is set yet the data that I have in my DTCM isn't the orignal one contained in the AXI-SRAM.

Also important point to note is that I don't have an error flag.

I have reduced everything to a minimum but yet it doesn't seems functional.

Here is some bits of my code:

#define ADC_IN_BUFFER_SIZE 10
 
__attribute__ ((section(".axi"), used)) uint16_t RandomBuffer[ADC_IN_BUFFER_SIZE]={0x0000};
__attribute__ ((section(".dtcm"), used)) uint16_t samplingBuffer[ADC_IN_BUFFER_SIZE]={0x0000};
 
 
 
void MX_MDMA_Init(void)
{
	//switching on the clock for MDMA
	LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_MDMA);
 
	 NVIC_SetPriority(MDMA_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
	 NVIC_EnableIRQ(MDMA_IRQn);
 
	LL_MDMA_SetTriggerMode(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_BLOCK_TRANSFER);
	LL_MDMA_SetRequestMode(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_REQUEST_MODE_SW);
 
	LL_MDMA_SetDestinationDataSize(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_DEST_DATA_SIZE_HALFWORD);
	LL_MDMA_SetSourceDataSize(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_SRC_DATA_SIZE_HALFWORD);
 
	LL_MDMA_SetDestinationIncMode(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_DEST_INCREMENT);
	LL_MDMA_SetSourceIncMode(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_SRC_INCREMENT);
 
	LL_MDMA_SetDestinationIncSize(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_DEST_INC_OFFSET_HALFWORD);
	LL_MDMA_SetSourceIncSize(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_SRC_INC_OFFSET_HALFWORD);
 
 
	LL_MDMA_SetBufferTransferLength(MDMA, LL_MDMA_CHANNEL_0, 1);
 
 
	LL_MDMA_SetChannelPriorityLevel(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_PRIORITY_VERYHIGH);
 
 
 
	LL_MDMA_SetDestinationAddress(MDMA, LL_MDMA_CHANNEL_0, (uint32_t) samplingBuffer);
	LL_MDMA_SetSourceAddress(MDMA, LL_MDMA_CHANNEL_0, (uint32_t) RandomBuffer);
	LL_MDMA_SetDestBusSelection(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_DEST_BUS_AHB_TCM);
	LL_MDMA_SetSrcBusSelection(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_SRC_BUS_SYSTEM_AXI);
 
 
 
	LL_MDMA_SetBlkRepeatCount(MDMA, LL_MDMA_CHANNEL_0, 0);
	LL_MDMA_SetBlkRepeatDestAddrUpdate(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_BLK_RPT_DEST_ADDR_DECREMENT);
	LL_MDMA_SetBlkRepeatSrcAddrUpdate(MDMA, LL_MDMA_CHANNEL_0, LL_MDMA_BLK_RPT_SRC_ADDR_DECREMENT);
	LL_MDMA_SetBlkRptDestAddrUpdateValue(MDMA, LL_MDMA_CHANNEL_0,ADC_IN_BUFFER_SIZE);
	LL_MDMA_SetBlkRptSrcAddrUpdateValue(MDMA, LL_MDMA_CHANNEL_0,ADC_IN_BUFFER_SIZE);
 
	LL_MDMA_EnableIT_BT(MDMA, LL_MDMA_CHANNEL_0);
	LL_MDMA_EnableIT_TE(MDMA, LL_MDMA_CHANNEL_0);
	LL_MDMA_EnableIT_TC(MDMA, LL_MDMA_CHANNEL_0);
 
}
 
void MDMA_Start(void)
{
	LL_MDMA_SetBlkDataLength(MDMA, LL_MDMA_CHANNEL_0, ADC_IN_BUFFER_SIZE);
	LL_MDMA_EnableChannel(MDMA, LL_MDMA_CHANNEL_0);
}

I call the MX_MDMA_Init() function along with others standard inits and the MDMA_Start() just before the software triggering.

Any clues why things aren't working as intended?

Seb

This topic has been closed for replies.
SGuic.1
SGuic.1Best answer
Associate
Feb 22, 2021 10:48 AM UTC

Okay,

Apparently it is my bad.

It seems that if DCache is used meanwhile MDMA transfers data the transfer gets strange and full of irrelevant data.

Seb

1 reply

SGuic.1
SGuic.1AuthorBest answer
Associate
Feb 22, 2021 10:48 AM UTC

Okay,

Apparently it is my bad.

It seems that if DCache is used meanwhile MDMA transfers data the transfer gets strange and full of irrelevant data.

Seb