gd32 usart dma
时间: 2023-05-03 13:04:21 浏览: 143
GD32系列是一系列的ARM Cortex-M3处理器,其中包含了USART通信模块和DMA控制器。USART是一种通用的异步同步收发传输协议,它可以连接各种外设设备。DMA是一种直接内存访问技术,可以将数据从外设或内存直接移到另一个内存地址,从而避免CPU的干预,提高数据传输效率。
对于GD32系列的USART和DMA,可以实现很多通信任务,例如串口调试、数据采集、通信控制等。USART和DMA的配合使用,可以实现高速数据传输和实时数据处理,能够大大提高系统的稳定性和效率。
在使用USART和DMA进行数据传输时,需要注意以下几点:
1.设置USART和DMA的工作模式和参数,包括波特率、数据位、停止位、奇偶校验位等,确保数据的正确传输。
2.设置USART和DMA的中断回调函数,处理数据接收和发送的中断事件。
3.配置DMA传输的源地址和目的地址、传输数据的长度以及传输方向等参数。
4.启动USART和DMA的传输功能,并监测传输状态,确保数据的成功传输。
综上所述,GD32系列的USART和DMA是一对强大的通信组合,可以实现高效稳定的数据传输和处理。对于需要频繁进行数据通信的嵌入式系统,使用这种通信方案可以大大提高系统的性能和可靠性。
相关问题
gd32 usart DMA
### GD32微控制器中的USART与DMA配合使用
GD32系列微控制器提供了丰富的外设支持,其中包括串口通信模块(USART)和直接存储器访问模块(DMA)。通过将USART与DMA相结合,可以实现高效的数据传输而无需频繁干预CPU资源。这种组合特别适用于需要连续数据流的应用场景。
#### USART与DMA的工作原理
当配置好DMA用于USART接收或发送时,DMA会自动处理数据缓冲区到寄存器之间的转移操作或者相反方向的操作。这样能够减少处理器负载并提高吞吐量[^1]。具体来说,在发送模式下,DMA负责从内存读取数据并通过USART硬件发送出去;而在接收模式下,则是从USART接收到的数据被写入指定的内存区域中去[^2]。
#### 配置步骤概述
为了使能USART-DMA功能,通常需要完成以下几个方面的设置:
- **初始化GPIO引脚**:确保TX/RX对应的物理针脚已经正确定义为复用功能。
- **设定波特率及时钟源**:根据实际需求调整合适的通讯速度参数以及关联的系统时钟频率。
- **开启中断向量表映射机制**(如果适用的话),以便于异常情况下的错误恢复流程得以执行。
- **激活DMA通道并与相应的USART实例绑定起来**, 同时定义好传输方向(仅限读/写还是双向均可) 及其他必要的属性比如优先级等级等选项。
下面给出了一段基于RT-Thread RTOS环境下的C语言示范代码片段来展示如何启动一个简单的异步串行端口消息传递过程:
```c
#include "gd32f4xx.h"
#include <rtthread.h>
#define BUFFER_SIZE 64
uint8_t dma_tx_buffer[BUFFER_SIZE];
uint8_t dma_rx_buffer[BUFFER_SIZE];
void usart_dma_init(void){
/* Enable clocks */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);
rcu_periph_clock_enable(RCU_DMA0);
/* Configure GPIOs as alternate function push-pull */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9|GPIO_PIN_10);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9 | GPIO_PIN_10);
gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9 | GPIO_PIN_10);
/* Initialize USART parameters */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U);
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);
/* Set up DMA channel for transmission and reception */
dma_channel_disable(DMA0, DMA_CH4);
dma_transfer_direction_config(DMA0, DMA_CH4, DMA_MEMORY_TO_PERIPHERAL);
dma_memory_data_size_config(DMA0, DMA_CH4, DMA_MDATA_SIZE_BYTE);
dma_peripheral_data_size_config(DMA0, DMA_CH4, DMA_PDATA_SIZE_BYTE);
dma_circular_mode_config(DMA0, DMA_CH4, ENABLE);
dma_priority_config(DMA0, DMA_CH4, DMA_PRIORITY_HIGH);
dma_fmem_address_config(DMA0, DMA_CH4, (uint32_t)&dma_tx_buffer[0]);
dma_periph_address_config(DMA0, DMA_CH4, (uint32_t)&(USART_DATA_REG_VAL(USART0)));
dma_number_data_config(DMA0, DMA_CH4, BUFFER_SIZE);
dma_interrupt_enable(DMA0, DMA_CH4, DMA_INT_FTF);
dma_channel_enable(DMA0, DMA_CH4);
dma_channel_disable(DMA0, DMA_CH5);
dma_transfer_direction_config(DMA0, DMA_CH5, DMA_PERIPHERAL_TO_MEMORY);
dma_memory_data_size_config(DMA0, DMA_CH5, DMA_MDATA_SIZE_BYTE);
dma_peripheral_data_size_config(DMA0, DMA_CH5, DMA_PDATA_SIZE_BYTE);
dma_circular_mode_config(DMA0, DMA_CH5, DISABLE);
dma_priority_config(DMA0, DMA_CH5, DMA_PRIORITY_LOW);
dma_fmem_address_config(DMA0, DMA_CH5, (uint32_t)&dma_rx_buffer[0]);
dma_periph_address_config(DMA0, DMA_CH5, (uint32_t)&(USART_DATA_REG_VAL(USART0)));
dma_number_data_config(DMA0, DMA_CH5, BUFFER_SIZE);
dma_interrupt_enable(DMA0, DMA_CH5, DMA_INT_HT | DMA_INT_ERR);
dma_channel_enable(DMA0, DMA_CH5);
}
int main(){
rt_hw_usart_dma_init();
while(1){
// Your application logic here.
}
}
```
上述程序展示了怎样利用DMA技术加速USART设备上的大批量资料交换活动。注意这里假设目标平台运行的是RT-Thread操作系统,并且调用了`rt_hw_usart_dma_init()`函数来进行全局性的初期准备工作[^3]。
gd32串口USART DMA方式
### GD32 USART DMA 串口通信配置
#### 配置USART模块
为了实现GD32的USART通过DMA方式传输数据,首先需要正确设置USART外设参数。这包括波特率、字符长度、停止位以及校验模式等基本属性。
```c
/* 初始化结构体 */
struct gd32_uart {
uint32_t baud_rate; /* 波特率 */
uint8_t data_bits; /* 数据位数 */
uint8_t stop_bits; /* 停止位数 */
uint8_t parity; /* 校验类型 */
};
void usart_config(struct gd32_uart *uart) {
rcu_periph_clock_enable(RCU_USARTx); // 启用USART时钟
usart_deinit(USARTx);
uart->baud_rate = 9600;
uart->data_bits = DATA_8BIT;
uart->stop_bits = STOP_BIT_1;
uart->parity = NO_PARITY;
usart_baudrate_set(USARTx, uart->baud_rate); // 设置波特率
usart_word_length_set(USARTx, uart->data_bits); // 设置数据位宽度
usart_stop_bit_set(USARTx, uart->stop_bits); // 设置停止位数量
usart_parity_config(USARTx, uart->parity); // 设置奇偶检验选项
}
```
#### 配置DMA控制器
接着要为USART配置相应的DMA通道用于自动处理数据传送任务。这里假设已知具体的DMA请求映射关系表,并据此选择合适的DMA流/通道来关联到指定的USART设备上[^1]。
```c
static void dma_init(void){
/* 开启DMA时钟 */
rcu_periph_clock_enable(DMA_PERIPH_CLOCK);
/* 清除DMA寄存器默认值 */
dma_channel_reset(DMAy_Channelz);
/* 配置DMA传输参数 */
struct dma_parameter_struct dma_init_struct={
.peripheral_addr=(uint32_t)&USART_DATA_REG,
.memory_addr=buffer_address,
.direction=DMA_MEMORY_TO_PERIPHERAL,
.size=DMA_SIZE,
.priority=DMA_PRIORITY_HIGH,
.mode=DMA_CIRCULAR_MODE | DMA_MEMORY_INCREASE,
.number_of_data=length_in_bytes
};
dma_init(DMAy_Channelz,&dma_init_struct);
/* 关联DMA至USART */
usart_dma_transmit_config(USARTx,DMA_TRANSMIT_ENABLE);
}
```
#### 中断服务程序设计
当采用空闲线检测机制作为触发条件之一时,则需编写专门针对该事件响应的服务例程(ISR),以便及时捕获并处理接收到的信息片段。
```c
void usart_isr_handler(void){
if (usart_interrupt_flag_get(USARTx, USART_INT_FLAG_IDLE)){
/* 处理接收缓冲区中的有效载荷 */
/* 清除IDLE标志位 */
usart_interrupt_flag_clear(USARTx, USART_INT_FLAG_IDLE);
/* 可选操作:通知应用程序层有新消息到达 */
}
}
```
#### 应用实例展示
下面给出一段简单的测试代码用来验证上述配置的有效性:
```c
int main(){
char send_buffer[]="Hello World!";
int buffer_size=strlen(send_buffer)+1;
usart_config(&my_uart_settings);
dma_init();
while(1){
/* 发送字符串给另一端 */
memcpy(dma_memory_base_ptr,send_buffer,buffer_size);
/* 触发一次完整的DMA事务 */
dma_channel_enable(DMAy_Channelz);
delay_ms(DELAY_TIME_BETWEEN_TRANSFERS);
}
return 0;
}
阅读全文
相关推荐
















