由于公司的产品板子是自己的工程师画的,可能布线的问题,CPU主频过高导致ARM启动不了,就尝试着降低主频的频率,由于三星公司用的FCLK:HCLK:PCLK=1:4:8 的比值关系,原来的CPU主频是400MHz,所以HCLK是100MHz,PCLK是50MHz。FCLK,HCLK,PCLK之间的关系在另一篇博客中有详细的描述。
我之后查看了各种资料和三星的数据手册对bootloader进行修改,把主频降到304MHz,
具体修改如下:首先修改inc目录下的Option.inc文件,在;
(3) Select FCLK
;FCLK SETA
296352000
;FCLK SETA
271500000
;FCLK SETA
100000000
;FCLK SETA
240000000
;FCLK SETA
280000000
;FCLK SETA
320000000
;FCLK SETA
360000000
;FCLK SETA
400000000
FCLK SETA 300000000 ;新添加的
然后再添加
[ FCLK = 300000000
CLKDIV_VAL EQU 7 ;1:3:6
M_MDIV EQU 68 ;Fin=12.0MHz Fout = 304.0MHz
M_PDIV EQU 1
[ CPU_SEL = 32440001 ;2440A
M_SDIV EQU 1
|
M_SDIV EQU 0 ;2440X
]
]
" [ " 相当于 if
" | "相当于else
" ] " 相当于endif
由于
公式如下:FCLK=Mpll=(2*m*Fin)/(p*2^s)
m=M(the value for divider M)+8, p=P(the value for divider P)+2
m=M_MDIV+8,p=M_PDIV,s=M_SDIV;
而对CPU修改主频FCLK的值不是你想修改多少就能修改的,有些数值是不行的,要根据三星数据手册给的
PLL VALUE SELECTION TABLE表给出的值才行。。我就是根据这个表中的数值进行修改的
Input Frequency Output Frequency MDIV PDIV SDIV
12.0000MHz 48.00 MHz (Note) 56(0x38) 2 2
12.0000MHz 96.00 MHz (Note) 56(0x38) 2 1
12.0000MHz 271.50 MHz 173(0xad) 2 2
12.0000MHz 304.00 MHz 68(0x44) 1 1
使用的是这个数值对寄存器MPLLCON进行修改
12.0000MHz 405.00 MHz 127(0x7f) 2 1
12.0000MHz 532.00 MHz 125(0x7d) 1 1
然后修改u2440mon.c文件中的main函数中的
switch(j) {
case 0:
//240
key = 14;
mpll_val = (112<<12)|(4<<4)|(1);
break;
case 1:
//320
key = 14;
mpll_val = (72<<12)|(1<<4)|(1);
break;
case 2:
//400
key = 14;
//mpll_val = (92<<12)|(1<<4)|(1);这个是原来的400MHz主频的设置
mpll_val = (68<<12)|(1<<4)|(1);这个是修改后出现304MHz的主频
break;
case 3:
//420!!!
key = 14;
mpll_val = (97<<12)|(1<<4)|(1);
break;
default:
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
}
然后修改ChangeClockDivider()函数中的
switch(hdivn_val) {
case 11: hdivn=0; break;
case 12: hdivn=1; break;
case 13:
case 16: hdivn=3; break;
case 14:
case 18: hdivn=3; break;修改后的CLKDIV寄存器的HDIVN值,HCLK=3FCLK;
case 18: hdivn=2;break; //原来的CLKDIVN寄存器的HDIVN值,HCLK=4FCLK;
}
switch(pdivn_val) { //CLKDIV寄存器的PDIVN的值不做改变,还是PCLK=1/2HCLK;
case 11: pdivn=0; break;
case 12: pdivn=1; break;
}
这样计算下来FCLK:HCLK:PCLK=1:3:6,,因为HCLK是高速总线的时钟,连接的都是些高速的设备如nand,内存,USB,DMA等设备正常工作的时钟,PCLK是供给低速设备的时钟,如WDT, IIS, I2C, PWM timer, MMC interface,ADC, UART, GPIO, RTC and SPI.即IO接口时钟,例如串口的时钟设置就是从PCLK来的;
所以降低CPU主频的同时还要保证HCLK跟PCLK的值保持在100MHz和50MHZ,这样其他外围设备才能正常工作,才不会导致H-jtag识别不了nandflash。
这样修改完之后用ADS重新编译下就可以了。。。。。。。。。