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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#include "gd32f30x.h"
#include "gd32f307c_eval.h"
#include <string.h>
#define DATANUM 16
__IO ErrStatus transferflag1 = ERROR;
__IO ErrStatus transferflag2 = ERROR;
__IO ErrStatus transferflag3 = ERROR;
__IO ErrStatus transferflag4 = ERROR;
void destbuf_init(void);
void led_config(void);
ErrStatus uc_data_compare(uint8_t* src, uint8_t* dst, uint16_t length);
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
int i = 0;
dma_parameter_struct dma_init_struct;
/* enable DMA clock */
rcu_periph_clock_enable(RCU_DMA0);
/* initialize LED */
led_config();
/* all LED off */
gd_eval_led_off(LED2);
gd_eval_led_off(LED3);
gd_eval_led_off(LED4);
gd_eval_led_off(LED5);
destbuf_init();
/* initialize DMA channel1 */
dma_deinit(DMA0, DMA_CH1);
dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_addr = (uint32_t)destination_address1;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.number = DATANUM;
dma_init_struct.periph_addr = (uint32_t)source_address;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_ENABLE;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init(DMA0, DMA_CH1, &dma_init_struct);
/* configure DMA mode */
dma_circulation_disable(DMA0, DMA_CH1);
dma_memory_to_memory_enable(DMA0, DMA_CH1);
/* initialize DMA channel2 */
dma_deinit(DMA0, DMA_CH2);
dma_init_struct.memory_addr = (uint32_t)destination_address2;
dma_init(DMA0, DMA_CH2, &dma_init_struct);
/* configure DMA mode */
dma_circulation_disable(DMA0, DMA_CH2);
dma_memory_to_memory_enable(DMA0, DMA_CH2);
/* initialize DMA channel3 */
dma_deinit(DMA0, DMA_CH3);
dma_init_struct.memory_addr = (uint32_t)destination_address3;
dma_init(DMA0, DMA_CH3, &dma_init_struct);
/* configure DMA mode */
dma_circulation_disable(DMA0, DMA_CH3);
dma_memory_to_memory_enable(DMA0, DMA_CH3);
/* initialize DMA channel4 */
dma_deinit(DMA0, DMA_CH4);
dma_init_struct.memory_addr = (uint32_t)destination_address4;
dma_init(DMA0, DMA_CH4, &dma_init_struct);
/* configure DMA mode */
dma_circulation_disable(DMA0, DMA_CH4);
dma_memory_to_memory_enable(DMA0, DMA_CH4);
/* enable DMA channel1~channel4 */
dma_channel_enable(DMA0, DMA_CH1);
dma_channel_enable(DMA0, DMA_CH2);
dma_channel_enable(DMA0, DMA_CH3);
dma_channel_enable(DMA0, DMA_CH4);
/* wait for DMA transfer complete */
for(i = 0; i < 200; i++);
/* compare the data of source_address with data of destination_address */
transferflag1 = uc_data_compare(source_address, destination_address1, DATANUM);
transferflag2 = uc_data_compare(source_address, destination_address2, DATANUM);
transferflag3 = uc_data_compare(source_address, destination_address3, DATANUM);
transferflag4 = uc_data_compare(source_address, destination_address4, DATANUM);
/* if DMA channel1 transfer success,light LED2 */
if(SUCCESS == transferflag1){
gd_eval_led_on(LED2);
}
/* if DMA channel2 transfer success,light LED3 */
if(SUCCESS == transferflag2){
gd_eval_led_on(LED3);
}
/* if DMA channel3 transfer success,light LED4 */
if(SUCCESS == transferflag3){
gd_eval_led_on(LED4);
}
/* if DMA channel4 transfer success,light LED5 */
if(SUCCESS == transferflag4){
gd_eval_led_on(LED5);
}
while (1);
}
void destbuf_init(void)
{
memset(destination_address1, 0, DATANUM);
memset(destination_address2, 0, DATANUM);
memset(destination_address3, 0, DATANUM);
memset(destination_address4, 0, DATANUM);
}
void led_config(void)
{
gd_eval_led_init (LED2);
gd_eval_led_init (LED3);
gd_eval_led_init (LED4);
gd_eval_led_init (LED5);
}
|