Versão atual 13-12-2013.

Dependencies:   EthernetInterface mbed-rtos mbed

Committer:
rebonatto
Date:
Fri Dec 13 11:45:06 2013 +0000
Revision:
1:238ac24e46dd
Parent:
0:65c41a68b49a
Atual 13-12-2013.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rebonatto 0:65c41a68b49a 1 /*
rebonatto 0:65c41a68b49a 2 * dma.c
rebonatto 0:65c41a68b49a 3 *
rebonatto 0:65c41a68b49a 4 * Created on: 03/07/2011
rebonatto 0:65c41a68b49a 5 * Author: francisco
rebonatto 0:65c41a68b49a 6 */
rebonatto 0:65c41a68b49a 7 #include <LPC17xx.h>
rebonatto 0:65c41a68b49a 8 #include "dma.h"
rebonatto 0:65c41a68b49a 9
rebonatto 0:65c41a68b49a 10 #define LPC_GPDMACH ((LPC_GPDMACH_TypeDef **) LPC_GPDMACH0_BASE )
rebonatto 0:65c41a68b49a 11
rebonatto 0:65c41a68b49a 12 void init_dma()
rebonatto 0:65c41a68b49a 13 {
rebonatto 0:65c41a68b49a 14 LPC_SC->PCONP |= 1<<29; //Power GPDMA module
rebonatto 0:65c41a68b49a 15
rebonatto 0:65c41a68b49a 16 LPC_GPDMA->DMACConfig = 1; //Enable GPDMA
rebonatto 0:65c41a68b49a 17
rebonatto 0:65c41a68b49a 18 //Clear any previous interrupts
rebonatto 0:65c41a68b49a 19 LPC_GPDMA->DMACIntTCClear = 0xFF;
rebonatto 0:65c41a68b49a 20 LPC_GPDMA->DMACIntErrClr = 0xFF;
rebonatto 0:65c41a68b49a 21
rebonatto 0:65c41a68b49a 22 NVIC_SetPriority(DMA_IRQn,(1<<__NVIC_PRIO_BITS) - 1);
rebonatto 0:65c41a68b49a 23 NVIC_EnableIRQ(DMA_IRQn);
rebonatto 0:65c41a68b49a 24 }
rebonatto 0:65c41a68b49a 25
rebonatto 0:65c41a68b49a 26 void setup_channel(dmaLinkedListNode* pList,int ch,int src,int dst)
rebonatto 0:65c41a68b49a 27 {
rebonatto 0:65c41a68b49a 28 //Initialize the channel with previously configured LL;
rebonatto 0:65c41a68b49a 29 LPC_GPDMACH0->DMACCSrcAddr = pList->sourceAddr;
rebonatto 0:65c41a68b49a 30 LPC_GPDMACH0->DMACCDestAddr = pList->destAddr;
rebonatto 0:65c41a68b49a 31 LPC_GPDMACH0->DMACCControl = pList->dmaControl;
rebonatto 0:65c41a68b49a 32 LPC_GPDMACH0->DMACCLLI = (unsigned long int) pList & 0xFFFFFFFC; //Lower bits must be 0
rebonatto 0:65c41a68b49a 33
rebonatto 0:65c41a68b49a 34 int transfer_type;
rebonatto 0:65c41a68b49a 35 if(src == DMA_MEMORY && dst != DMA_MEMORY)
rebonatto 0:65c41a68b49a 36 {
rebonatto 0:65c41a68b49a 37 transfer_type = DMA_MEMORY_TO_PERIPHERAL;
rebonatto 0:65c41a68b49a 38 src = 0;
rebonatto 0:65c41a68b49a 39 }
rebonatto 0:65c41a68b49a 40 else if(src != DMA_MEMORY && dst == DMA_MEMORY)
rebonatto 0:65c41a68b49a 41 {
rebonatto 0:65c41a68b49a 42 transfer_type = DMA_PERIPHERAL_TO_MEMORY;
rebonatto 0:65c41a68b49a 43 dst = 0;
rebonatto 0:65c41a68b49a 44 }
rebonatto 0:65c41a68b49a 45 else if(src == DMA_MEMORY && dst == DMA_MEMORY)
rebonatto 0:65c41a68b49a 46 {
rebonatto 0:65c41a68b49a 47 transfer_type = DMA_MEMORY_TO_MEMORY;
rebonatto 0:65c41a68b49a 48 src=dst = 0;
rebonatto 0:65c41a68b49a 49 }
rebonatto 0:65c41a68b49a 50 else if(src != DMA_MEMORY && dst != DMA_MEMORY)
rebonatto 0:65c41a68b49a 51 transfer_type = DMA_PERIPHERAL_TO_PERIPHERAL;
rebonatto 0:65c41a68b49a 52
rebonatto 0:65c41a68b49a 53 //Set up all relevant bits
rebonatto 0:65c41a68b49a 54 LPC_GPDMACH0->DMACCConfig = (src<<1) | (dst<<5) | (transfer_type<<11) | (1<<15);
rebonatto 0:65c41a68b49a 55
rebonatto 0:65c41a68b49a 56 //Finally, enable the channel -
rebonatto 0:65c41a68b49a 57 LPC_GPDMACH0->DMACCConfig |= 1<<0;
rebonatto 0:65c41a68b49a 58 }
rebonatto 0:65c41a68b49a 59
rebonatto 0:65c41a68b49a 60 void stop_channel()
rebonatto 0:65c41a68b49a 61 {
rebonatto 0:65c41a68b49a 62 LPC_GPDMACH0->DMACCConfig &= ~(1<<0);
rebonatto 0:65c41a68b49a 63 }