gd32 uart dma
时间: 2023-11-29 13:06:45 浏览: 158
GD32 UART DMA是一种通过DMA(直接内存访问)方式实现UART数据传输的方法。相比于CPU直接操作UART,使用DMA可以减轻CPU的负担,提高数据传输效率。下面是GD32 UART DMA的实现步骤:
1. 配置UART和DMA通道,使它们能够正常工作。
2. 配置DMA通道的传输方向、传输数据长度、传输数据地址等参数。
3. 使能DMA通道和UART的DMA传输功能。
4. 在DMA传输完成后,通过DMA传输完成中断或者查询方式获取传输状态。
下面是一个GD32 UART DMA的例子:
```c
#include "gd32f10x.h"
#define USART0_DR_ADDRESS ((uint32_t)0x40013804)
#define BUFFER_SIZE 32
uint8_t tx_buffer[BUFFER_SIZE] = "GD32 UART DMA test\r\n";
uint8_t rx_buffer[BUFFER_SIZE];
void dma_config(void)
{
dma_parameter_struct dma_init_struct;
/* enable DMA clock */
rcu_periph_clock_enable(RCU_DMA0);
/* initialize DMA channel 2 */
dma_deinit(DMA0, DMA_CH2);
dma_struct_para_init(&dma_init_struct);
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_addr = (uint32_t)tx_buffer;
dma_init_struct.memory_inc = DMA_MEMORY_INC_ENABLE;
dma_init_struct.periph_addr = USART0_DR_ADDRESS;
dma_init_struct.periph_inc = DMA_PERIPH_INC_DISABLE;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init_struct.number = BUFFER_SIZE;
dma_init(DMA0, DMA_CH2, &dma_init_struct);
/* enable DMA channel 2 */
dma_channel_enable(DMA0, DMA_CH2);
}
void usart_config(void)
{
usart_parameter_struct usart_init_struct;
/* enable USART clock */
rcu_periph_clock_enable(RCU_USART0);
/* initialize USART */
usart_deinit(USART0);
usart_struct_para_init(&usart_init_struct);
usart_init_struct.baud_rate = 115200;
usart_init_struct.word_length = USART_WL_8BIT;
usart_init_struct.stop_bits = USART_STB_1BIT;
usart_init_struct.parity = USART_PM_NONE;
usart_init_struct.flow_control = USART_FC_NONE;
usart_init_struct.mode = USART_MODE_TX_RX;
usart_init(USART0, &usart_init_struct);
/* enable USART DMA TX */
usart_dma_transmit_config(USART0, USART_DENT_ENABLE);
/* enable USART */
usart_enable(USART0);
}
int main(void)
{
dma_config();
usart_config();
/* wait DMA transmit complete */
while(!dma_flag_get(DMA0, DMA_CH2, DMA_FLAG_FTF));
/* clear DMA transmit complete flag */
dma_flag_clear(DMA0, DMA_CH2, DMA_FLAG_FTF);
/* enable DMA channel 3 */
dma_channel_enable(DMA0, DMA_CH3);
/* wait DMA receive complete */
while(!dma_flag_get(DMA0, DMA_CH3, DMA_FLAG_FTF));
/* clear DMA receive complete flag */
dma_flag_clear(DMA0, DMA_CH3, DMA_FLAG_FTF);
/* disable DMA channel 3 */
dma_channel_disable(DMA0, DMA_CH3);
/* disable USART */
usart_disable(USART0);
while(1);
}
```
阅读全文