Fork of Andy Kirkham's MODDMA GPDMA Controller for Mbed OS 6
Read MODDMA for more info.
example3.h@20:01d0a680e45a, 21 months ago (annotated)
- 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?
User | Revision | Line number | New 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 | } |