打印

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

[复制链接]
318|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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>

使用特权

评论回复
沙发
发送到工地施工|  楼主 | 2023-9-30 19:14 | 只看该作者
/* 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, ...)
{
    static char buffer[100];//数组大小的定义?增加static防止数组被回收

    va_list args;
    va_start(args, format);
    uint16_t len = vsnprintf((char *)buffer, sizeof(buffer), (char *)format, args);
    va_end(args);

    dma_channel_disable(DMA0, DMA_CH3);
    dma_memory_address_config(DMA0, DMA_CH3, (uint32_t)buffer);
    dma_transfer_number_config(DMA0, DMA_CH3, len);
    dma_channel_enable(DMA0, DMA_CH3);
}

使用特权

评论回复
板凳
发送到工地施工|  楼主 | 2023-9-30 19:14 | 只看该作者
2023-3-30遇到发送乱码,只有前几个字节正常,看波形都正常,FreeRTOS提高优先级等均无效,果然是buffer临时被回收数据错乱了,加了static好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

85

帖子

0

粉丝