关于S3C2440,最近看到网上有很多朋友说出现串口乱码的问题,同时也看到很多朋友指出了一些解决的办法,但又看到有人说按网上提出的办法还是没能解决乱码问题,我提一个大家都没怎么提的地方吧,希望对大家有用。
串口的问题,肯定是时钟及波特率的问题(排除硬件上的因素)
网上提到过的有:
1、MPLL/UPLL,并列出公式:Mpll/Upll=(m×Fosc×2)÷(p×2^s),
m=MDIV+8
p=PDIV+2
s=SDIV
对于这个,MPLL没错,但UPLL不应乘2,即:Upll=(m×Fosc)÷(p×2^s),这个可以从S3C2440A的datasheet上找到(254页)。MPLL/UPLL/FCLK/HCLK/PCLK要设置正确,否则会有乱码。
2、有人提到speed.c文件中:
“问题就出在: return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s));CONFIG_SYS_CLK_FREQ 为12MHZ , 12M*200*2 结果已经超出了32bit 的范围而导致数据溢出了,所以结果出错”
并提出“修改方法:ulong clk_tmp = (CONFIG_SYS_CLK_FREQ * m )/(p << s);
return (clk_tmp*2); //return ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s));这样u-boot 在串口就可以打印出正常字符。”
我试过,应该是不起作用的。
我要说的是在上述都设置好了以后,还需要注意波特率的分频因子UBRDIV:
UBRDIV=PCLK/(baudrate×16)-1
在文件cpu/arm920t/s3c24x0/serial.c中,有对它的设置,因为我的PCLK=50MHz,baudrate=115200,算下来UBRDIV=26,所以在cpu/arm920t/s3c24x0/serial.c中将UBRDIV直接赋值为0x1a,赋值后编译、下载、运行,乱码没有了!