xypad theremin for LPC1768

Dependencies:   MODDMA mbed

Committer:
exopiped
Date:
Mon Mar 14 23:43:44 2016 +0000
Revision:
2:c5eeaf1c8e69
Parent:
1:aa184d2eb2e3
touch screen driver glitches removed; debug statements commented out

Who changed what in which revision?

UserRevisionLine numberNew contents of line
exopiped 0:8ee38453bad9 1 /*
exopiped 0:8ee38453bad9 2 * dma.cpp
exopiped 0:8ee38453bad9 3 * Send a buffer repeatedly to the DAC using DMA.
exopiped 0:8ee38453bad9 4 */
exopiped 0:8ee38453bad9 5 #include "mbed.h"
exopiped 0:8ee38453bad9 6 #include "note.h"
exopiped 0:8ee38453bad9 7 #include "MODDMA.h"
exopiped 0:8ee38453bad9 8 #include "dma.h"
exopiped 0:8ee38453bad9 9
exopiped 0:8ee38453bad9 10 int buffer[2][DMA_BUFSIZE];
exopiped 0:8ee38453bad9 11
exopiped 0:8ee38453bad9 12 AnalogOut sig(p18); // analog output object ( uses pin 18)
exopiped 1:aa184d2eb2e3 13 DigitalOut led2(LED1);
exopiped 1:aa184d2eb2e3 14 DigitalOut led3(LED2);
exopiped 0:8ee38453bad9 15
exopiped 0:8ee38453bad9 16 MODDMA dma;
exopiped 0:8ee38453bad9 17 MODDMA_Config *conf0, *conf1;
exopiped 0:8ee38453bad9 18
exopiped 0:8ee38453bad9 19 int *dma_get_bufptr(int bufno)
exopiped 0:8ee38453bad9 20 {
exopiped 0:8ee38453bad9 21 return buffer[bufno];
exopiped 0:8ee38453bad9 22 }
exopiped 0:8ee38453bad9 23
exopiped 0:8ee38453bad9 24 void dma_init(void) {
exopiped 0:8ee38453bad9 25
exopiped 0:8ee38453bad9 26 // Prepare the GPDMA system for buffer0.
exopiped 0:8ee38453bad9 27 conf0 = new MODDMA_Config;
exopiped 0:8ee38453bad9 28 conf0
exopiped 0:8ee38453bad9 29 ->channelNum ( MODDMA::Channel_0 )
exopiped 0:8ee38453bad9 30 ->srcMemAddr ( (uint32_t) &buffer[0] )
exopiped 0:8ee38453bad9 31 ->dstMemAddr ( MODDMA::DAC )
exopiped 0:8ee38453bad9 32 ->transferSize ( 512 )
exopiped 0:8ee38453bad9 33 ->transferType ( MODDMA::m2p )
exopiped 0:8ee38453bad9 34 ->dstConn ( MODDMA::DAC )
exopiped 0:8ee38453bad9 35 ->attach_tc ( &TC0_callback )
exopiped 0:8ee38453bad9 36 ->attach_err ( &ERR0_callback )
exopiped 0:8ee38453bad9 37 ; // config end
exopiped 0:8ee38453bad9 38
exopiped 0:8ee38453bad9 39
exopiped 0:8ee38453bad9 40 // Prepare the GPDMA system for buffer1.
exopiped 0:8ee38453bad9 41 conf1 = new MODDMA_Config;
exopiped 0:8ee38453bad9 42 conf1
exopiped 0:8ee38453bad9 43 ->channelNum ( MODDMA::Channel_1 )
exopiped 0:8ee38453bad9 44 ->srcMemAddr ( (uint32_t) &buffer[1] )
exopiped 0:8ee38453bad9 45 ->dstMemAddr ( MODDMA::DAC )
exopiped 0:8ee38453bad9 46 ->transferSize ( 512 )
exopiped 0:8ee38453bad9 47 ->transferType ( MODDMA::m2p )
exopiped 0:8ee38453bad9 48 ->dstConn ( MODDMA::DAC )
exopiped 0:8ee38453bad9 49 ->attach_tc ( &TC1_callback )
exopiped 0:8ee38453bad9 50 ->attach_err ( &ERR1_callback )
exopiped 0:8ee38453bad9 51 ; // config end
exopiped 0:8ee38453bad9 52
exopiped 0:8ee38453bad9 53
exopiped 0:8ee38453bad9 54 //
exopiped 0:8ee38453bad9 55 // By default, the Mbed library sets the PCLK_DAC clock value
exopiped 0:8ee38453bad9 56 // to 24MHz. One wave cycle in each buffer is DMA_BUFSIZE
exopiped 0:8ee38453bad9 57 // (512) points long. The sample rate of the output is to be
exopiped 0:8ee38453bad9 58 // WAVE_SAMPLE_RATE (22050) samples per second, regardless of.
exopiped 0:8ee38453bad9 59 // wave frequency. So the DACCNTVAL will be 24000000/22050
exopiped 0:8ee38453bad9 60 // or 1088.
exopiped 0:8ee38453bad9 61 //
exopiped 0:8ee38453bad9 62
exopiped 0:8ee38453bad9 63 LPC_DAC->DACCNTVAL = 1088; // for 22050 sample rate
exopiped 0:8ee38453bad9 64
exopiped 0:8ee38453bad9 65 //
exopiped 0:8ee38453bad9 66 // the wave templates will be one dma buffer long, so the
exopiped 0:8ee38453bad9 67 // lowest frequency that can be produced is
exopiped 0:8ee38453bad9 68 // WAVE_SAMPLE_RATE/DMA_BUFSIZE = 22050/512 = 43 Hz
exopiped 0:8ee38453bad9 69 // the highest frequency wave that can be produced is
exopiped 0:8ee38453bad9 70 // roughly half the sample rate, or 11025 Hz.
exopiped 0:8ee38453bad9 71 //
exopiped 0:8ee38453bad9 72 }
exopiped 0:8ee38453bad9 73
exopiped 0:8ee38453bad9 74 void dma_enable(void)
exopiped 0:8ee38453bad9 75 {
exopiped 0:8ee38453bad9 76 // Prepare first configuration.
exopiped 0:8ee38453bad9 77 if (!dma.Prepare( conf0 )) {
exopiped 0:8ee38453bad9 78 error("Doh!");
exopiped 0:8ee38453bad9 79 }
exopiped 0:8ee38453bad9 80
exopiped 0:8ee38453bad9 81 // Begin (enable DMA and counter). Note, don't enable
exopiped 0:8ee38453bad9 82 // DBLBUF_ENA as we are using DMA double buffering.
exopiped 0:8ee38453bad9 83 LPC_DAC->DACCTRL |= (3UL << 2);
exopiped 0:8ee38453bad9 84 }
exopiped 0:8ee38453bad9 85
exopiped 0:8ee38453bad9 86 void dma_disable(void)
exopiped 1:aa184d2eb2e3 87 {
exopiped 1:aa184d2eb2e3 88 // Get configuration pointer.
exopiped 1:aa184d2eb2e3 89 MODDMA_Config *config = dma.getConfig();
exopiped 0:8ee38453bad9 90
exopiped 0:8ee38453bad9 91 // Finish the DMA cycle by shutting down the channel.
exopiped 1:aa184d2eb2e3 92 dma.Disable((MODDMA::CHANNELS)config->channelNum());
exopiped 0:8ee38453bad9 93
exopiped 0:8ee38453bad9 94 }
exopiped 0:8ee38453bad9 95
exopiped 0:8ee38453bad9 96 // Configuration callback on TC
exopiped 0:8ee38453bad9 97 void TC0_callback(void) {
exopiped 1:aa184d2eb2e3 98
exopiped 1:aa184d2eb2e3 99 dma_disable();
exopiped 1:aa184d2eb2e3 100
exopiped 0:8ee38453bad9 101 if (note_active()) {
exopiped 0:8ee38453bad9 102 // Notify note.cpp that it is time to refill buffer[0]
exopiped 0:8ee38453bad9 103 note_set_bufno(0);
exopiped 1:aa184d2eb2e3 104
exopiped 0:8ee38453bad9 105 // Swap to buffer1
exopiped 0:8ee38453bad9 106 dma.Prepare( conf1 );
exopiped 1:aa184d2eb2e3 107 }
exopiped 1:aa184d2eb2e3 108 // Clear DMA IRQ flags.
exopiped 1:aa184d2eb2e3 109 if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();
exopiped 0:8ee38453bad9 110
exopiped 0:8ee38453bad9 111 }
exopiped 0:8ee38453bad9 112
exopiped 0:8ee38453bad9 113 // Configuration callback on Error
exopiped 0:8ee38453bad9 114 void ERR0_callback(void) {
exopiped 1:aa184d2eb2e3 115 led2=1;
exopiped 0:8ee38453bad9 116 error("Oh no! My Mbed EXPLODED!");
exopiped 0:8ee38453bad9 117 }
exopiped 0:8ee38453bad9 118
exopiped 0:8ee38453bad9 119 // Configuration callback on TC
exopiped 0:8ee38453bad9 120 void TC1_callback(void) {
exopiped 0:8ee38453bad9 121
exopiped 1:aa184d2eb2e3 122 dma_disable();
exopiped 0:8ee38453bad9 123
exopiped 0:8ee38453bad9 124 if (note_active()) {
exopiped 0:8ee38453bad9 125 // Notify note.cpp that it is time to refill buffer[1]
exopiped 0:8ee38453bad9 126 note_set_bufno(1);
exopiped 0:8ee38453bad9 127
exopiped 0:8ee38453bad9 128 // Swap to buffer0
exopiped 0:8ee38453bad9 129 dma.Prepare( conf0 );
exopiped 0:8ee38453bad9 130 }
exopiped 1:aa184d2eb2e3 131 // Clear DMA IRQ flags.
exopiped 1:aa184d2eb2e3 132 if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();
exopiped 0:8ee38453bad9 133 }
exopiped 0:8ee38453bad9 134
exopiped 1:aa184d2eb2e3 135
exopiped 0:8ee38453bad9 136 // Configuration callback on Error
exopiped 0:8ee38453bad9 137 void ERR1_callback(void) {
exopiped 1:aa184d2eb2e3 138 led3=1;
exopiped 0:8ee38453bad9 139 error("Oh no! My Mbed EXPLODED!");
exopiped 0:8ee38453bad9 140 }
exopiped 0:8ee38453bad9 141