EmbedEd
/
mbed_theremin
xypad theremin for LPC1768
dma.cpp@2:c5eeaf1c8e69, 2016-03-14 (annotated)
- 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?
User | Revision | Line number | New 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 |