MODDMA GPDMA Controller New features: transfer pins to memory buffer under periodic timer control and send double buffers to DAC

Dependents:   FirstTest WaveSim IO-dma-memmem DACDMAfuncgenlib ... more

Revision:
4:67f327b9278e
Parent:
0:c409efd8df78
Child:
5:c39b22fa0c60
--- a/example1.cpp	Tue Nov 23 15:08:21 2010 +0000
+++ b/example1.cpp	Tue Nov 23 15:33:30 2010 +0000
@@ -2,24 +2,78 @@
 
 #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);
-//Serial pc(USBTX, USBRX);
+Serial pc(USBTX, USBRX);
+
+// 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 dmaCallback(void) {
+int main() {
+    char s[] = "**DMA** ABCDEFGHIJKLMNOPQRSTUVWXYZ **DMA**";
+    
+    pc.baud(PC_BAUD);
+    
+    dma.isrIntTCStat.attach(&dmaTCCallback);
+    dma.isrIntErrStat.attach(&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 )
+    ; // config end
+    
+    // Attach configuration callbacks if required.
+    config->isrIntTCStat->attach(&TC0_callback);
+    config->isrIntErrStat->attach(&ERR0_callback);
+    
+    // Setup the configuration.
+    dma.Setup(config);
+    
+    //dma.Enable( MODDMA::Channel_0 );
+    dma.Enable( config->channelNum() );
+    
+    while (1) {
+        led1 = !led1;
+        wait(0.25);        
+    }
+}
+
+// Main controller TC IRQ callback
+void dmaTCCallback(void) {
     led2 = 1;
 }
 
-void C0callback(void) {
+// Main controller ERR IRQ callback
+void dmaERRCallback(void) {
+    error("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();
@@ -30,42 +84,9 @@
     }
 }
 
-int main() {
-    char s[] = "**DMA** ABCDEFGHIJKLMNOPQRSTUVWXYZ **DMA**";
-    
-    pc.baud(115200);
-    
-    dma.isrIntTCStat.attach(&dmaCallback);
-    
-    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 )
-     ;//->isrIntTCStat->attach(&C0callback)
-    ; // config end
-   
-    dma.Setup(config);
-    
-    //dma.Enable( MODDMA::Channel_0 );
-    dma.Enable( config->channelNum() );
-    
-    pc.printf("123456789\r\n");
-    pc.printf("\r\nRESERVED9 = %p", &LPC_SC->RESERVED9);
-    pc.printf("\r\nOther = %p", &LPC_UART0->DMAREQSEL);
-    
-    while (1) {
-        led1 = !led1;
-        wait(0.2);
-        led1 = !led1;
-        wait(0.2);
-    }
+// Configuration cakllback on Error
+void ERR0_callback(void) {
+    error("Oh no! My Mbed exploded! :( Only kidding, find the problem");
 }
 
 #endif