FL2440的板子,修改12M的晶体为16.9344M后,无法启动???

armeasy 2010-06-01 11:04:24
请教高手们:
原FL2440的开发板,晶体为12MHz,修改为16.9344M后,无法启动,不知何因?
先说一下FL2440的bootloader的组成:
飞凌开发板提供的bootloader由uboot和eboot两部分组成,前面的uboot实现自拷备,同时引导eboot。
eboot实现引导NK。
这里需要修改uboot的代码实现更换晶体。但是实践发现无法正常工作。具体我修改步骤如下:
一:option.inc中:
;XTAL_SEL	SETA	12000000	
XTAL_SEL SETA 16934400

选择16.9344M的晶体
二:option.inc中,
;FCLK		SETA	400000000
FCLK SETA 399651840

修改FCLK为399.65M
三:option.inc中,添加399.65M的分频参数,这里是在16.9344M的分支选项中添加。
[ FCLK = 399651840
M_MDIV EQU 110 ;Fin=16.9344MHz
M_PDIV EQU 3
[ CPU_SEL = 32440001
M_SDIV EQU 1 ; 2440A
|
M_SDIV EQU 0 ; 2440X
]
]

四:option.h中,
//#define FIN 	(12000000)	
#define FIN (16934400)


我觉得该改的都改了,可是为什么就是起不来呢?

在最开始在AXD下调试bootloader时,需要初始化SDRAM,FL2440默认是通过AXD运行一会儿
2440Init.axf,达到初始化SDRAM的目的,然后再导入bootloader。这样就能正常运行导入
的bootloader了。这种方法在12M的板子上是没有问题的,但是我换用16.9344M之后,用同
样的2440Init.axf,再导入上面修改后生成的bootloader映像,却不能正常运行。

后来我没有用那个2440Init.axf了,而是找了个2440init.ini的脚本文件,相关代码如下:
com ==================
com Filename: 2440Anorom.ini
com 2003. 5. xx 1st draft.
com 2004. 3. 4 edited for S3C2440A
com ==================

com For S3C2440A
com SDRAM_Little_32, 64MB
com FCLK:101.25MHz UPLL:48MHz
com SDRAM refresh: 64ms(8Kcycle) -> 7.8us

swat $vector_catch 0x00
swat $semihosting_enabled 0x00
swat psr %IFt_SVC
com swat psr %IF_SVC32

com [disable Watch-Dog reset]
swat *0x53000000 0



com << Clock setting >>
com [PLL lock time setting maximum]
swat *0x4c000000 ((0xfff<<12)+(0xfff<<0))

com FCLK:HCLK:PCLK=1:3:6.
swat *0x4c000014 ((0<<2)+(3<<1)+(1))

com [FCLK PMS setting:294.9140MHz -> 0x7f,2,2]
swat *0x4c000004 ((0x61<<12)+(0x1<<4)+(0x2<<0))

com [UCLK PMS setting:48MHz -> 0x78,2,3]
swat *0x4c000008 ((0x40<<12)+(0x4<<4)+(0x2<<0))


com << Memory setting >>

com [Bank6/7: 32-bit bus width]
swat *0x48000000 0x22000000

com [Bank0-5: Access cycle: 14-clocks, others:0-clock]
swat *0x48000004 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
swat *0x48000008 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
swat *0x4800000c ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
swat *0x48000010 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
swat *0x48000014 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)
swat *0x48000018 ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+0)

com [Bank6/7: SDRAM, Trcd:2clock, CA:9-bit]
swat *0x4800001c ((3<<15)+(0<<2)+1)
swat *0x48000020 ((3<<15)+(0<<2)+1)

com [SDRAM refresh enable, Trp=2clk, Trc=5clk, Refresh:1654]
swat *0x48000024 ((1<<23)+(0<<22)+(0<<20)+(1<<18)+1654)

com [SCKE_EN enable, SCLK_EN enable, Bank6/7 memory map: 64MB/64MB]
swat *0x48000028 (0x1+(1<<5)+(1<<4))

com [Bank6/7 CL: 3-clocks]
swat *0x4800002c 0x30
swat *0x48000030 0x30


在运行AXD之后, 先通过OB命令执行上面的脚本,给SDRAM初始化,同时初始化看
门狗等,这时汇编下的代码可以跑过去了,在汇编下设置寄存器操作LED灯正常。
程序跳到C语言之后,打印串口信息为乱码。但是仔细看了下FCLK,HCLK,PCLK,
配置的是正确的呀?
而且在AXD下通过观察CLKDIVN以及MPLLCON的值,和汇编中设置的是完全匹配的。
单步在C语言中跟踪,跟踪的函数代码如下:
static void cal_cpu_bus_clk(void)
{
U32 val;
U8 m, p, s;

val = rMPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;

//(m+8)*FIN*2 不要超出32位数!
FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;

val = rCLKDIVN;
m = (val>>1)&3;
p = val&1;
val = rCAMDIVN;
s = val>>8;

switch (m) {
case 0:
HCLK = FCLK;
break;
case 1:
HCLK = FCLK>>1;
break;
case 2:
if(s&2)
HCLK = FCLK>>3;
else
HCLK = FCLK>>2;
break;
case 3:
if(s&1)
HCLK = FCLK/6;
else
HCLK = FCLK/3;
break;
}

if(p)
PCLK = HCLK>>1;
else
PCLK = HCLK;

if(s&0x10)
cpu_freq = HCLK;
else
cpu_freq = FCLK;

val = rUPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;
UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
if(UPLL==96*MEGA)
rCLKDIVN |= 8; //UCLK=UPLL/2
UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
}

发现读出来的rMPLLCON的值时而是正确的,时而又是错误的。
一旦读出的是错误的,在后面的打印信息中将会出现异常。
为什么同一个程序,时而读的是对的,时而读的又是错的呢?
难道换个晶体,还要对SDRAM进行重配置不成?
期待高手指点,感激不尽。
...全文
132 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
buzaiyouyu001 2010-08-23
  • 打赏
  • 举报
回复
有学习了,谢谢
jxxx2967 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 armeasy 的回复:]

已经解决问题_^_
[/Quote]

问问题,让别人帮忙,自己解决了,又不说是怎么解决的
是不是有点讨厌,大家说说!
博说医械研发 2010-06-02
  • 打赏
  • 举报
回复
估计是时钟配置的问题
luixing67 2010-06-02
  • 打赏
  • 举报
回复
说一下怎么解决的,给别人留个参考么。
armeasy 2010-06-02
  • 打赏
  • 举报
回复
已经解决问题_^_
老人参 2010-06-02
  • 打赏
  • 举报
回复
玩超频呀,hoho, 不一定稳定的,

打印信息乱,你要重新计算 波特率 ,然后修改,

SDram flash 都要工作时序的,所以你要修改他们的工作时钟看看,
armeasy 2010-06-02
  • 打赏
  • 举报
回复
上面红色没显示,执行到这句:
rINTMSK&=~(BIT_USBD);
程序在12M晶体下都全是正常运行的关键。很奇怪。
armeasy 2010-06-02
  • 打赏
  • 举报
回复
实际测试,将晶体换回16.9344M后,按三星推荐的399M配置,MPLLCON按110,3,1配置,如果CLKDIVN设置为7,即1:3:6,能够进C,但是像上面说的,读寄存器的值不稳定,时而正确时而错误,换用1:4:8配置后,PCLK降为50M左右,接近50M,这时读出来的数就再也没错了。这时已经能进C,串口打印一切正常了。
但是很奇怪,上午我已经调 好可以烧bootloader了,即USB通信正常了,我为了修改那种ini的OB配置方式,搞一个脚本,结果导致USB无法连接了,而且一跑到usbDmain函数就崩了。用脚本配置模式导致。后来恢复用OB配置方式,问题依旧,再也没法像上午那样能够USB正常连接了。
具体USB代码如下:
void UsbdMain(void)
{
//int i;
//U8 tmp1;
//U8 oldTmp1=0xff;

//ChangeUPllValue(0x38,2,1); // UCLK=96Mhz
// ChangeUPllValue(0x38,2,2); // UCLK=48Mhz
InitDescriptorTable();
//ResetUsbd();

rGPGUP |= 1<<9; //disable pull-up
rGPGCON &= ~(3<<18);
Delay(2000);
rGPGDAT |= 1<<9; //high
rGPGCON |= 1<<18; //output

ConfigUsbd();

//DetectVbus(); //not used in S3C2400X

PrepareEp1Fifo();
#if 0
while(1)
{
if(DbgPrintfLoop())continue;

Delay(5000);
if((i++%2)==0)Led_Display(0x8);
else Led_Display(0x0);
}
#endif
}

子函数代码如下:
void ConfigUsbd(void)
{

ReconfigUsbd();
/*
pISR_USBD =(unsigned)IsrUsbd;
ClearPending(BIT_USBD);
rINTMSK&=~(BIT_USBD);
*/
rINTMSK&=~(BIT_USBD);
}

单步,程序就是执行完红色部分后,彻底崩溃。
分析了好久,不知是什么原因?????
armeasy 2010-06-02
  • 打赏
  • 举报
回复
问问题,让别人帮忙,自己解决了,又不说是怎么解决的
是不是有点讨厌,大家说说!

不是有点讨厌,而是特别讨厌。
楼上的先别急嘛,又遇到怪问题了。
又被我改出问题来了。
一并总结好了回上来。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧