This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP432P4111: Power consumption goes up when DMA is used

Part Number: MSP432P4111

We're using DMA for our transmit buffers on a few different ports, including UARTs and I2C.  We're monitoring current to the board, and we're finding that when DMA is initialized on either of two of the UART ports the current increases by about 200 micro-amps, which is significant compared to the baseline 500 micro-amps.  Using the DMA on I2C has no effect on the current.

I can keep the current low by not using DMA, sending bytes out through the port in a loop, but then there's a performance hit.

Is there any reason using the DMA would increase the current draw to the board?  I cannot think of any explanation hardware wise.

The code for invoking the DMA looks like this:

DMA_disableChannel(DMA_CHANNEL_0);
DMA_assignChannel(DMA_CH0_EUSCIA0TX);
DMA_disableChannelAttribute(DMA_CH0_EUSCIA0TX,UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |UDMA_ATTR_HIGH_PRIORITY |UDMA_ATTR_REQMASK);
DMA_setChannelControl(DMA_CHANNEL_0| UDMA_PRI_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
DMA_setChannelTransfer(DMA_CH0_EUSCIA0TX| UDMA_PRI_SELECT, UDMA_MODE_BASIC, (void *)rs485Env.u32MsgBufAddr, RS485_UART_TX_DMA_BUF_ADDR, u16TxSize);
DMA_assignInterrupt(DMA_INT0, DMA_CHANNEL_0);

DMA_enableChannel(DMA_CHANNEL_0);

  • Another observation is I can keep the power down by disabling the DMA module when the DMA finishes transmitting, then re-enabling the DMA module when the next message is to be queued, but there are three UART channels and one I2C channel using the DMA simultaneously, so I notice dropouts in the communications when there's a lot of traffic.  I also tried disabling/enabling the DMA in a back-to-back operation, like so:

    DMA_disableModule();

    DMA_enableModule();

    but the effect on the communications dropouts was worse.

  • I was able to make it work using a semaphore to keep track of which port is using the DMA so that the DMA module is not disabled when a port is in the midst of a transition, but it still begs the question of why the power goes up by over 200 uA.  Now when a port needs to transmit a message it verifies whether the DMA module is enabled, enables it if necessary, and initiates the transmission.  When the transmission is complete, the flag corresponding to that port is cleared, and if all flags are cleared no one is using the DMA, so the DMA is disabled.

  • Hi,

    Is the MCU in STOP mode when you initialize the DMA? The extra current consumption might related to powering up the MDA clock source.

    Best regards,

    Cash Hao

  • Can you elaborate what you mean by STOP mode?  We are in LPM3, if that's what you mean.

    Thanks.

  • Hello,

    Is anyone looking into this?  I may have a workaround, but I'm not comfortable with the lack of an explanation of why the power goes up when the DMA is active on the UART ports.  Since there's no explanation in hardware (at least externally), I'm wondering if there's an issue at the silicon level, and if so, the chip designer(s) at TI may want to investigate.

    Thanks