Fork of Andy Kirkham's MODDMA GPDMA Controller for Mbed OS 6
Read MODDMA for more info.
example1.h@19:bf3ae4c3635d, 17 months ago (annotated)
- Committer:
- hudakz
- Date:
- Mon Dec 12 15:05:21 2022 +0000
- Revision:
- 19:bf3ae4c3635d
- Parent:
- 12:1dfee7208043
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 | #include "mbed.h" |
AjK | 12:1dfee7208043 | 2 | #include "MODDMA.h" |
AjK | 12:1dfee7208043 | 3 | |
hudakz | 19:bf3ae4c3635d | 4 | DigitalOut led1(LED1); |
hudakz | 19:bf3ae4c3635d | 5 | DigitalOut led2(LED2); |
hudakz | 19:bf3ae4c3635d | 6 | DigitalOut led3(LED3); |
hudakz | 19:bf3ae4c3635d | 7 | DigitalOut led4(LED4); |
hudakz | 19:bf3ae4c3635d | 8 | MODDMA dma; |
AjK | 12:1dfee7208043 | 9 | |
AjK | 12:1dfee7208043 | 10 | // Function prototypes for IRQ callbacks. |
AjK | 12:1dfee7208043 | 11 | // See definitions following main() below. |
hudakz | 19:bf3ae4c3635d | 12 | void dmaTCCallback(void); |
hudakz | 19:bf3ae4c3635d | 13 | void dmaERRCallback(void); |
hudakz | 19:bf3ae4c3635d | 14 | void TC0_callback(void); |
hudakz | 19:bf3ae4c3635d | 15 | void ERR0_callback(void); |
hudakz | 19:bf3ae4c3635d | 16 | |
hudakz | 19:bf3ae4c3635d | 17 | /** |
hudakz | 19:bf3ae4c3635d | 18 | * @brief |
hudakz | 19:bf3ae4c3635d | 19 | * @note |
hudakz | 19:bf3ae4c3635d | 20 | * @param |
hudakz | 19:bf3ae4c3635d | 21 | * @retval |
hudakz | 19:bf3ae4c3635d | 22 | */ |
hudakz | 19:bf3ae4c3635d | 23 | int main() |
hudakz | 19:bf3ae4c3635d | 24 | { |
hudakz | 19:bf3ae4c3635d | 25 | char s[] = "**DMA** ABCDEFGHIJKLMNOPQRSTUVWXYZ **DMA**"; |
hudakz | 19:bf3ae4c3635d | 26 | |
hudakz | 19:bf3ae4c3635d | 27 | printf("\r\nStarting\r\n"); |
AjK | 12:1dfee7208043 | 28 | |
hudakz | 19:bf3ae4c3635d | 29 | dma.attach_tc(&dmaTCCallback); |
hudakz | 19:bf3ae4c3635d | 30 | dma.attach_err(&dmaERRCallback); |
hudakz | 19:bf3ae4c3635d | 31 | |
hudakz | 19:bf3ae4c3635d | 32 | MODDMA_Config* config = new MODDMA_Config; |
hudakz | 19:bf3ae4c3635d | 33 | |
hudakz | 19:bf3ae4c3635d | 34 | config->channelNum(MODDMA::Channel_0); |
hudakz | 19:bf3ae4c3635d | 35 | config->srcMemAddr((uint32_t) & s); |
hudakz | 19:bf3ae4c3635d | 36 | config->dstMemAddr(0); |
hudakz | 19:bf3ae4c3635d | 37 | config->transferSize(sizeof(s)); |
hudakz | 19:bf3ae4c3635d | 38 | config->transferType(MODDMA::m2p); |
hudakz | 19:bf3ae4c3635d | 39 | config->transferWidth(0); |
hudakz | 19:bf3ae4c3635d | 40 | config->srcConn(0); |
hudakz | 19:bf3ae4c3635d | 41 | config->dstConn(MODDMA::UART0_Tx); |
hudakz | 19:bf3ae4c3635d | 42 | config->dmaLLI(0)->attach_tc(&TC0_callback); |
hudakz | 19:bf3ae4c3635d | 43 | config->attach_err(&ERR0_callback); |
hudakz | 19:bf3ae4c3635d | 44 | |
AjK | 12:1dfee7208043 | 45 | // Setup the configuration. |
AjK | 12:1dfee7208043 | 46 | dma.Setup(config); |
hudakz | 19:bf3ae4c3635d | 47 | |
AjK | 12:1dfee7208043 | 48 | //dma.Enable( MODDMA::Channel_0 ); |
AjK | 12:1dfee7208043 | 49 | //dma.Enable( config->channelNum() ); |
hudakz | 19:bf3ae4c3635d | 50 | dma.Enable(config); |
hudakz | 19:bf3ae4c3635d | 51 | |
AjK | 12:1dfee7208043 | 52 | while (1) { |
AjK | 12:1dfee7208043 | 53 | led1 = !led1; |
hudakz | 19:bf3ae4c3635d | 54 | ThisThread::sleep_for(250ms); |
AjK | 12:1dfee7208043 | 55 | } |
AjK | 12:1dfee7208043 | 56 | } |
AjK | 12:1dfee7208043 | 57 | |
AjK | 12:1dfee7208043 | 58 | // Main controller TC IRQ callback |
hudakz | 19:bf3ae4c3635d | 59 | void dmaTCCallback(void) |
hudakz | 19:bf3ae4c3635d | 60 | { |
AjK | 12:1dfee7208043 | 61 | led2 = 1; |
AjK | 12:1dfee7208043 | 62 | } |
AjK | 12:1dfee7208043 | 63 | |
AjK | 12:1dfee7208043 | 64 | // Main controller ERR IRQ callback |
hudakz | 19:bf3ae4c3635d | 65 | void dmaERRCallback(void) |
hudakz | 19:bf3ae4c3635d | 66 | { |
hudakz | 19:bf3ae4c3635d | 67 | printf("Oh no! My Mbed exploded! :( Only kidding, find the problem"); |
AjK | 12:1dfee7208043 | 68 | } |
AjK | 12:1dfee7208043 | 69 | |
AjK | 12:1dfee7208043 | 70 | // Configuration callback on TC |
hudakz | 19:bf3ae4c3635d | 71 | void TC0_callback(void) |
hudakz | 19:bf3ae4c3635d | 72 | { |
hudakz | 19:bf3ae4c3635d | 73 | MODDMA_Config* config = dma.getConfig(); |
hudakz | 19:bf3ae4c3635d | 74 | |
hudakz | 19:bf3ae4c3635d | 75 | dma.haltAndWaitChannelComplete((MODDMA::CHANNELS) config->channelNum()); |
hudakz | 19:bf3ae4c3635d | 76 | dma.Disable((MODDMA::CHANNELS) config->channelNum()); |
hudakz | 19:bf3ae4c3635d | 77 | |
hudakz | 19:bf3ae4c3635d | 78 | // Configurations have two IRQ callbacks for TC and Err so you |
hudakz | 19:bf3ae4c3635d | 79 | // know which you are processing. However, if you want to use |
hudakz | 19:bf3ae4c3635d | 80 | // a single callback function you can tell what type of IRQ |
AjK | 12:1dfee7208043 | 81 | // is being processed thus:- |
hudakz | 19:bf3ae4c3635d | 82 | if (dma.irqType() == MODDMA::TcIrq) { |
AjK | 12:1dfee7208043 | 83 | led3 = 1; |
AjK | 12:1dfee7208043 | 84 | dma.clearTcIrq(); |
AjK | 12:1dfee7208043 | 85 | } |
hudakz | 19:bf3ae4c3635d | 86 | |
AjK | 12:1dfee7208043 | 87 | if (dma.irqType() == MODDMA::ErrIrq) { |
AjK | 12:1dfee7208043 | 88 | led4 = 1; |
AjK | 12:1dfee7208043 | 89 | dma.clearErrIrq(); |
AjK | 12:1dfee7208043 | 90 | } |
AjK | 12:1dfee7208043 | 91 | } |
AjK | 12:1dfee7208043 | 92 | |
AjK | 12:1dfee7208043 | 93 | // Configuration cakllback on Error |
hudakz | 19:bf3ae4c3635d | 94 | void ERR0_callback(void) |
hudakz | 19:bf3ae4c3635d | 95 | { |
hudakz | 19:bf3ae4c3635d | 96 | printf("Oh no! My Mbed exploded! :( Only kidding, find the problem"); |
AjK | 12:1dfee7208043 | 97 | } |