u-boot 串口乱码问题的解决

 1:时钟问题,  以前总是一知半解,这次彻底搞明白了,2440的PLL分为两种,MPLL和UPLL,MPLL用来做系统时钟,UPLL则是USB时钟(必须为48M),两种时钟的计算方法一样:

           Mpll=(m×Fosc×2)÷(p×2^s)   记住是2的s次幂  2410 不必乘2

             m=MDIV+8

             p=PDIV+2

             s=SDIV

    Upll=(m×Fosc×2)÷(p×2^s)

           这里的m,p,s 分别都在MPLLCON 寄存器的[19:12],[9:4],[1:0]或UPLLCON寄存器的[19:12],[9:4],[1:0]里进行设置,他们的取值详见官方的推荐表:官方推荐表

   MPLLCON和UPLLCON的值根据上面的两个公式计算而来,而这两个寄存器的设置值决定了系统的工作主频,和USB的主时钟分频前的频率。

        如果用到USB或串口的话,那就需要小心的设置CLKDIVN寄存器了,这个寄存器的DIVN_UPLL位决定了USB的时钟,且必须为48M,

   例如:

       你的UPLL设置为48M时  则不需要分频,DIVN_UPLL位为0就可以了,反之,如果你的UPLL设置为96M时,为保持USB时钟为48M,这里的DIVN_UPLL必须设置为1.

       HDIVN设置则要稍微复杂些,需要根据CAMDIVN[9]来综合决定,原则是首先确定你想要的HCLK频率,然后再结合系统的频率限制合理的来设置。

       PDIVN设置直接决定你的串口能否正常工作了,同样举个例子:

       当前系统的主频为MPLL 为400M ,UPLL为48M,CAMDIVN[9]位为0,那么想得到115200的波特率,CLKDIVN寄存器应该设置为多少?首先可以确定DIVN_UPLL位为0,解释见上面,接下来确定HDIVN和PDIVN了,s3c24x0的波特率计算公式为

               UBRDIV=PCLK/(baudrate×16)-1

波特率直接和PCLK有关,假设UBRDIV设置为0x1A,则PCLK为50M,是PCLK的1/8,所以HDIVN=2  PDIVN=1。

       在SMDK2410基础上进行2440的移植时钟部分要注意两个地方,第一个是start.s里关于时钟的设置,还有一个是speed.c里get_HCLK函数和get_PLLCLK函数。需要你根据相应的时钟寄存器进行修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值