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

[复制链接]
900|2
 楼主| 发送到工地施工 发表于 2023-9-30 19:13 | 显示全部楼层 |阅读模式
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 | 显示全部楼层
  1. /* retarget the C library printf function to the USART */
  2. int fputc(int ch, FILE *f)
  3. {
  4.     usart_data_transmit(USART0, (uint8_t)ch);
  5.     while (RESET == usart_flag_get(USART0, USART_FLAG_TBE))
  6.         ;
  7.     return ch;
  8. }

  9. void USART0_DMA_Printf(const char *format, ...)
  10. {
  11.     static char buffer[100];//数组大小的定义?增加static防止数组被回收

  12.     va_list args;
  13.     va_start(args, format);
  14.     uint16_t len = vsnprintf((char *)buffer, sizeof(buffer), (char *)format, args);
  15.     va_end(args);

  16.     dma_channel_disable(DMA0, DMA_CH3);
  17.     dma_memory_address_config(DMA0, DMA_CH3, (uint32_t)buffer);
  18.     dma_transfer_number_config(DMA0, DMA_CH3, len);
  19.     dma_channel_enable(DMA0, DMA_CH3);
  20. }
 楼主| 发送到工地施工 发表于 2023-9-30 19:14 | 显示全部楼层
2023-3-30遇到发送乱码,只有前几个字节正常,看波形都正常,FreeRTOS提高优先级等均无效,果然是buffer临时被回收数据错乱了,加了static好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

155

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部