从爸爸公司拿了一条好的USB转串口线回来,我的OK6410终于可以和我的笔记本连接上了,secureCRT显示和接收按键都没有问题,感谢爸爸!
如果secureCRT能显示U-boot启动信息,但是就是不能接收按键,那么可以先看看有没有设置流控制,如果设置了,那么都流控制设置成无,也就是什么都不选。如果还是不行...那么
1.换个终端试试,例如DNW、minicom、超级终端...
2.换台地电脑试试,网上有人说重装系统,真的是大动干戈...
如果以上都试过了,还是不行,就是你的USB转串口坏掉了,赶紧换一条吧。
USB转串口好了,接下来又可以玩裸板了,按照韦东山老师的教学视频,知道怎么玩系统时钟了,分享一下。
我们的OK6410开发板上的晶振频率是12Mhz
外部晶振提供的12Mhz给S3C6410中的APLL,设置一定的参数可提高系统时钟,可以让CPU跑得更快
在S3C6410的芯片手册上,系统控制-》时钟架构
MUX多路选择器 0:可以原原本本输入12MHz,1:是经过APLL提升的时钟频率
上图的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
先设置参数,再使能,再切换
以下是芯片手册的寄存器地址和相关值的位
下面贴出代码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了,啊...写得有点累了