NXP MCU 技术论坛
直播中

李泽坚

7年用户 1312经验值
私信 关注
[问答]

MK64 UART5容易出现receiver overrun error的原因?怎么解决?

我用的是MK64FN1M0VMD12。在这个芯片上,UART0~3支持双向DMA通道,也就是说DMA_TX和DMA_RX可以同时使用。而UART4~5只能选择单向DMA,所以我实现了UART5_RX到DMA通道接收数据,并调用 UART_WriteBlocking() 发送数据。
我的程序只是做一个 UART-echo,PC->MK64 UART5-RX 然后 MK64 UART5-TX->PC。波特率为 115200,我以 1000Bps 的速度发送。过了一会儿,UART5 溢出。(即使我不要用EDMA接收,在SDK中使用ringbuffer的方式也会溢出。)。当我在UART5上将波特率设置为38400时,它可以工作大约10分钟。但是它在UART0和UART1上运行良好。我还没有由于硬件设计原因,测试了UART2~4。
UART0~3和UART4~5有什么区别,我知道UART0~1的时钟频率是120MHz,UART3~5是60MHz,但我觉得60MHz就够了,另外UART4~5不支持bidirectional DMA channels,UART4~5的性能不是很好吗?比如更小的fifo。
这是溢出后的寄存器变化。
UART5_S1 或 = 1
UART5_SFIFO RXOF = 1
--------------
在 DMA 接收过程中,我将 UART_RxIdle 中断设置为在 rx 空闲时接收。


UART_ClearStatusFlags(base, kUART_IdleLineFlag);
UART_TransferAbortReceiveEDMA(); //abort EDMA to copy data
DMABuf_TO_ReadBuf();             //copy data to read buffer
UART_ReceiveEDMA();              //enable EDMA for next receive

我发现像上面的代码一样,在启用EDMA之前会发生溢出。也就是说,复制数据时会出现新数据。所以像115200这样的更高波特率会导致溢出的情况似乎是有道理的。但是当rx时我该如何接收是空闲的,没有发生溢出,为什么UART0~1可以正常工作?

                        

更多回帖

发帖
×
20
完善资料,
赚取积分