GD32的UART3如何配置DMA初始化?
时间: 2024-09-21 15:02:59 浏览: 84
在GD32微控制器中,配置UART3的DMA初始化主要包括以下几个步骤:
1. **开启硬件支持**:
首先,确保在系统配置阶段启用了DMA和相应的UART3功能。例如,在`SystemClock_Config()`函数中可能已经完成这个操作。
2. **配置DMA资源**:
获取对应于UART3的DMA链路(如DMA channel 4 for RX 和 channel 5 for TX),并分配必要的资源。比如创建一个`DMA_HandleTypeDef`实例:
```c
DMA_HandleTypeDef hdma_usart3_rx;
DMA_HandleTypeDef hdma_usart3_tx;
```
3. **初始化DMA**:
对每个DMA链路进行初始化,提供源和目的地的内存地址以及数据长度:
```c
// 初始化RX DMA
hdma_usart3_rx.Instance = USART3_DMArx;
HAL_DMA_DeInit(&hdma_usart3_rx);
hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4; // DMA Channel 4
hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart3_rx.Init.Mode = DMA_NORMAL;
hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;
hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
hdma_usart3_rx.Init.Request = DMA_REQUEST_USART3_REMIND;
if(HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
... // 处理错误
// 初始化TX DMA
hdma_usart3_tx.Instance = USART3_DMAtx;
HAL_DMA_DeInit(&hdma_usart3_tx);
hdma_usart3_tx.Init.Channel = DMA_CHANNEL_5; // DMA Channel 5
// ... 其他参数与RX类似
```
4. **配置DMA通道**:
将DMA链路连接到对应的UART3回调函数,如接收到字符后的`USART_RxCompltCallback()`和发送完成的`USART_TxCompltCallback()`:
```c
// RX DMA
HAL_UART_RxCpltCallback(&huart3);
HAL_DMA_Start_IT(&hdma_usart3_rx, (uint32_t)USART_RX_BUF_PTR, &huart3->Instance->DR, USART_RX_SIZE);
// TX DMA
HAL_UART_TxCpltCallback(&huart3);
HAL_DMA_Start_IT(&hdma_usart3_tx, (uint32_t)&huart3->Instance->TDR, (uint32_t)USART_TX_BUF_PTR, USART_TX_SIZE);
```
5. **启用和开始传输**:
最后,启用DMA,并可能开启它的工作模式,比如连续模式(Continuous Transfer Mode)或单次请求模式(Single Request Mode),然后启动传输。
```c
HAL_DMA_Cmd(&hdma_usart3_rx, ENABLE); // 开启DMA
HAL_DMA_Cmd(&hdma_usart3_tx, ENABLE);
```
记得检查上述过程中的每个步骤是否成功,如有错误需要妥善处理。
阅读全文