降低CPU主频bootloader 是 2440BOOT_V5.1

本文介绍了一种解决因布线问题导致的ARM启动失败的方法,通过调整CPU主频从400MHz降至304MHz,并详细记录了修改bootloader的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于公司的产品板子是自己的工程师画的,可能布线的问题,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重新编译下就可以了。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值