AnsweredAssumed Answered

K22 DMA UART Circular Buffer

Question asked by Matt Lang on Mar 3, 2015
Latest reply on Jan 28, 2016 by Matt Lang

I'm trying to make a circular buffer that reads the Rx data from UART0 and triggers a dma request that sticks the data in a buffer that I define. I'm getting confused on the function EDMA_DRV_Init. When I step through the function, it throws an exception when it try to write to the g_edma pointer. Attached is the source file that has the EDMA_DRV_Init in it.


How do I use the EDMA_DRV_Init function

Also, is the DMA registers set up correctly in the DMAInit()?

uart_status_t DMAInit(uint32_t instance, uart_edma_state_t * uartEdmaStatePtr);


/* init the dma driver */

edma_state_t *edmaState;



const edma_user_config_t edmaUserConfig = {
.chnArbitration = kEDMAChnArbitrationRoundrobin,
.notHaltOnError = true,


//This is where it is currently failing!!

EDMA_DRV_Init(edmaState, &edmaUserConfig);




uart_edma_state_t uartEdmaState;

DMAInit(0u, &uartEdmaState);



uart_status_t DMAInit(uint32_t instance, uart_edma_state_t * uartEdmaStatePtr) {




  assert(instance < HW_UART_INSTANCE_COUNT);



    dma_request_source_t uartTxEdmaRequest = kDmaRequestMux0Disable;

    dma_request_source_t uartRxEdmaRequest = kDmaRequestMux0Disable;

    uint32_t edmaBaseAddr;

    uint32_t edmaChannel;

    uint32_t baseAddr = g_uartBaseAddr[instance];







    /* Clear the state structure for this instance. */

    memset(uartEdmaStatePtr, 0, sizeof(uart_edma_state_t));





    switch (instance)


        case 0:

            uartRxEdmaRequest = kDmaRequestMux0UART0Rx;

            uartTxEdmaRequest = kDmaRequestMux0UART0Tx;


        case 1:

            uartRxEdmaRequest = kDmaRequestMux0UART1Rx;

            uartTxEdmaRequest = kDmaRequestMux0UART1Tx;


        default :





    /*--------------- Setup RX ------------------*/

    /* Request DMA channels for RX FIFO. */

    EDMA_DRV_RequestChannel(kEDMAAnyChannel, uartRxEdmaRequest,


   // EDMA_DRV_InstallCallback(&uartEdmaStatePtr->edmaUartRx,

    //                UART_DRV_EdmaRxCallback, (void *)instance);



    edmaBaseAddr = VIRTUAL_CHN_TO_EDMA_MODULE_REGBASE(uartEdmaStatePtr->;

    edmaChannel = VIRTUAL_CHN_TO_EDMA_CHN(uartEdmaStatePtr->;



    /* Setup destination */

    EDMA_HAL_HTCDSetDestAddr(edmaBaseAddr, edmaChannel, (uint32_t)blueStreamDmaRxBuffer);

    EDMA_HAL_HTCDSetDestOffset(edmaBaseAddr, edmaChannel, 1);

    EDMA_HAL_HTCDSetDestLastAdjust(edmaBaseAddr, edmaChannel, 0);



    /* Setup source */

    EDMA_HAL_HTCDSetSrcAddr(edmaBaseAddr, edmaChannel, UART_HAL_GetDataRegAddr(baseAddr));

    EDMA_HAL_HTCDSetSrcOffset(edmaBaseAddr, edmaChannel, 1);

    EDMA_HAL_HTCDSetSrcLastAdjust(edmaBaseAddr, edmaChannel, 0);



    /* Setup transfer properties */

    EDMA_HAL_HTCDSetNbytes(edmaBaseAddr, edmaChannel, 1);

    EDMA_HAL_HTCDSetChannelMinorLink(edmaBaseAddr, edmaChannel, 0, false);

    EDMA_HAL_HTCDSetAttribute(edmaBaseAddr, edmaChannel, kEDMAModuloDisable, kEDMAModulo128bytes, kEDMATransferSize_1Bytes, kEDMATransferSize_1Bytes);

    EDMA_HAL_HTCDSetScatterGatherCmd(edmaBaseAddr, edmaChannel, false);

    EDMA_HAL_HTCDSetDisableDmaRequestAfterTCDDoneCmd(edmaBaseAddr, edmaChannel, false);





    UART_HAL_SetRxDmaCmd(baseAddr, true);





    return kStatus_UART_Success;


Original Attachment has been moved to: