Fork of Andy Kirkham's MODDMA GPDMA Controller for Mbed OS 6
Read MODDMA for more info.
Diff: example1.h
- Revision:
- 19:bf3ae4c3635d
- Parent:
- 12:1dfee7208043
--- a/example1.h Sat Dec 10 09:59:10 2022 +0000 +++ b/example1.h Mon Dec 12 15:05:21 2022 +0000 @@ -1,81 +1,89 @@ #include "mbed.h" #include "MODDMA.h" -#include "MODSERIAL.h" -DigitalOut led1(LED1); -DigitalOut led2(LED2); -DigitalOut led3(LED3); -DigitalOut led4(LED4); -MODDMA dma; -MODSERIAL pc(USBTX, USBRX); +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); +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"); -int main() { - char s[] = "**DMA** ABCDEFGHIJKLMNOPQRSTUVWXYZ **DMA**"; - - pc.baud(PC_BAUD); - - dma.attach_tc( &dmaTCCallback ); - dma.attach_err( &dmaERRCallback ); - - MODDMA_Config *config = new MODDMA_Config; - config - ->channelNum ( MODDMA::Channel_0 ) - ->srcMemAddr ( (uint32_t) &s ) - ->dstMemAddr ( 0 ) - ->transferSize ( sizeof(s) ) - ->transferType ( MODDMA::m2p ) - ->transferWidth ( 0 ) - ->srcConn ( 0 ) - ->dstConn ( MODDMA::UART0_Tx ) - ->dmaLLI ( 0 ) - ->attach_tc ( &TC0_callback ) - ->attach_err ( &ERR0_callback ) - ; // config end - + 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 ); - + dma.Enable(config); + while (1) { led1 = !led1; - wait(0.25); + ThisThread::sleep_for(250ms); } } // Main controller TC IRQ callback -void dmaTCCallback(void) { +void dmaTCCallback(void) +{ led2 = 1; } // Main controller ERR IRQ callback -void dmaERRCallback(void) { - error("Oh no! My Mbed exploded! :( Only kidding, find the problem"); +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 +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) { + if (dma.irqType() == MODDMA::TcIrq) { led3 = 1; dma.clearTcIrq(); } + if (dma.irqType() == MODDMA::ErrIrq) { led4 = 1; dma.clearErrIrq(); @@ -83,7 +91,7 @@ } // Configuration cakllback on Error -void ERR0_callback(void) { - error("Oh no! My Mbed exploded! :( Only kidding, find the problem"); +void ERR0_callback(void) +{ + printf("Oh no! My Mbed exploded! :( Only kidding, find the problem"); } -