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
Diff: example2.cpp
- Revision:
- 8:cb4d323ce6fd
- Child:
- 9:e7ecf909e834
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/example2.cpp Sat Feb 05 08:53:26 2011 +0000
@@ -0,0 +1,140 @@
+#ifdef COMPILE_EXAMPLE2_CODE_MODDMA
+
+/*
+ * This example was provided to support Mbed forum thread:-
+ * http://mbed.org/forum/mbed/topic/1798
+ */
+
+#include "mbed.h"
+#include "MODDMA.h"
+
+#define SAMPLE_BUFFER_LENGTH 32
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+
+MODDMA dma;
+Serial pc(USBTX, USBRX);
+
+// ISR set's this when transfer complete.
+bool dmaTransferComplete = false;
+
+// Function prototypes for IRQ callbacks.
+// See definitions following main() below.
+void TC0_callback(void);
+void ERR0_callback(void);
+
+int main() {
+
+ // Create a buffer to hold the ADC samples and clear it.
+ // Note, we are going to sample two ADC inputs so they
+ // end up in this buffer "interleaved". So you will want
+ // a buffer twice this size to a real life given sample
+ // frequency. See the printf() output for details.
+ uint32_t adcInputBuffer[SAMPLE_BUFFER_LENGTH];
+ memset(adcInputBuffer, 0, sizeof(adcInputBuffer));
+
+ // We use the ADC irq to trigger DMA and the manual says
+ // that in this case the NVIC for ADC must be disabled.
+ NVIC_DisableIRQ(ADC_IRQn);
+
+ // Power up the ADC and set PCLK
+ LPC_SC->PCONP |= (1UL << 12);
+ LPC_SC->PCLKSEL0 &= ~(3UL << 16); // PCLK = CCLK/4 96M/4 = 24MHz
+
+ // Enable the ADC, 12MHz, ADC0.0 & .1
+ LPC_ADC->ADCR = (1UL << 21) | (1UL << 8) | (3UL << 0);
+
+ // Set the pin functions to ADC
+ LPC_PINCON->PINSEL1 &= ~(3UL << 14); /* P0.23, Mbed p15. */
+ LPC_PINCON->PINSEL1 |= (1UL << 14);
+ LPC_PINCON->PINSEL1 &= ~(3UL << 16); /* P0.24, Mbed p16. */
+ LPC_PINCON->PINSEL1 |= (1UL << 16);
+
+ // Setup the serial port to print out results.
+ pc.baud(115200);
+ pc.printf("ADC with DMA example\n");
+ pc.printf("====================\n");
+
+ // Prepare an ADC configuration.
+ MODDMA_Config *conf = new MODDMA_Config;
+ conf
+ ->channelNum ( MODDMA::Channel_0 )
+ ->srcMemAddr ( 0 )
+ ->dstMemAddr ( (uint32_t)adcInputBuffer )
+ ->transferSize ( SAMPLE_BUFFER_LENGTH )
+ ->transferType ( MODDMA::p2m )
+ ->transferWidth ( MODDMA::word )
+ ->srcConn ( MODDMA::ADC )
+ ->dstConn ( 0 )
+ ->dmaLLI ( 0 )
+ ->attach_tc ( &TC0_callback )
+ ->attach_err ( &ERR0_callback )
+ ; // end conf.
+
+ // Prepare configuration.
+ dma.Setup( conf );
+
+ // Enable configuration.
+ dma.Enable( conf );
+
+ // Enable ADC irq flag (to DMA).
+ // Note, don't set the individual flags,
+ // just set the global flag.
+ LPC_ADC->ADINTEN = 0x100;
+
+ // Enable burst mode on inputs 0 and 1.
+ LPC_ADC->ADCR |= (1UL << 16);
+
+ while (1) {
+ // When transfer complete do this block.
+ if (dmaTransferComplete) {
+ delete conf; // No memory leaks, delete the configuration.
+ dmaTransferComplete = false;
+ for (int i = 0; i < SAMPLE_BUFFER_LENGTH; i++) {
+ int channel = (adcInputBuffer[i] >> 24) & 0x7;
+ int iVal = (adcInputBuffer[i] >> 4) & 0xFFF;
+ double fVal = 3.3 * (double)((double)iVal) / ((double)0x1000); // scale to 0v to 3.3v
+ pc.printf("Array index %02d : ADC input channel %d = 0x%03x %01.3f volts\n", i, channel, iVal, fVal);
+ }
+ }
+
+ // Just flash LED1 for something to do.
+ led1 = !led1;
+ wait(0.25);
+ }
+}
+
+// Configuration callback on TC
+void TC0_callback(void) {
+
+ MODDMA_Config *config = dma.getConfig();
+
+ // Disbale burst mode and switch off the IRQ flag.
+ LPC_ADC->ADCR &= ~(1UL << 16);
+ LPC_ADC->ADINTEN = 0;
+
+ // Finish the DMA cycle by shutting down the channel.
+ dma.haltAndWaitChannelComplete( (MODDMA::CHANNELS)config->channelNum());
+ dma.Disable( (MODDMA::CHANNELS)config->channelNum() );
+
+ // Tell main() while(1) loop to print the results.
+ dmaTransferComplete = true;
+
+ // Switch on LED2 to show transfer complete.
+ led2 = 1;
+
+ // Clear DMA IRQ flags.
+ if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();
+ if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();
+}
+
+// Configuration callback on Error
+void ERR0_callback(void) {
+ // Switch off burst conversions.
+ LPC_ADC->ADCR |= ~(1UL << 16);
+ LPC_ADC->ADINTEN = 0;
+ error("Oh no! My Mbed EXPLODED! :( Only kidding, go find the problem");
+}
+
+#endif
