最近在测试DCO频率时 对于设置有一些疑问,请各位大神帮忙解释一下
我外部晶振XT2是8M的, 在测试产生 4M 8M 16M 32M MCLK时 发现产生8M的不正确,请问该如何配置呢?
UCSCTL1 和 UCSCTL0 关系不是很清楚啊
以下是代码
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P7SEL |= BIT7; P7DIR |= BIT7;//测量MCLK用
P5SEL |= BIT2+BIT3;
UCSCTL6 &= ~XT2OFF; //打开XT2
/*********************寄存器配置部分********************8M晶振**********/
/*16.47
__bis_SR_register(SCG0);
UCSCTL0 = 0x0000;
UCSCTL1 = DCORSEL_4; //DCO频率范围在28.2MHZ以下
UCSCTL2 = FLLD_0 + 1; //D=1,N=1
UCSCTL3 = SELREF_5 + FLLREFDIV_0; //n=1,FLLREFCLK时钟源为XT2CLK 8M;DCOCLK=D*(N+1)*(FLLREFCLK/n);
UCSCTL4 = SELM__DCOCLK; //MCLK的时钟源为DCOCLK
__bic_SR_register(SCG0); //Enable the FLL control loop*/
__bis_SR_register(SCG0);
UCSCTL0 = 0x0000;
UCSCTL1 = DCORSEL_4; //DCO频率范围在28.2MHZ以下
UCSCTL2 = FLLD_0 + 1; //D=1,N=1
UCSCTL3 = SELREF_5 + FLLREFDIV_1; //n=2,FLLREFCLK时钟源为XT2CLK;DCOCLK=D*(N+1)*(FLLREFCLK/n);
UCSCTL4 = SELM__DCOCLK; //MCLK的时钟源为DCOCLK
__bic_SR_register(SCG0); //Enable the FLL control loop
while(1);
}
Susan Yang:
UCSCTL0寄存器设置为0x0000,因为这些位在运行期间由FLL自动修改。您可以在用户指南的统一时钟系统(UCS)部分中阅读更多相关信息。当设备开始运行时,它们不会保持在0x0000。
更多信息您可以看一下
e2echina.ti.com/…/16107
user4463015:
回复 Susan Yang:
感谢,是因为我没有检测晶振是否起振!太感谢了
Susan Yang:
回复 user4463015:
很高兴您能解决问题!
user4463015:
回复 Susan Yang:
再问您个问题,用XT2做为FLL的时钟源,应该如何设置呢?
Susan Yang:
回复 user4463015:
应该是
UCSCTL3 |= SELREF_5; //设置FLL参考时钟源为XT2CLK
user4463015:
回复 Susan Yang:
我也是这样设置的,但是计算出来的DCO总是有问题,比如我用XT2 8M的晶振,想产生一个分频的4M mclk 配置的为
__bis_SR_register(SCG0);
UCSCTL0 = 0x0000;
UCSCTL1 = DCORSEL_3; //
UCSCTL2 = FLLD_0 + 1; //D=1,N=1
UCSCTL3 = SELREF_5 + FLLREFDIV_2; //n=2,FLLREFCLK时钟源为XT2CLK;DCOCLK=D*(N+1)*(FLLREFCLK/n);
UCSCTL4 = SELM__DCOCLK; //MCLK的时钟源为DCOCLK
__bic_SR_register(SCG0); //Enable the FLL control loop得到的竟然是7.2M左右。
灰小子:
回复 user4463015:
程序的注释里写的很明白啊
DCOCLK=D*(N+1)*(FLLREFCLK/n);