■DMA +Timer■
#Main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #if EXAMPLE == 370 void MemFill(unsigned long ptr, unsigned long pattern, int size) { int i; unsigned long *data; data = (unsigned long *)ptr; for (i=0; i<size;i++) *data++ = pattern; } void MemDump(unsigned long ptr, int size) { int i; unsigned long *data; data = (unsigned long *)ptr; Uart_Printf("\n"); Uart_Printf("*** Dump Memory from [0x%08x] to [0x%08x] : \n",ptr, (unsigned long *)ptr+size); for (i=0; i<size;i++) { if ( !(i%4) ) Uart_Printf("\n [0x%08x] : ",data); Uart_Printf("0x%08x ",*data++); } Uart_Printf("\n"); } #define pISR_DMA0 (*(unsigned *)(0x33ffff64)) static unsigned long src = 0x33000000; static unsigned long dst = 0x33100000; static unsigned int size = 12; //word size unsigned long pattern; static void DMA0_interrupt() { rINTSUBMSK |=(0<<18); rINTMSK1 |=(1<<17); rSUBSRCPND |= 0x1<<18; rSRCPND1|=(1<<17); //clear rINTPND1 |=(1<<17); //clear Uart_Send_String("\n###DMA0 START ...!!"); MemDump(dst,size); // rDMASKTRIG0 |= 0x1 <<2; 이부분을 주석처리 해주면 single mode rINTSUBMSK &=~(1<<18); rINTMSK1 &=~(1<<17); } void Main(void) { //interrupt handler set pISR_DMA0= (unsigned int)DMA0_interrupt; rINTSUBMSK &=~(0<<18); rINTMSK1 &=~(1<<17); rDMASKTRIG0=0x0; //src , dest init rDISRC0 = src; rDIDST0 = dst; //disrcc , didstc init rDISRCC0 &= ~0x3; rDIDSTC0 &= ~0x7; //dcon init rDCON0 = (1<<31) | (1<<30) | (1<<29) |(0<<28) | (1<<27)| (1<<24) | (0<<23)|(0<<22) | (0<<20)|(size*4<<0); //H/W request mode;1 rDMAREQSEL0|= (0x1<<0); rDMAREQSEL0|= (0x9<<1); //Hard ware mode로 설정 Timer_Init(0); MemFill(src,0x00000000,size); MemFill(dst,0x00000000,size); pattern = 0x5555aaaa; MemFill(src,pattern,size); //src malloc; MemDump(src,size); Timer_Delay(1000,0); rDMASKTRIG0 = (1<<1) | (1<<0); } # endif | cs |
#Timer.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include "2450addr.h" #include "option.h" #include "libc.h" //Function Declaration void Timer_Init(int k); void Timer_Delay(int msec,int k); void Timer_Init(int k) { rTCFG0=0xffff; rTCFG1 |= (0x3 <<(4*k)); rTCFG1 |= (0x1 <<20); //DMA requst channel if(k==0) rTCON|= 0x1 <<3; else if(k==4) rTCON|= 0x1 <<22; else { rTCON|= 0x80 << (4*k); } *(&rTCNTB0 + (k *0xc)) = 0; *(&rTCMPB0 + (k *0xc)) = 0; } void Timer_Delay(int msec,int k) { switch(k) { case 0: rTCNTB0= 16.113*msec; break; case 1: rTCNTB1= 16.113*msec; break; case 2: rTCNTB2= 16.113*msec; break; case 3: rTCNTB3= 16.113*msec; break; case 4: rTCNTB4= 16.113*msec; break; } if(k==0) { rTCON |= (1<<1) | (0); rTCON &= ~(1<<1); rTCON |= 1; } else { rTCON |= (0x20 <<(4 * k)) | (0); rTCON &= ~(0x20 <<(4 *k)); rTCON |= (0x10<<(4 *k)); } } | cs |
1. TCFG1 설정
rTCFG1 |= (0x1 <<20);
2. 하드웨어 인터럽트로 설정
rDMAREQSEL0|= (0x1<<0);
rDMAREQSEL0|= (0x9<<1);
#결과
■DMA +Uart■
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | static unsigned long src=0x33000000; static unsigned long dst=0x33100000; static unsigned int size = 12; /* word size */ static unsigned long pattern; void DMA0_UART_Init(void) { /* Init DMASKTRIG on DMA0*/ rDMASKTRIG0 = 0x0; /* TODO : Select Base Address of Source and Destination*/ rDISRC0 =src; rDIDST0 =dst; /* TO DO : Init Source & Destination Control Register on DMA0 * (memory -> AHB bus, INC mode, CHK_INT -> after auto-reload ) */ rDISRCC0 &= ~0x3; rDIDSTC0 &=~(0x7); /* TO DO : setting for H/W DMA request * DCON0 : Handshake[31-1], HCLK[30-1], INT mode[29-1], Single Unit[28-0], Whole service[27-1], * H/W trigger[23-1], Auto Reload ON[22-0], Byte size[21:20](Note: Word size<->Byte size) * DMAREQSEL0 : Uart1[5:1], SWHW_SEL[0-1] */ rDCON0 =(unsigned int)(0<<31)+(1<<30)+(1<<29)+(0<<28)+(1<<27)+(1<<24)+(1<<23)+(0<<22)+(0<<20)+size*4; rDMAREQSEL0 = (21<<1)+(0x1<<0); /* TO DO : Turn on Trigger*/ rDMASKTRIG0 |= (0x1<<1); } void DMA0_HW_Start(void) { MemFill(src, 0x00000000, size); MemFill(dst, 0x00000000, size); Uart_Printf("\nStart Memory copy test With DMA\n"); /* memory copy test with DMA */ pattern = 0x5555aaaa; Uart_Printf("Fill pattern [0x%08x] to [0x%08x]\n",pattern, src); MemFill(src, pattern, size); MemDump(src, size); Uart_Printf("\nCopy from [0x%08x] to [0x%08x] by DMA\n",src, dst); } void Main(void) { char value; Uart_DMA_Init(115200); DMA0_UART_Init(); Uart_Send_Byte('\n'); Uart_Send_Byte('A'); Uart_Send_String("Hello Uart Test...!!!\n"); /* TO DO : 인터럽트 벡터에 DMA0_ISR 함수 등록 */ pISR_DMA0 = (unsigned int)DMA0_ISR; /* TO DO : 인터럽트 허용 on DMA0 */ rINTSUBMSK &= ~(0x1<<18); rINTMSK1 &= ~(0x1<<17); DMA0_HW_Start(); while(1){ Uart_Printf("Input Value = : "); value = Uart_Get_Char(); Uart_Printf("value=%c \n", value); } } | cs |
'ARM Device' 카테고리의 다른 글
[ARM 디바이스 제어_Day6~10]Mini_project-무한의 계단 게임 (0) | 2018.11.23 |
---|---|
[ARM 디바이스 제어_Day5]Touch Screen (0) | 2018.11.18 |
[ARM 디바이스 제어_Day3]DMA (0) | 2018.11.18 |
[ARM 디바이스 제어_Day2]key, Uart interrupt (0) | 2018.11.18 |
[ARM 디바이스 제어_Day1]Timer (0) | 2018.11.18 |