This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

G2553 Set DCO问题

P1OUT = 0x00; // Clear P1 output latches
P1SEL = 0x10; // P1.4 SMCLK output
P1DIR = 0x11; // P1.0,4 output

void Set_DCO(unsigned int Delta) // Set DCO to selected frequency
{
unsigned int Compare, Oldcapture = 0;

BCSCTL1 |= DIVA_3; // ACLK = LFXT1CLK/8
TACCTL0 = CM_1 + CCIS_1 + CAP; // CAP, ACLK
TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear

while (1)
{
while (!(CCIFG & TACCTL0)); // Wait until capture occured
TACCTL0 &= ~CCIFG; // Capture occured, clear flag
Compare = TACCR0; // Get current captured SMCLK
Compare = Compare - Oldcapture; // SMCLK difference
Oldcapture = TACCR0; // Save current captured SMCLK

if (Delta == Compare)
break; // If equal, leave "while(1)"
else if (Delta < Compare)
{
DCOCTL--; // DCO is too fast, slow it down
if (DCOCTL == 0xFF) // Did DCO roll under?
if (BCSCTL1 & 0x0f)
BCSCTL1--; // Select lower RSEL
}
else
{
DCOCTL++; // DCO is too slow, speed it up
if (DCOCTL == 0x00) // Did DCO roll over?
if ((BCSCTL1 & 0x0f) != 0x0f)
BCSCTL1++; // Sel higher RSEL
}
}
TACCTL0 = 0; // Stop TACCR0
TACTL = 0; // Stop Timer_A
BCSCTL1 &= ~DIVA_3; // ACLK = LFXT1CLK
}

你好,

       在G2553的例程里面有set DCO的程序如上,有些没看懂。

1.SMCLK和ACLK都设置为在管脚输出了,那timer从哪里捕获的呢?CCI2B是timer的输入,又是比较器的输出,但是比较器好像没有设置输入啊?请问timer是如何捕获ACLK的呢?

2.这个程序DCOCTL--这句话,因为DCOCTL的低位都是MOD,高位才是DCO,所以一般都只能修改MOD而到不了修改DCO。这样是否合理呢?

  • 你好,

    我不太明白你的问题点,DCO时钟输出之后再给到Camture模块吗?

    另外,一开始设置DCO时钟不太正常,你可以直接调用DCO校准参数,不需要自己设置:

    BCSCTL1 = CALBC1_1MHZ; // use calibrated value for 1MHz operation first
    DCOCTL = CALDCO_1MHZ; // use calibrated value for 1MHz operation first

  • 楼主,

       这段程序主要的目的是利用Timer的capture模式来捕捉我们外围提供的32.768K的晶振,然后8分频,最后得到相应的1Mhz,8Mhz,12Mhz....

    这里选择了CCIxB来作为捕捉信号的输入,在每款芯片的datasheet里面有具体定义CCIxA和CCIxB对应的外部或是内部的时钟源。这里应该默认是的CCIxB连接了我们的XIN管脚,也就是TA0.1,捕捉它的时钟源,用来校正DCO的参数。

    谢谢

  • 非常感谢你的回答。

    但是我查了datasheet, ,如图,TA0.1引脚要么是作为timer compare output,要么作为晶振的input,应该不是从这里作为timer输入吧?另外,从程序上看

    TACCTL0 = CM_1 + CCIS_1 + CAP; // CAP, ACLK
    TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear

    程序应该使用的TA0.0,还是不太明白timer capture的输入到底是哪里?

    麻烦再解释一下,谢谢

  • 楼主,

       可能是我没解释清楚,首先我们在设置TACCTL0是选择的是CCIS_1,也就对应了我们的CCI0B,在我们的G2553的datasheet 的16页Timer_A3对应的signal Connections的表格里你可以很清楚的查看到CCI0B对应的内部的ACLK时钟信号。而在我们的程序里面设置了ACLK等于LFXT1CLK/8,也就是外围的32.768K晶振的8分频作为timer捕捉的时钟信号。

    不知道这样解释是否能回答你的问题。

    谢谢

  • 非常感谢,这回明白了,其实就是一直没有看懂16页那张表,你这么解释一下我就清楚了。

    还有一个就是我原帖中第二个问题,这个程序DCOCTL--这句话,因为DCOCTL的低位都是MOD,高位才是DCO,所以一般都只能修改MOD而到不了修改DCO。这样是否合理呢?在设置DCO的时候,是不是应该先设DCO寄存器和RSEL寄存器,最后再调整MOD,还是反过来?

x 出现错误。请重试或与管理员联系。