cancel
Showing results for 
Search instead for 
Did you mean: 

MDMA transfer not working STM32H7xx

SGuic.1
Associate II

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

1 ACCEPTED SOLUTION

Accepted Solutions
SGuic.1
Associate II

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

View solution in original post

1 REPLY 1
SGuic.1
Associate II

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