gd32f103串口dma接收
时间: 2025-03-27 16:38:37 浏览: 42
### GD32F103 UART DMA 接收示例代码
为了实现GD32F103通过UART使用DMA方式进行数据接收,可以按照如下方法配置硬件和软件环境。此过程涉及初始化DMA通道、设置UART外设以及编写中断服务程序来处理接收到的数据。
#### 初始化DMA和UART
首先,在启动文件中定义必要的宏并包含头文件:
```c
#include "gd32f10x.h"
```
接着,创建函数用于初始化DMA和USART:
```c
void usart_dma_init(void){
/* Enable the peripheral clock */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART1);
rcu_periph_clock_enable(RCU_DMA);
/* Configure GPIO pins for USART function */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); // TX
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); // RX
/* USART configuration */
usart_deinit(USART1);
usart_baudrate_set(USART1, 115200U);
usart_word_length_set(USART1, USART_WL_8BIT);
usart_stop_bit_set(USART1, USART_STB_1BIT);
usart_parity_config(USART1, USART_PM_NONE);
usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);
usart_receive_config(USART1, USART_RECEIVE_ENABLE);
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
usart_enable(USART1);
}
```
随后,针对DMA部分进行具体设定:
```c
#define BUFFER_SIZE 64
uint8_t rx_buffer[BUFFER_SIZE];
void dma_usart_rx_init(){
/* Initialize DMA channel */
dma_parameter_struct dma_initstructure;
dma_deinit(DMA0, DMA_CH2);
dma_initstructure.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_initstructure.memory_addr = (uint32_t)rx_buffer;
dma_initstructure.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_initstructure.periph_memory_width = DMA_PERIPH_WIDTH_BYTE;
dma_initstructure.number = BUFFER_SIZE;
dma_initstructure.priority = DMA_PRIORITY_HIGH;
dma_channel_subperipheral_select(DMA0, DMA_CH2, DMA_SUBPERIAPHSEL_USART_RX);
dma_init(DMA0, DMA_CH2, &dma_initstructure);
/* Enable DMA request on receive complete event */
usart_dma_receive_request_config(USART1, USART_DMARECEIVEREQUEST_ENABLE);
/* Enable DMA channel interrupt */
nvic_irq_enable(DMA0_Channel2_IRQn, 0, 0);
dma_interrupt_enable(DMA0, DMA_CH2, DMA_INT_FTF);
/* Start DMA transfer */
dma_channel_enable(DMA0, DMA_CH2);
}
/* Interrupt service routine to handle DMA completion */
void DMA0_Channel2_IRQHandler(void){
if(dma_flag_get(DMA0, DMA_FLAG_FEIF_CH2)){
// Handle error here...
}
else{
// Process received data from buffer...
// Clear flag after processing.
dma_clear_flag(DMA0, DMA_FLAG_FTFIF_CH2 | DMA_FLAG_HTFIF_CH2 | DMA_FLAG_TEFIF_CH2);
}
}
```
上述代码展示了如何利用DMA技术提高GD32F103系列MCU上USART接口的工作效率[^1]。当DMA传输完成时触发IRQ中断,可以在该ISR内部对接收到的信息做进一步解析或存储操作。
阅读全文
相关推荐



















