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.
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的参数。
谢谢
楼主,
可能是我没解释清楚,首先我们在设置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,还是反过来?