http://http://diytec.web.fc2.com/mark2r2/

Dependencies:   EthernetNetIf NTPClient_NetServices mbed ConfigFile

Committer:
mark2r2
Date:
Tue Sep 20 12:46:26 2011 +0000
Revision:
0:08a4d61cd84c
V1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mark2r2 0:08a4d61cd84c 1 /*
mark2r2 0:08a4d61cd84c 2 * This example was provided to support Mbed forum thread:-
mark2r2 0:08a4d61cd84c 3 * http://mbed.org/forum/mbed/topic/1798
mark2r2 0:08a4d61cd84c 4 */
mark2r2 0:08a4d61cd84c 5
mark2r2 0:08a4d61cd84c 6 #include "mbed.h"
mark2r2 0:08a4d61cd84c 7 #include "MODDMA.h"
mark2r2 0:08a4d61cd84c 8
mark2r2 0:08a4d61cd84c 9 #define SAMPLE_BUFFER_LENGTH 32
mark2r2 0:08a4d61cd84c 10
mark2r2 0:08a4d61cd84c 11 DigitalOut led1(LED1);
mark2r2 0:08a4d61cd84c 12 DigitalOut led2(LED2);
mark2r2 0:08a4d61cd84c 13
mark2r2 0:08a4d61cd84c 14 MODDMA dma;
mark2r2 0:08a4d61cd84c 15 Serial pc(USBTX, USBRX);
mark2r2 0:08a4d61cd84c 16
mark2r2 0:08a4d61cd84c 17 // ISR set's this when transfer complete.
mark2r2 0:08a4d61cd84c 18 bool dmaTransferComplete = false;
mark2r2 0:08a4d61cd84c 19
mark2r2 0:08a4d61cd84c 20 // Function prototypes for IRQ callbacks.
mark2r2 0:08a4d61cd84c 21 // See definitions following main() below.
mark2r2 0:08a4d61cd84c 22 void TC0_callback(void);
mark2r2 0:08a4d61cd84c 23 void ERR0_callback(void);
mark2r2 0:08a4d61cd84c 24
mark2r2 0:08a4d61cd84c 25 int main() {
mark2r2 0:08a4d61cd84c 26
mark2r2 0:08a4d61cd84c 27 // Create a buffer to hold the ADC samples and clear it.
mark2r2 0:08a4d61cd84c 28 // Note, we are going to sample two ADC inputs so they
mark2r2 0:08a4d61cd84c 29 // end up in this buffer "interleaved". So you will want
mark2r2 0:08a4d61cd84c 30 // a buffer twice this size to a real life given sample
mark2r2 0:08a4d61cd84c 31 // frequency. See the printf() output for details.
mark2r2 0:08a4d61cd84c 32 uint32_t adcInputBuffer[SAMPLE_BUFFER_LENGTH];
mark2r2 0:08a4d61cd84c 33 memset(adcInputBuffer, 0, sizeof(adcInputBuffer));
mark2r2 0:08a4d61cd84c 34
mark2r2 0:08a4d61cd84c 35 // We use the ADC irq to trigger DMA and the manual says
mark2r2 0:08a4d61cd84c 36 // that in this case the NVIC for ADC must be disabled.
mark2r2 0:08a4d61cd84c 37 NVIC_DisableIRQ(ADC_IRQn);
mark2r2 0:08a4d61cd84c 38
mark2r2 0:08a4d61cd84c 39 // Power up the ADC and set PCLK
mark2r2 0:08a4d61cd84c 40 LPC_SC->PCONP |= (1UL << 12);
mark2r2 0:08a4d61cd84c 41 LPC_SC->PCLKSEL0 &= ~(3UL << 24); // PCLK = CCLK/4 96M/4 = 24MHz
mark2r2 0:08a4d61cd84c 42
mark2r2 0:08a4d61cd84c 43 // Enable the ADC, 12MHz, ADC0.0 & .1
mark2r2 0:08a4d61cd84c 44 LPC_ADC->ADCR = (1UL << 21) | (1UL << 8) | (3UL << 0);
mark2r2 0:08a4d61cd84c 45
mark2r2 0:08a4d61cd84c 46 // Set the pin functions to ADC
mark2r2 0:08a4d61cd84c 47 LPC_PINCON->PINSEL1 &= ~(3UL << 14); /* P0.23, Mbed p15. */
mark2r2 0:08a4d61cd84c 48 LPC_PINCON->PINSEL1 |= (1UL << 14);
mark2r2 0:08a4d61cd84c 49 LPC_PINCON->PINSEL1 &= ~(3UL << 16); /* P0.24, Mbed p16. */
mark2r2 0:08a4d61cd84c 50 LPC_PINCON->PINSEL1 |= (1UL << 16);
mark2r2 0:08a4d61cd84c 51
mark2r2 0:08a4d61cd84c 52 // Setup the serial port to print out results.
mark2r2 0:08a4d61cd84c 53 // pc.baud(115200);
mark2r2 0:08a4d61cd84c 54 pc.baud(460800);
mark2r2 0:08a4d61cd84c 55 pc.printf("ADC with DMA example\n");
mark2r2 0:08a4d61cd84c 56 pc.printf("====================\n");
mark2r2 0:08a4d61cd84c 57
mark2r2 0:08a4d61cd84c 58 // Prepare an ADC configuration.
mark2r2 0:08a4d61cd84c 59 MODDMA_Config *conf = new MODDMA_Config;
mark2r2 0:08a4d61cd84c 60 conf
mark2r2 0:08a4d61cd84c 61 ->channelNum ( MODDMA::Channel_0 )
mark2r2 0:08a4d61cd84c 62 ->srcMemAddr ( 0 )
mark2r2 0:08a4d61cd84c 63 ->dstMemAddr ( (uint32_t)adcInputBuffer )
mark2r2 0:08a4d61cd84c 64 ->transferSize ( SAMPLE_BUFFER_LENGTH )
mark2r2 0:08a4d61cd84c 65 ->transferType ( MODDMA::p2m )
mark2r2 0:08a4d61cd84c 66 ->transferWidth ( MODDMA::word )
mark2r2 0:08a4d61cd84c 67 ->srcConn ( MODDMA::ADC )
mark2r2 0:08a4d61cd84c 68 ->dstConn ( 0 )
mark2r2 0:08a4d61cd84c 69 ->dmaLLI ( 0 )
mark2r2 0:08a4d61cd84c 70 ->attach_tc ( &TC0_callback )
mark2r2 0:08a4d61cd84c 71 ->attach_err ( &ERR0_callback )
mark2r2 0:08a4d61cd84c 72 ; // end conf.
mark2r2 0:08a4d61cd84c 73
mark2r2 0:08a4d61cd84c 74 // Prepare configuration.
mark2r2 0:08a4d61cd84c 75 dma.Setup( conf );
mark2r2 0:08a4d61cd84c 76
mark2r2 0:08a4d61cd84c 77 // Enable configuration.
mark2r2 0:08a4d61cd84c 78 dma.Enable( conf );
mark2r2 0:08a4d61cd84c 79
mark2r2 0:08a4d61cd84c 80 // Enable ADC irq flag (to DMA).
mark2r2 0:08a4d61cd84c 81 // Note, don't set the individual flags,
mark2r2 0:08a4d61cd84c 82 // just set the global flag.
mark2r2 0:08a4d61cd84c 83 LPC_ADC->ADINTEN = 0x100;
mark2r2 0:08a4d61cd84c 84
mark2r2 0:08a4d61cd84c 85 // Enable burst mode on inputs 0 and 1.
mark2r2 0:08a4d61cd84c 86 LPC_ADC->ADCR |= (1UL << 16);
mark2r2 0:08a4d61cd84c 87
mark2r2 0:08a4d61cd84c 88 while (1) {
mark2r2 0:08a4d61cd84c 89 // When transfer complete do this block.
mark2r2 0:08a4d61cd84c 90 if (dmaTransferComplete) {
mark2r2 0:08a4d61cd84c 91 delete conf; // No memory leaks, delete the configuration.
mark2r2 0:08a4d61cd84c 92 dmaTransferComplete = false;
mark2r2 0:08a4d61cd84c 93 for (int i = 0; i < SAMPLE_BUFFER_LENGTH; i++) {
mark2r2 0:08a4d61cd84c 94 int channel = (adcInputBuffer[i] >> 24) & 0x7;
mark2r2 0:08a4d61cd84c 95 int iVal = (adcInputBuffer[i] >> 4) & 0xFFF;
mark2r2 0:08a4d61cd84c 96 double fVal = 3.3 * (double)((double)iVal) / ((double)0x1000); // scale to 0v to 3.3v
mark2r2 0:08a4d61cd84c 97 pc.printf("Array index %02d : ADC input channel %d = 0x%03x %01.3f volts\n", i, channel, iVal, fVal);
mark2r2 0:08a4d61cd84c 98 }
mark2r2 0:08a4d61cd84c 99 }
mark2r2 0:08a4d61cd84c 100
mark2r2 0:08a4d61cd84c 101 // Just flash LED1 for something to do.
mark2r2 0:08a4d61cd84c 102 led1 = !led1;
mark2r2 0:08a4d61cd84c 103 wait(0.25);
mark2r2 0:08a4d61cd84c 104 }
mark2r2 0:08a4d61cd84c 105 }
mark2r2 0:08a4d61cd84c 106
mark2r2 0:08a4d61cd84c 107 // Configuration callback on TC
mark2r2 0:08a4d61cd84c 108 void TC0_callback(void) {
mark2r2 0:08a4d61cd84c 109
mark2r2 0:08a4d61cd84c 110 MODDMA_Config *config = dma.getConfig();
mark2r2 0:08a4d61cd84c 111
mark2r2 0:08a4d61cd84c 112 // Disbale burst mode and switch off the IRQ flag.
mark2r2 0:08a4d61cd84c 113 LPC_ADC->ADCR &= ~(1UL << 16);
mark2r2 0:08a4d61cd84c 114 LPC_ADC->ADINTEN = 0;
mark2r2 0:08a4d61cd84c 115
mark2r2 0:08a4d61cd84c 116 // Finish the DMA cycle by shutting down the channel.
mark2r2 0:08a4d61cd84c 117 dma.haltAndWaitChannelComplete( (MODDMA::CHANNELS)config->channelNum());
mark2r2 0:08a4d61cd84c 118 dma.Disable( (MODDMA::CHANNELS)config->channelNum() );
mark2r2 0:08a4d61cd84c 119
mark2r2 0:08a4d61cd84c 120 // Tell main() while(1) loop to print the results.
mark2r2 0:08a4d61cd84c 121 dmaTransferComplete = true;
mark2r2 0:08a4d61cd84c 122
mark2r2 0:08a4d61cd84c 123 // Switch on LED2 to show transfer complete.
mark2r2 0:08a4d61cd84c 124 led2 = 1;
mark2r2 0:08a4d61cd84c 125
mark2r2 0:08a4d61cd84c 126 // Clear DMA IRQ flags.
mark2r2 0:08a4d61cd84c 127 if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();
mark2r2 0:08a4d61cd84c 128 if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();
mark2r2 0:08a4d61cd84c 129 }
mark2r2 0:08a4d61cd84c 130
mark2r2 0:08a4d61cd84c 131 // Configuration callback on Error
mark2r2 0:08a4d61cd84c 132 void ERR0_callback(void) {
mark2r2 0:08a4d61cd84c 133 // Switch off burst conversions.
mark2r2 0:08a4d61cd84c 134 LPC_ADC->ADCR |= ~(1UL << 16);
mark2r2 0:08a4d61cd84c 135 LPC_ADC->ADINTEN = 0;
mark2r2 0:08a4d61cd84c 136 error("Oh no! My Mbed EXPLODED! :( Only kidding, go find the problem");
mark2r2 0:08a4d61cd84c 137 }
mark2r2 0:08a4d61cd84c 138