GD32 使用DMA实现UART串口printf打印

GD32E50x_Firmware_Library_v1.2.4

算是两个例程的结合吧

Examples\USART\DMA_transmitter&receiver_interrupt

Examples\USART\Printf

Printf例程中把fputc重定义为USART串口输出

DMA_transmitter&receiver_interrupt例程中把txbuffer输出至串口

结合起来如下USART0_DMA_Printf

其中buffer数组大小的定义是否为最佳?

DMA_transmitter&receiver_interrupt取消初始化串口输出使能即可

// dma_channel_enable(DMA0, DMA_CH3);

需要#include <stdarg.h>

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t)ch);
    while (RESET == usart_flag_get(USART0, USART_FLAG_TBE))
        ;
    return ch;
}

void USART0_DMA_Printf(const char *format, ...)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GD32 UART DMA是一种通过DMA(直接内存访问)方式实现UART数据传输的方法。相比于CPU直接操作UART使用DMA可以减轻CPU的负担,提高数据传输效率。下面是GD32 UART DMA实现步骤: 1. 配置UARTDMA通道,使它们能够正常工作。 2. 配置DMA通道的传输方向、传输数据长度、传输数据地址等参数。 3. 使能DMA通道和UARTDMA传输功能。 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); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值