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

Read MODDMA for more info.

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?

UserRevisionLine numberNew 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 }