平台: MSP430F5418
问题描述:XT1和XT2均未接外部晶振, 时钟代码如下:
void InitSysClk(void)
{
int i,XT2_Work=0;
int RetryTime=5;
UCSCTL0 = DCO4;
UCSCTL1 = DCORSEL_7;
UCSCTL3 = DCORSEL_5+FLLREFDIV_0; //XT2 as FLL reference, FLL div=1
UCSCTL4 = SELA_2+SELS_5+SELM_5;//ACLK=REFCLOCK,MCLK=SMCLK=XT2/DCO
UCSCTL6 &= ~XT2OFF;
//检测XT2
{
UCSCTL7 &= ~(XT2OFFG + DCOFFG);
// Clear XT2,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
for(i=0;i<0xFFFF;i++); // Delay for Osc to stabilize
if ((SFRIFG1&OFIFG) == 0)
{
XT2_Work = 1;
break;
}
}while ((RetryTime–)>0); // Test oscillator fault flag
if (XT2_Work == 0)//XT2不起振,初始化DCO
{
UCSCTL4 = SELA_2 + SELS_3 + SELM_3;
}
__no_operation();
}
由于没有外接XT2, 最后应该是初始化了DCO, 使用示波器测量SMCLK, 测试了5pcs板子, 时钟差别比较大
14.75Mhz, 13.25Mhz, 15.475Mhz, 15.15Mhz,13.75Mhz
问题: 使用内部DCO为什么不同板子时钟差距这么大, 如何能让DCO比较准确的固定在一个频率上
Ho Cong:
补充一下: 是否启用FLL效果会好一些? 如果启用FLL, 还有如下疑问: 1. 由于没有XT1和XT2, FLLREFCLK是不是就只能选择REFOCLK(32.768Khz) (UCSCTL3 bit6-4) 2. 由于FDCOCLK=D*(N+1)(FLLREFCLK/n), 那DCORSEL(UCSCTL1 bit6-4)是否还有作用?作用是什么?
Ho Cong:
回复 Ho Cong:
没有高手指点一下么?
目前我测试的结果:如果按以下设置,其实UCSCTL2其实是默认值, FFLLREFCLK是32.768K UCSCTL1 = DCORSEL_7; UCSCTL2 = FLLD_1+(0x32-1); UCSCTL3 = SELREF_2+FLLREFDIV_0; UCSCTL4 = SELA_2+SELS_3+SELM_3;那么由公式FDCOCLK = D*(N+1)*(FFLLREFCLK/n) = 2*(49+1)*32768/1 = 3.2768Mhz但实际测试得出频率在14Mhz左右,而且波动范围较大,是否和DCORSEL的选择有关?如果将UCSCTL2 改成FLLD_1+(320-1) (计算得出FDCOCLK 为20M)那么程序无法运行….但在debug模式下,在这里设置一个断点就能正常运行,如果不设断点,也无法运行….求教原因,求大神指点
Shi JianHua:
首先,MCLK可以输出,smclk也可以同时输出,默认的dco大多是800k~1000k,差不多,你亮的差这么多,还真不清楚,打开fll确实可以稳定一部分,但是如果你想统一,还是建议你用外部,这样你就不用考虑时钟的问题了。我的设计基本上都留着外部晶振接口,以防不测。
Shi JianHua:
回复 Ho Cong:
干的多了,自然经验就丰富了,弯路都少走了,这就是老板要有经验的开发工程师的意义。