Fork of Andy Kirkham's MODDMA GPDMA Controller for Mbed OS 6

Read MODDMA for more info.

Committer:
hudakz
Date:
Mon Dec 12 15:08:37 2022 +0000
Revision:
20:01d0a680e45a
Parent:
19:bf3ae4c3635d
Fork of Andy Kirkham's MODDMA GPDMA Controller for Mbed OS 6.; The examples are updated in order to compile with Mbed OS 6.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AjK 12:1dfee7208043 1 /*
hudakz 19:bf3ae4c3635d 2 * Demonstrates capturing the GPIO P0.4 to P0.7 "nibble" to memory
AjK 12:1dfee7208043 3 * using GPDMA. The transfers from port pins to memory buffer are
AjK 12:1dfee7208043 4 * triggered using Timer1 MAT1.0 match compare.
AjK 12:1dfee7208043 5 *
AjK 12:1dfee7208043 6 * In this example all inputs have pullups. So with nothing connected
hudakz 19:bf3ae4c3635d 7 * the P0.4/7 reads as 0xF. Connecting a wire from one or more of the four
AjK 12:1dfee7208043 8 * inputs to ground will show up in the captured buffer sequence.
AjK 12:1dfee7208043 9 */
AjK 12:1dfee7208043 10 #include "mbed.h"
AjK 12:1dfee7208043 11 #include "MODDMA.h"
hudakz 19:bf3ae4c3635d 12 #include "iomacros.h" // within MODDMA library.
AjK 12:1dfee7208043 13
AjK 12:1dfee7208043 14 // How long between grabbing GPIO FIO0PIN register.
hudakz 19:bf3ae4c3635d 15
AjK 15:e01144bae101 16 // Value is in microseconds. (500000 is half a second).
AjK 12:1dfee7208043 17 #define SAMPLE_PERIOD 500000
AjK 12:1dfee7208043 18
AjK 12:1dfee7208043 19 #define NUM_OF_SAMPLES 5
AjK 12:1dfee7208043 20
hudakz 19:bf3ae4c3635d 21 DigitalOut led1(LED1);
hudakz 19:bf3ae4c3635d 22 DigitalOut led2(LED2);
hudakz 19:bf3ae4c3635d 23 DigitalOut led3(LED3);
AjK 12:1dfee7208043 24
hudakz 19:bf3ae4c3635d 25 uint32_t buffer[NUM_OF_SAMPLES];
hudakz 19:bf3ae4c3635d 26 bool dmaTransferComplete;
AjK 12:1dfee7208043 27
hudakz 19:bf3ae4c3635d 28 MODDMA dma;
hudakz 19:bf3ae4c3635d 29 MODDMA_Config* conf;
AjK 12:1dfee7208043 30
hudakz 19:bf3ae4c3635d 31 void TC0_callback(void);
hudakz 19:bf3ae4c3635d 32 void ERR0_callback(void);
AjK 12:1dfee7208043 33
hudakz 19:bf3ae4c3635d 34 /**
hudakz 19:bf3ae4c3635d 35 * @brief
hudakz 19:bf3ae4c3635d 36 * @note
hudakz 19:bf3ae4c3635d 37 * @param
hudakz 19:bf3ae4c3635d 38 * @retval
hudakz 19:bf3ae4c3635d 39 */
hudakz 19:bf3ae4c3635d 40 int main()
hudakz 19:bf3ae4c3635d 41 {
hudakz 19:bf3ae4c3635d 42 volatile int life_counter = 0;
AjK 12:1dfee7208043 43
AjK 12:1dfee7208043 44 // Macros defined in iomacros.h, saves messing with DigitalIn
hudakz 19:bf3ae4c3635d 45 p30_AS_INPUT;
hudakz 19:bf3ae4c3635d 46 p30_MODE(PIN_PULLUP); // P0.4
hudakz 19:bf3ae4c3635d 47 p29_AS_INPUT;
hudakz 19:bf3ae4c3635d 48 p29_MODE(PIN_PULLUP); // P0.5
hudakz 19:bf3ae4c3635d 49 p8_AS_INPUT;
hudakz 19:bf3ae4c3635d 50 p8_MODE(PIN_PULLUP); // P0.6
hudakz 19:bf3ae4c3635d 51 p7_AS_INPUT;
hudakz 19:bf3ae4c3635d 52 p7_MODE(PIN_PULLUP); // P0.7
hudakz 19:bf3ae4c3635d 53
AjK 12:1dfee7208043 54 // Clear the buffer.
AjK 12:1dfee7208043 55 memset(buffer, 0, sizeof(buffer));
hudakz 19:bf3ae4c3635d 56
hudakz 19:bf3ae4c3635d 57 printf("Starting up...\n");
hudakz 19:bf3ae4c3635d 58
AjK 12:1dfee7208043 59 // Set-up timer1 as a periodic timer.
hudakz 19:bf3ae4c3635d 60 LPC_SC->PCONP |= (1UL << 2); // TIM1 On
hudakz 19:bf3ae4c3635d 61 LPC_SC->PCLKSEL0 |= (3UL << 4); // CCLK/8 = 12MHz
hudakz 19:bf3ae4c3635d 62 LPC_TIM1->PR = 11; // TC clocks at 1MHz.
hudakz 19:bf3ae4c3635d 63 LPC_TIM1->MCR = 2; // Reset TCR to zero on match.
hudakz 19:bf3ae4c3635d 64 LPC_TIM1->MR0 = SAMPLE_PERIOD;
hudakz 19:bf3ae4c3635d 65
AjK 12:1dfee7208043 66 // Prepare the GPDMA system.
AjK 12:1dfee7208043 67 conf = new MODDMA_Config;
hudakz 19:bf3ae4c3635d 68 conf->channelNum(MODDMA::Channel_0);
hudakz 19:bf3ae4c3635d 69 conf->srcMemAddr((uint32_t) & LPC_GPIO0->FIOPIN);
hudakz 19:bf3ae4c3635d 70 conf->dstMemAddr((uint32_t) & buffer[0]);
hudakz 19:bf3ae4c3635d 71 conf->transferSize(NUM_OF_SAMPLES);
hudakz 19:bf3ae4c3635d 72 conf->transferType(MODDMA::g2m); // pseudo transfer code MODDMA understands.
hudakz 19:bf3ae4c3635d 73 conf->transferWidth(MODDMA::word);
hudakz 19:bf3ae4c3635d 74 conf->srcConn(MODDMA::MAT1_0);
hudakz 19:bf3ae4c3635d 75 conf->dmacSync(MODDMA::MAT1_0);
hudakz 19:bf3ae4c3635d 76 conf->attach_tc(TC0_callback);
hudakz 19:bf3ae4c3635d 77 conf->attach_err(ERR0_callback);
hudakz 19:bf3ae4c3635d 78
AjK 12:1dfee7208043 79 // Prepare configuration.
hudakz 19:bf3ae4c3635d 80 if (!dma.Setup(conf)) {
AjK 12:1dfee7208043 81 error("Doh!");
AjK 12:1dfee7208043 82 }
hudakz 19:bf3ae4c3635d 83
hudakz 19:bf3ae4c3635d 84 // Enable GPDMA to be ready for the TIM1 "ticks".
hudakz 19:bf3ae4c3635d 85 dma.Enable(conf);
hudakz 19:bf3ae4c3635d 86
AjK 12:1dfee7208043 87 // Begin.
AjK 12:1dfee7208043 88 LPC_TIM1->TCR = 1;
hudakz 19:bf3ae4c3635d 89
hudakz 19:bf3ae4c3635d 90 while (1) {
AjK 14:15939b260dfa 91 if (life_counter++ > 1000000) {
hudakz 19:bf3ae4c3635d 92 led1 = !led1; // Show some sort of life.
AjK 14:15939b260dfa 93 life_counter = 0;
AjK 14:15939b260dfa 94 }
hudakz 19:bf3ae4c3635d 95
AjK 12:1dfee7208043 96 if (dmaTransferComplete) {
AjK 12:1dfee7208043 97 dmaTransferComplete = false;
AjK 12:1dfee7208043 98 for (int i = 0; i < NUM_OF_SAMPLES; i++) {
hudakz 19:bf3ae4c3635d 99 int val = (buffer[i] >> 4) & 0xF;
hudakz 19:bf3ae4c3635d 100 printf("Buffer index %d = 0x%x\n", i, val);
AjK 12:1dfee7208043 101 }
hudakz 19:bf3ae4c3635d 102
hudakz 19:bf3ae4c3635d 103 printf("Done.\n");
hudakz 19:bf3ae4c3635d 104
AjK 13:846c8b6ffb7f 105 // Schedule another grab.
hudakz 19:bf3ae4c3635d 106 if (dma.Setup(conf)) {
hudakz 19:bf3ae4c3635d 107 dma.Enable(conf);
hudakz 19:bf3ae4c3635d 108 }
AjK 12:1dfee7208043 109 }
hudakz 19:bf3ae4c3635d 110 }
AjK 12:1dfee7208043 111 }
AjK 12:1dfee7208043 112
AjK 12:1dfee7208043 113 // Configuration callback on TC
hudakz 19:bf3ae4c3635d 114 void TC0_callback(void)
hudakz 19:bf3ae4c3635d 115 {
AjK 12:1dfee7208043 116 // Just show sample sequence grab complete.
hudakz 19:bf3ae4c3635d 117 led3 = !led3;
hudakz 19:bf3ae4c3635d 118
AjK 12:1dfee7208043 119 // Get configuration pointer.
hudakz 19:bf3ae4c3635d 120 MODDMA_Config* config = dma.getConfig();
hudakz 19:bf3ae4c3635d 121
AjK 12:1dfee7208043 122 // Finish the DMA cycle by shutting down the channel.
hudakz 19:bf3ae4c3635d 123 dma.Disable((MODDMA::CHANNELS) config->channelNum());
hudakz 19:bf3ae4c3635d 124
AjK 12:1dfee7208043 125 // Tell main() while(1) loop to print the results.
hudakz 19:bf3ae4c3635d 126 dmaTransferComplete = true;
hudakz 19:bf3ae4c3635d 127
AjK 12:1dfee7208043 128 // Clear DMA IRQ flags.
hudakz 19:bf3ae4c3635d 129 if (dma.irqType() == MODDMA::TcIrq)
hudakz 19:bf3ae4c3635d 130 dma.clearTcIrq();
hudakz 19:bf3ae4c3635d 131 if (dma.irqType() == MODDMA::ErrIrq)
hudakz 19:bf3ae4c3635d 132 dma.clearErrIrq();
AjK 12:1dfee7208043 133 }
AjK 12:1dfee7208043 134
AjK 12:1dfee7208043 135 // Configuration callback on Error
hudakz 19:bf3ae4c3635d 136 void ERR0_callback(void)
hudakz 19:bf3ae4c3635d 137 {
AjK 12:1dfee7208043 138 error("Oh no! My Mbed EXPLODED! :( Only kidding, go find the problem");
AjK 12:1dfee7208043 139 }