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
|
#include "gd32f30x.h"
#include <stdio.h>
#include "gd32f307c_eval.h"
#define USART0_RDATA_ADDRESS ((uint32_t)&USART_DATA(USART0))
void dma_config(void);
void usart_config(void);
void nvic_config(void);
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
gd_eval_led_init(LED2);
gd_eval_led_on(LED2);
nvic_config();
/* initialize DMA */
dma_config();
/* initialize USART */
usart_config();
usart_interrupt_enable(USART0, USART_INT_IDLE);
printf("\n\rPlease send data less than 256 bytes:\n\r");
/* wait the data is received and send to the hyperterminal */
while(1) {
if(1 == receive_flag) {
for(tx_count = 0; tx_count < rx_count; tx_count++) {
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)) {
}
usart_data_transmit(USART0, rxbuffer[tx_count]);
}
receive_flag = 0;
}
}
}
void dma_config(void)
{
dma_parameter_struct dma_init_struct;
rcu_periph_clock_enable(RCU_DMA0);
/* deinitialize DMA channel4 (USART0 rx) */
dma_deinit(DMA0, DMA_CH4);
dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_addr = (uint32_t)rxbuffer;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.number = 256;
dma_init_struct.periph_addr = USART0_RDATA_ADDRESS;
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init(DMA0, DMA_CH4, &dma_init_struct);
/* configure DMA mode */
dma_circulation_disable(DMA0, DMA_CH4);
/* enable DMA channel4 */
dma_channel_enable(DMA0, DMA_CH4);
}
void usart_config(void)
{
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* enable USART clock */
rcu_periph_clock_enable(RCU_USART0);
/* connect port to USARTx_Tx */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
/* connect port to USARTx_Rx */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
/* configure USART */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
usart_dma_receive_config(USART0, USART_RECEIVE_DMA_ENABLE);
usart_enable(USART0);
}
void nvic_config(void)
{
nvic_irq_enable(USART0_IRQn, 0, 0);
}
|