UART

FAQ1 串口有输出log,用串口发送数据时有0x0D及其他数据

解决方法:

  1. 关闭log后再输出,输出后恢复log, 控制RT_DEVICE_FLAG_STREAM是因为_serial_poll_tx()里会在0x0A前插入0x0D

void my_send_data_by_concole_uart1(uint8_t *data, uint16_t len)
{
    log_pause(1);

#if RT_USING_CONSOLE
    rt_device_t uart_dev = rt_device_find(RT_CONSOLE_DEVICE_NAME);
#else
    rt_device_t uart_dev = rt_device_find("uart1");
    rt_device_open(uart_dev, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_DMA_RX);
#endif

    if (uart_dev == RT_NULL)
    {
          log_pause(0);
          LOG_E("send error");
          return;
    }

    int is_stream = uart_dev->open_flag & RT_DEVICE_FLAG_STREAM;
    uart_dev->open_flag &= ~RT_DEVICE_FLAG_STREAM;

    rt_device_write(uart_dev, 0, data, len);


    if (is_stream)
    {
        uart_dev->open_flag |= RT_DEVICE_FLAG_STREAM;
    }
    log_pause(0);
}


FAQ2 串口RX配置DMA后,无法接收到串口数据或者漏数据,如何排查?

串口RX配置DMA的方法参考文档《UART应用笔记》的1.8节。 UART应用笔记
排查方向如下:

  1. 串口menuconfig 配置是否正确
    例如:UART1 RX 使用了DMA后,配置如下

../../_images/uart1_rx_dma_menuconfig.png
  1. DMA config是否配置正确
    DMA config配置信息位于:sdk\customer\boards\include\config\sf32lb5xx。
    以sf32lb52x为例,参考如下:

../../_images/dma_config_52x.png

dma_config.c中UART对应的宏是否正确配置,重点确认两点:

  • UART使用DMA通道是否有其他设备也在使用,尽可能确保UART使用DMA通道的唯一性。

  • UART的DMA_REQUEST是否正确
    DMA_REQUEST和外设绑定,存在唯一性。

UART总线

52x

55x

56x

58x

UART1_TX

DMAC1_4

DMAC1_4

DMAC1_4

DMAC1_4

UART1_RX

DMAC1_5

DMAC1_5

DMAC1_5

DMAC1_5

UART2_TX

DMAC1_6

DMAC1_6

DMAC1_6

DMAC1_6

UART2_RX

DMAC1_7

DMAC1_7

DMAC1_7

DMAC1_7

UART3_TX

DMAC1_26

DMAC2_0

DMAC1_26

DMAC1_26

UART3_RX

DMAC1_27

DMAC2_1

DMAC1_27

DMAC1_27

UART4_TX

DMAC2_2

DMAC2_0

DMAC3_0

UART4_RX

DMAC2_2

DMAC2_1

DMAC3_1

UART5_TX

DMAC2_4

DMAC2_2

DMAC3_2

UART5_RX

DMAC2_5

DMAC2_3

DMAC3_3

UART6_TX

DMAC2_4

DMAC3_4

UART6_RX

DMAC2_5

DMAC3_5

  1. 对于56x/55x/58x平台,HCPU使用LCPU的UART DMA, 确认是否使用的是外部32k晶振。

使用外部32k晶振配置方法
menuconfig

../../_images/LCPU_use_32k_menuconfig1.png

备注

没有勾选,表示使用的外部32k。
勾选,表示使用的rc10k 。

以56x为例的电路图

../../_images/32k_crystal1.png

原因:56x/55x/58x平台的rc10k校准位于LCPU,RC10K校准的时候会把PCLK2降频到6M,校准期间通过APB总线访问PMU寄存器,会占用APB总线2~3us。
而HCPU通过访问小核UART 也需要通过APB总线。 对于UART连续通讯时,APB总线被RC10K占用2~3us时,可能会存在1byte的丢失。
总线结构:

../../_images/UART_HCPU2LCPU_APB1.png