use*_*953 2 c embedded avr serial-port uart
需要注意的一些有趣的事情,我尚未完全理解。我的UART初始化为9600波特。我已经通过逻辑分析仪查看了线路上的TX,并且我发送的字节具有最小的延迟。预期为每字节36µs。
现在,如果我使用不同的波特率(例如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();
}
Run Code Online (Sandbox Code Playgroud)
这是基于中断触发的。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
时序图如下:
〜9600波特率-

〜115,200波特率-

小智 5
检查三点:
您是否足够快地喂入缓冲液?如果不是这样,则增加的间隙是由于您的数据提供代码,而不是由于处理器的内部行为。(使用拨动销找出)
是否可能由于速度提高而使您的代码每发送一次数据就关闭数据寄存器为空的中断?可以使用put_string(array,length)一次用多个字符填充它,而不是使用put_char填充环形缓冲区(例如,使用memcopy,考虑在必须包装数据时将其分成两个mwmcopy操作)在缓冲区的末尾)。(再次,使用拨动销找到答案)。
将包装在cli()和sei()中的代码减少到最少。切换用标志检查填充缓冲区,并将其从cli-sei部分中排除
祝好运!