UART¶
FAQ1 串口有输出log,用串口发送数据时有0x0D及其他数据¶
解决方法:
关闭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应用笔记
排查方向如下:
串口menuconfig 配置是否正确
例如:UART1 RX 使用了DMA后,配置如下
DMA config是否配置正确
DMA config配置信息位于:sdk\customer\boards\include\config\sf32lb5xx。
以sf32lb52x为例,参考如下:
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 |
对于56x/55x/58x平台,HCPU使用LCPU的UART DMA, 确认是否使用的是外部32k晶振。
使用外部32k晶振配置方法
menuconfig
备注
没有勾选,表示使用的外部32k。
勾选,表示使用的rc10k 。
以56x为例的电路图
原因:56x/55x/58x平台的rc10k校准位于LCPU,RC10K校准的时候会把PCLK2降频到6M,校准期间通过APB总线访问PMU寄存器,会占用APB总线2~3us。
而HCPU通过访问小核UART 也需要通过APB总线。 对于UART连续通讯时,APB总线被RC10K占用2~3us时,可能会存在1byte的丢失。
总线结构: