Fork of Andy Kirkham's MODDMA GPDMA Controller for Mbed OS 6

Read MODDMA for more info.

example1.h

Committer:
hudakz
Date:
16 months ago
Revision:
20:01d0a680e45a
Parent:
19:bf3ae4c3635d

File content as of revision 20:01d0a680e45a:

#include "mbed.h"
#include "MODDMA.h"

DigitalOut  led1(LED1);
DigitalOut  led2(LED2);
DigitalOut  led3(LED3);
DigitalOut  led4(LED4);
MODDMA      dma;

// Function prototypes for IRQ callbacks.
// See definitions following main() below.
void        dmaTCCallback(void);
void        dmaERRCallback(void);
void        TC0_callback(void);
void        ERR0_callback(void);

/**
 * @brief
 * @note
 * @param
 * @retval
 */
int main()
{
    char    s[] = "**DMA** ABCDEFGHIJKLMNOPQRSTUVWXYZ **DMA**";

    printf("\r\nStarting\r\n");

    dma.attach_tc(&dmaTCCallback);
    dma.attach_err(&dmaERRCallback);

    MODDMA_Config*  config = new MODDMA_Config;

    config->channelNum(MODDMA::Channel_0);
    config->srcMemAddr((uint32_t) & s);
    config->dstMemAddr(0);
    config->transferSize(sizeof(s));
    config->transferType(MODDMA::m2p);
    config->transferWidth(0);
    config->srcConn(0);
    config->dstConn(MODDMA::UART0_Tx);
    config->dmaLLI(0)->attach_tc(&TC0_callback);
    config->attach_err(&ERR0_callback);

    // Setup the configuration.
    dma.Setup(config);

    //dma.Enable( MODDMA::Channel_0 );
    //dma.Enable( config->channelNum() );
    dma.Enable(config);

    while (1) {
        led1 = !led1;
        ThisThread::sleep_for(250ms);
    }
}

// Main controller TC IRQ callback
void dmaTCCallback(void)
{
    led2 = 1;
}

// Main controller ERR IRQ callback
void dmaERRCallback(void)
{
    printf("Oh no! My Mbed exploded! :( Only kidding, find the problem");
}

// Configuration callback on TC
void TC0_callback(void)
{
    MODDMA_Config*  config = dma.getConfig();

    dma.haltAndWaitChannelComplete((MODDMA::CHANNELS) config->channelNum());
    dma.Disable((MODDMA::CHANNELS) config->channelNum());

    // Configurations have two IRQ callbacks for TC and Err so you
    // know which you are processing. However, if you want to use
    // a single callback function you can tell what type of IRQ
    // is being processed thus:-
    if (dma.irqType() == MODDMA::TcIrq) {
        led3 = 1;
        dma.clearTcIrq();
    }

    if (dma.irqType() == MODDMA::ErrIrq) {
        led4 = 1;
        dma.clearErrIrq();
    }
}

// Configuration cakllback on Error
void ERR0_callback(void)
{
    printf("Oh no! My Mbed exploded! :( Only kidding, find the problem");
}