我想让uart1在230400波特率下输出
在不分频的情况下,输出的是乱码
但是在115200波特率下输出是没问题的
查资料以后按照这里的方法进行了分频:https://wiki.sipeed.com/soft/Lichee/zh/Zero-Doc/Drive/UART.html
分频以后,发现有2个问题
1.uart1的在230400波特率下输出不是乱码了,但是信号不稳定,每200个字节就有一个错的
2.如果在uart0控制台进行键盘输入,就会出现如下的错误
buildroot login: !"#$%&'()*+,-./01234[ 4688.082081] serial8250_interrupt: 10186593 callbacks suppressed
[ 4688.082091] serial8250: too much work for irq36
[ 4688.092845] serial8250: too much work for irq36
[ 4688.097636] serial8250: too much work for irq36
[ 4688.102425] serial8250: too much work for irq36
[ 4688.107215] serial8250: too much work for irq36
[ 4688.112002] serial8250: too much work for irq36
[ 4688.116792] serial8250: too much work for irq36
[ 4688.121579] serial8250: too much work for irq36
[ 4688.126368] serial8250: too much work for irq36
[ 4688.131155] serial8250: too much work for irq36
请问是什么原因呢?如果要波特率超过115200,有什么办法呢?
--------------------下面是分配的操作方法-----------------------------------------------------------------------
https://wiki.sipeed.com/soft/Lichee/zh/Zero-Doc/Drive/UART.html
一、波特率分频问题#
为了串口通信稳定,一般要求波特率误差在2.5%以内。
V3S的uart是挂在APB2下,而APB2时钟是24M,所以对一些高速率的波特率,难以分频到合适的频率。
以921600为例,下面进行修改:
进入 uboot的arch/arm/mach-sunxi/clock_sun6i.c,修改uart时钟:
void clock_init_uart(void)
{
#if CONFIG_CONS_INDEX < 5
struct sunxi_ccm_reg *const ccm =
(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
/* uart clock source is apb2 */
writel(APB2_CLK_SRC_OSC24M| //这里改为APB2_CLK_SRC_PLL6,从内部pll6时钟分频
APB2_CLK_RATE_N_1| //这里预分频不变
APB2_CLK_RATE_M(1),
&ccm->apb2_div);
pll6时钟默认为600MHz,可以分出比较高的串口波特率。
600/0.9216/16=40.69, 舍入为41,相对误差为0.75%
/* ns16550 reg in the low bits of cpu reg */
#define CONFIG_SYS_NS16550_CLK 24000000 //这里改为600000000
#ifndef CONFIG_DM_SERIAL
离线