GD32F303 UART DMA例程、
时间: 2023-09-16 17:13:01 浏览: 112
以下是一个基于GD32F303的UART DMA例程,可用于向UART发送数据:
```
#include "gd32f30x.h"
#define USART0_DMA_TX_CH DMA_CH3
uint8_t tx_buffer[] = "Hello, World!\r\n";
uint32_t buffer_size = sizeof(tx_buffer);
int main(void)
{
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* enable USART0 clock */
rcu_periph_clock_enable(RCU_USART0);
/* enable DMA clock */
rcu_periph_clock_enable(RCU_DMA);
/* configure USART0 GPIO */
gpio_mode_set(GPIOA, GPIO_MODE_AF_PP, GPIO_PUPD_PULLUP, GPIO_PIN_9);
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_10);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
/* configure USART0 */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200);
usart_word_length_set(USART0, USART_WL_8BIT);
usart_stop_bit_set(USART0, USART_STB_1BIT);
usart_parity_config(USART0, USART_PM_NONE);
usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
usart_enable(USART0);
/* configure DMA */
dma_deinit(DMA0);
dma_channel_disable(DMA0, USART0_DMA_TX_CH);
dma_periph_address_config(DMA0, USART0_DMA_TX_CH, (uint32_t)&USART_DATA(USART0));
dma_memory_address_config(DMA0, USART0_DMA_TX_CH, (uint32_t)tx_buffer);
dma_transfer_direction_config(DMA0, USART0_DMA_TX_CH, DMA_MEMORY_TO_PERIPHERAL);
dma_memory_data_size_config(DMA0, USART0_DMA_TX_CH, DMA_MEMORY_WIDTH_8BIT);
dma_periph_data_size_config(DMA0, USART0_DMA_TX_CH, DMA_PERIPHERAL_WIDTH_8BIT);
dma_transfer_number_config(DMA0, USART0_DMA_TX_CH, buffer_size);
dma_channel_priority_config(DMA0, USART0_DMA_TX_CH, DMA_PRIORITY_HIGH);
dma_circulation_enable(DMA0, USART0_DMA_TX_CH);
dma_memory_increment_enable(DMA0, USART0_DMA_TX_CH);
dma_periph_increment_disable(DMA0, USART0_DMA_TX_CH);
/* enable DMA channel */
dma_channel_enable(DMA0, USART0_DMA_TX_CH);
/* start DMA transfer */
usart_dma_transmit_config(USART0, USART_DENT_ENABLE);
while (1);
}
```
该例程使用了USART0和DMA通道3来发送数据。在主函数中,我们首先使能了GPIO、USART0和DMA的时钟。然后,我们配置了USART0的GPIO引脚,包括TX引脚(PA9)和RX引脚(PA10)。接下来,我们配置了USART0的波特率、数据位数、停止位数、校验位等参数,并启用了接收和发送功能。最后,我们配置了DMA通道3以将数据从内存传输到USART0,启用了循环传输和内存地址自增功能,并启用了DMA通道。最后,我们通过调用`usart_dma_transmit_config()`函数启动了DMA传输。
在上述例程中,我们发送了一个字符串“Hello, World!\r\n”。我们可以通过修改`tx_buffer`和`buffer_size`变量来发送不同的数据。如果需要接收数据,我们可以使用类似的方法配置USART0的接收功能,并使用DMA通道来接收数据。
阅读全文