first workable version

Dependencies:   LPC1768_DMA mbed

The test have been created to verify m2m and m2p. In the m2m test, it copy data from source address to destination address using dma. In the m2p test, it send the data from memory to UART via dma. The test is to test the HAL level API. Once the user side API created, more test will be added. I currently only test the m2m and m2p case. It is appreciated if anyone want to test other types and peripherals using the API I created.

main.cpp

Committer:
steniu01
Date:
2014-08-21
Revision:
2:322a046a24ab
Parent:
0:da18b3e74c8c

File content as of revision 2:322a046a24ab:

#include "mbed.h"

#include "LPC1768_dma.h"

volatile uint32_t DMATCCount = 0;
volatile uint32_t DMAErrCount = 0;

void DMA_IRQHandler (void);
uint32_t DMA_Init( uint32_t DMAMode );

RawSerial pc (USBTX, USBRX);

  
int main(void)
{
    
    /* test the DMA M2M, copy data from src to dest, and then print out the dest mem data */
    printf("start to test DMA M2M test!\r\n");
    
    char src[] = "Hello world! \r\n";
    uint8_t size = sizeof (src);
    char *dst  = (char *) malloc(size);
    memset (dst, '\0', size);

    uint32_t DMA_SRC = (uint32_t)src;
    uint32_t DMA_DST = (uint32_t)dst;

    DMA_InitTypeDef dma_init_struct;
    DMA_StructInit(&dma_init_struct);

    /* Initialize structure */
    dma_init_struct.DMA_DestAddr = DMA_DST;
    dma_init_struct.DMA_SrcAddr = DMA_SRC;
    dma_init_struct.DMA_TransferSize = size;
    dma_init_struct.DMA_SrcBurst = 0x01; // 1 byte
    dma_init_struct.DMA_DestBurst = 0x01;
    dma_init_struct.DMA_SrcWidth = 0x00; // byte
    dma_init_struct.DMA_DestWidth = 0x00;
    dma_init_struct.DMA_SrcInc = 1;
    dma_init_struct.DMA_DestInc = 1;
    dma_init_struct.DMA_TermInt = 1; // enable count interrupt:w
    dma_init_struct.DMA_TransferType = M2M;
    
    LPC_SC->PCONP |= (1 << 29);    /* Enable GPDMA clock */
    DMA_init(LPC_GPDMACH0, &dma_init_struct); //initialize the channel
    LPC_GPDMA->DMACConfig = 0x01; // enable DMA and little endian
    while ( (LPC_GPDMA->DMACConfig & 0x01) == 0);

    // set the IRQ routine
    NVIC_SetVector(DMA_IRQn, (uint32_t)DMA_IRQHandler);
    NVIC_EnableIRQ(DMA_IRQn);

    
    DMA_Cmd(LPC_GPDMACH0, ENABLE); // enable channel
    DMA_ITConfig (LPC_GPDMACH0, DMA_ITC, ENABLE);

    
    printf("src text: %s", src);

    while (!DMATCCount);  /* Wait until DMA is done */


    printf("dst text: %s", dst);

    if (strcmp (src, dst) != 0)
        printf("error! \r\n");
    else
        printf("correct! \r\n");

    

/*test m2P, send the memory data to UART;*/
    char src2[] = "Hello world! This message was transmitted via UART DMA from memory \r\n";
    uint8_t size2 = sizeof (src2);

    uint32_t DMA_SRC2 = (uint32_t)src2;
    pc.printf ("start to test M2P \r\n");

 /* Initialize structure */
    LPC_UART0->FCR |= 1<<3 ; //enable UART DMA mode

    dma_init_struct.DMA_DestAddr = (uint32_t) &(LPC_UART0->THR);
    dma_init_struct.DMA_SrcAddr = DMA_SRC2; 
    dma_init_struct.DMA_TransferSize = size2;
    dma_init_struct.DMA_SrcBurst = 0x00; // 1 byte
    dma_init_struct.DMA_DestBurst = 0x00;
    dma_init_struct.DMA_SrcWidth = 0x00; // byte
    dma_init_struct.DMA_DestWidth = 0x00;
    dma_init_struct.DMA_SrcInc = 1;
    dma_init_struct.DMA_DestInc = 0;
    dma_init_struct.DMA_TermInt = 1; // enable count interrupt:w
    dma_init_struct.DMA_TransferType = M2P;
    dma_init_struct.DMA_DestPeripheral = 8;
 
    LPC_SC->PCONP |= (1 << 29);    // Enable GPDMA clock 
        
    DMA_init(LPC_GPDMACH1, &dma_init_struct); //initialize the channel
    LPC_GPDMA->DMACConfig = 0x01; // enable DMA and little endian; have to initial firstly then enable
    while ( (LPC_GPDMA->DMACConfig & 0x01) == 0);

        
    NVIC_SetVector(DMA_IRQn, (uint32_t)DMA_IRQHandler);
    NVIC_EnableIRQ(DMA_IRQn);
    DMA_Cmd(LPC_GPDMACH1, ENABLE); // enable channel
    DMA_ITConfig (LPC_GPDMACH1, DMA_ITC, ENABLE);
    

    while ( DMA_EnabledChannels() && 2);

    while (1);
}

void DMA_IRQHandler (void)
{
    uint32_t regVal;
    DMATCCount++;
    regVal = LPC_GPDMA->DMACIntTCStat;
    if ( regVal )
    {
        DMATCCount++;
        LPC_GPDMA->DMACIntTCClear |= regVal;
    }
    regVal = LPC_GPDMA->DMACIntErrStat;
    if ( regVal )
    {
        DMAErrCount++;
        LPC_GPDMA->DMACIntErrClr |= regVal;
    }
    return;
}