OK6410:系统时钟

  从爸爸公司拿了一条好的USB转串口线回来,我的OK6410终于可以和我的笔记本连接上了,secureCRT显示和接收按键都没有问题,感谢爸爸!

  如果secureCRT能显示U-boot启动信息,但是就是不能接收按键,那么可以先看看有没有设置流控制,如果设置了,那么都流控制设置成无,也就是什么都不选。如果还是不行...那么

  1.换个终端试试,例如DNW、minicom、超级终端...

  2.换台地电脑试试,网上有人说重装系统,真的是大动干戈...

  如果以上都试过了,还是不行,就是你的USB转串口坏掉了,赶紧换一条吧。


  USB转串口好了,接下来又可以玩裸板了,按照韦东山老师的教学视频,知道怎么玩系统时钟了,分享一下。

  我们的OK6410开发板上的晶振频率是12Mhz


  外部晶振提供的12Mhz给S3C6410中的APLL,设置一定的参数可提高系统时钟,可以让CPU跑得更快

  在S3C6410的芯片手册上,系统控制-》时钟架构
  MUX多路选择器 0:可以原原本本输入12MHz,1:是经过APLL提升的时钟频率

OK6410:系统时钟_第1张图片
  上图的ARMCLK就是CPU时钟


  设置APLL
  如果我们要设置CPU时钟频率为532MHz,我们可以使用芯片手册上提供给我们的FOUT公司进行进行计算
  FOUT = MDIV * FIN / (PDIV * 2^SDIV) = 532MHz
  FIN就是晶振频率12Mhz,其余的参数要自己设定


  DIV分频器
  ARMCLK = DOUTAPLL / (ARM_RADIO + 1)


  设置LOCK_TIME
  设置APLL_LOCK_TIME
  ARM时钟频率提高需要一定时间,所要要设置APPL_LOCK_TIME,当中CPU不工作


  APLL给ARM CPU使用
  MPLL给主设备、HCLK(内存,DDR),PCLK(外设片上模块)
  EPLL给其它模块


  OTHERS寄存器设置为异步模式
  读入OTHERS内存的值,并bic清0xc0
  当各种时钟使用不同的频率,所以要设置成异步
  循环判断,等待设置完成
  


  其实也不用清零的,因为从芯片手册删可以看出,复位的时候就是零 

  然后等待异步模式设置完成,那就要等待bit8~bit11为0即可,至于为什么,S3C6410的手册介绍的还不是很清楚...

 


  DOUT为分频
  设置CLK_DVIO
  设置ARM_RATIO 0 主核分频为1分频
  设置HCLCKX2_RATIO 1 将输入的时钟进行2分频
  设置HCLK_RATIO 1 再将输入的时钟2分频,能供内存使用
  设置PCLK_RATIO 3 其他RATIO的设置


  设置好了,才启动ARLL,然后再设置MUX切换时钟
  设置APLL,先配置APLL_CON寄存器,公式为MDIV * Fin / (PDIV * 2^SDIV) = 266 * 12 / (3 * 2^1) = 532
  最高位为使能端(1 << 31)
  MDIV (266 << 16)
  PDIV (3 << 8)
  SDIV 1


  设置MPLL,同APLL设置
  设置MUX切换时钟,设置CLOCK_SRC
  MPLL_SET[1] 0:FINMAPLL,1:FOUTMPLL
  APLL_SET[0] 0:FINMAPLL,1:FOUTMPLL
  
  先设置参数,再使能,再切换


  以下是芯片手册的寄存器地址和相关值的位

OK6410:系统时钟_第2张图片

OK6410:系统时钟_第3张图片

  下面贴出代码clock.c的代码:

   #define APLL_LOCK (*((volatile unsigned long *)0x7E00F000)) //APLL配置寄存器 #define MPLL_LOCK (*((volatile unsigned long *)0x7E00F004)) //MPLL配置寄存器 #define EPLL_LOCK (*((volatile unsigned long *)0x7E00F008)) //EPLL配置寄存器 #define OTHERS (*((volatile unsigned long *)0x7e00f900)) //其他寄存器 #define CLK_DIV0 (*((volatile unsigned long *)0x7E00F020)) //时钟分频寄存器 #define ARM_RATIO 0 /* ARMCLK = DOUTAPLL / (ARM_RATIO + 1) = 532MHz */ #define HCLKX2_RATIO 1 /* HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) = 266MHz */ #define HCLK_RATIO 1 /* HCLK = HCLKX2 / (HCLK_RATIO + 1) = 133MHz */ #define PCLK_RATIO 3 /* PCLK = HCLKX2 / (PCLK_RATIO + 1) */ #define MPLL_RATIO 0 /* DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1) */ #define APLL_CON (*((volatile unsigned long *)0x7E00F00C)) #define APLL_CON_VAL ((1<<31) | (266 << 16) | (3 << 8) | (1)) #define MPLL_CON (*((volatile unsigned long *)0x7E00F010)) #define MPLL_CON_VAL ((1<<31) | (266 << 16) | (3 << 8) | (1)) #define CLK_SRC (*((volatile unsigned long *)0x7E00F01C)) void clock_init(void) { APLL_LOCK = 0xffff; MPLL_LOCK = 0xffff; EPLL_LOCK = 0xffff; /* set async mode 当CPU时钟 != HCLK时,要设为异步模式 */ OTHERS &= ~0xc0; //将bit6,bit7清零 while ((OTHERS & 0xf00) != 0); //等待bit8~bit11变为0,则完成异步模式的切换 CLK_DIV0 = (ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12); //配置时钟分频 APLL_CON = APLL_CON_VAL; /* 532MHz */ MPLL_CON = MPLL_CON_VAL; /* 532MHz */ CLK_SRC = 0x03; //bit0,bit1置1,则APLL、MPLL的MUX都会切换到532MHz的时钟频率上去 }


  在汇编启动代码中,在跳转到main函数之前,加上一下一句,即可设置时钟
   bl clock_init

  main函数,我就按照韦东山老师的视频教学上说的,写流水灯代码,可以看到如果延时不够,则流水灯跑得非常快。

  在编写这个程序的Makefile就OK了,啊...写得有点累了


你可能感兴趣的:(OK6410:系统时钟)