一些有趣的事情,我还没有完全理解。我的UART被初始化为9600波特。我通过逻辑分析器查看了行上的TX,并且我发送的字节延迟最小。它是每字节36秒,这是预期的。
现在,如果我用不同的波特率(比如115,200 )初始化UART,那么发送的每个字节之间的延迟会显著增加。它会跳转到每字节125 s。
这造成了一个问题,因为我必须提高波特率在某个时候,但有一个时间限制我的反应。
延迟不应该减少字节间的,因为它应该以相同的频率发送更多的比特吗?
此阻塞方法用于向UART写入。
static inline void uart2_putchar(uint8_t data)
{
// Disable interrupts to get exclusive access to ring_buffer_out.
cli();
if (ring_buffer_is_empty(&ring_buffer_out2)) {
// First data in buffer, enable data ready interrupt
UCSR2B |= (1 << UDRIE2);
}
// Put data in buffer
ring_buffer_put(&ring_buffer_out2, data);
// Re-enable interrupts
sei();
}是基于中断触发的。
ISR(USART2_UDRE_vect)
{
// if there is data in the ring buffer, fetch it and send it
if (!ring_buffer_is_empty(&ring_buffer_out2)) {
UDR2 = ring_buffer_get(&ring_buffer_out2);
}
else {
// no more data to send, turn off data ready interrupt
UCSR2B &= ~(1 << UDRIE2);
}
}时序图如下:
~9600波特率--


~115,200波特率--

发布于 2013-09-11 12:36:42
有三点需要检查:
祝好运!
发布于 2013-09-11 12:51:33
只要您足够频繁地调用uart2_putchar(),循环缓冲区就永远不会是空的,并且所测量的间隙由中断响应时间决定。
然而,当您增加波德率时,您将更快地清空该缓冲区。直到一个临界点,中断处理程序将发现缓冲区为空,无法传输一个字节。您所测量的差距现在取决于您调用uart2_putchar()的速率。
https://stackoverflow.com/questions/18725467
复制相似问题