Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MODDMA by
Revision 4:67f327b9278e, committed 2010-11-23
- Comitter:
- AjK
- Date:
- Tue Nov 23 15:33:30 2010 +0000
- Parent:
- 3:f61c089ca882
- Child:
- 5:c39b22fa0c60
- Commit message:
- 1.1
Changed in this revision
--- a/ChangeLog.c Tue Nov 23 15:08:21 2010 +0000
+++ b/ChangeLog.c Tue Nov 23 15:33:30 2010 +0000
@@ -1,6 +1,10 @@
/* $Id:$
+1.1 - 23/10/2010
+ * Tidied up example1.cpp
+ * Removed some unneeded methoids that cause compiler errs.
+
1.0 - 23/11/2010
* First release
--- a/MODDMA.h Tue Nov 23 15:08:21 2010 +0000
+++ b/MODDMA.h Tue Nov 23 15:33:30 2010 +0000
@@ -21,7 +21,7 @@
@file MODDMA.h
@purpose Adds DMA controller and multiple transfer configurations
- @version 1.0
+ @version 1.1
@date Nov 2010
@author Andy Kirkham
*/
@@ -347,7 +347,7 @@
* @param ChannelNumber Type uin32_t, the channel number to test
* @return bool true if enabled, false otherwise.
*/
- bool Enabled(uint32_t ChannelNumber) { Enabled((CHANNELS)(ChannelNumber & 0x7)); }
+ bool Enabled(uint32_t ChannelNumber) { return Enabled((CHANNELS)(ChannelNumber & 0x7)); }
__INLINE uint32_t IntStat(uint32_t n) { return (1UL << n) & 0xFF; }
__INLINE uint32_t IntTCStat_Ch(uint32_t n) { return (1UL << n) & 0xFF; }
@@ -417,13 +417,6 @@
CHANNELS irqProcessingChannel(void) { return IrqProcessingChannel; }
/**
- * Gets which channel the ISR is currently servicing.
- *
- * @return uint32_t The current channel the ISR is servicing.
- */
- uint32_t irqProcessingChannel(void) { return (uint32_t)(IrqProcessingChannel & 0x7); }
-
- /**
* Sets which type of IRQ the ISR is making a callback for.
*
* *** USED INTERNALLY. DO NOT CALL FROM USER PROGRAMS ***
--- 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
