I ran into another slight issue with the USART the other day, it also seems to be to do with odd behaviour of the USART peripheral registers so I guess there's a small chance it might be related?
When using the USART driver for 1-wire, it's necessary to reconfigure the port using uartStop and uartStart, for example to change the speed. If you call uartStartSend immediately after starting the driver, there is a delay of slightly more than the time needed to send one byte at the new speed, before the first byte is actually sent. So for example, if you stop the driver, restart it at 9600, then send a byte, you can see a delay of about 1ms before the byte is actually sent (which also takes about 1ms). For higher speeds the delay is correspondingly less. Subsequent bytes in the buffer send without a gap as expected, and subsequent uartStartSend calls give no delay before the data appears on the wire.
If you add a sleep between uartStart and uartStartSend, this reduces the delay between calling uartStartSend and seeing the data on the wire; if the sleep is longer than "one byte" in time, then there is no delay between calling uartStartSend and seeing the data.
I haven't tried the same thing with the Serial driver, it may well do the same thing.
I ran into someone on IRC, stm32 channel, who had had the same problem using their own driver, outside ChibiOS, and had found a workaround. I haven't looked at the peripheral in detail so I'll just relay it directly:
I think this fixed it for me- while ((USART2->ISR & USART_ISR_TC) == 0); instead of USART_ISR_TXE
I don't know if this applies to ChibiOS, hopefully it is of some help/interest though.