■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, 0x00000000size);
    MemFill(dst, 0x00000000size);    
    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


+ Recent posts