0

我使用以下例程来配置我的 MSP430 (msp430g2231) 微控制器的时钟:

void configure_clock(void) {
if (CALBC1_1MHZ == 0xFF || CALDCO_1MHZ == 0xFF) { // Checks the clock constants
        while(TRUE); // If callibration constants are erased, TRAP!
    }

    BCSCTL1 |= CALBC1_1MHZ; // Sets DCO range
    DCOCTL |= CALDCO_1MHZ; // Set DCO step and modulation

    BCSCTL1 &= ~(XTS | XT2OFF); // Disables XT2 and sets low frequency mode
    BCSCTL3 |= (LFXT1S_0 | XCAP_3); // Selects LFXT1 crystal with 12,5pF

    do {
        IFG1 &= ~OFIFG;
        __delay_cycles(1000);
    } while (IFG1 & OFIFG); // Waits until crystal stabilizes

    BCSCTL2 |= (SELM_2 | SELS); // Selects SMCLK and MCLK from LFXT1CLK
}

问题是代码第一次运行时(在给微控制器加电之后)一切都按预期工作,我得到了 32768 kHz 时钟。但是,如果我按下板上的复位按钮(MSP430 Launchpad),时钟似乎无法正常工作,代码执行速度很慢(比如 10 次左右)。关于时钟配置的任何想法?

谢谢!

佩雷

4

2 回答 2

1

首先你可以看看电源电压。如果在启动过程中出现一些峰值,则 DCO 将无法工作。在这种情况下,尝试在值与 BCSCTL1 对齐之前使用延迟。

   __delay_cycles(10000);
   BCSCTL1 = CALBC1_1MHZ; // Sets DCO range

这将确保抑制启动尖峰。

下一个嫌疑人将在您的目标板上解耦。我的意思是 VCC 上的电容器以及复位中使用的电容器。TI 推荐 1nF-2nF 用于复位线,0.1uF 用于 VCC。但是,如果您将 LaunchPad 用作平台,那么这应该不是问题。

同样对于校准值分配,使用赋值运算符而不是逻辑运算符。因为其他值为 0 是默认值。

  BCSCTL1 = CALBC1_1MHZ;               // Set DCO
  DCOCTL = CALDCO_1MHZ;

如果您计划运行 XT2,它在 G2231 中不可用。它的LFXT1 直接。您不需要显式初始化 32.768KHz 晶振即可工作。它只是在你通电时工作。因此不需要额外的初始化步骤。

为了找到更好的帮助,请查看slac463a以获取与时钟设置相关的软件示例。

于 2011-11-10T06:27:53.013 回答
0

我可以对您的代码提出的唯一建议如下。他们是否解决了你的问题我不知道,因为第一次运行似乎很奇怪,但重置后就不行了。您是否在其他任何地方访问时钟配置?你在重置时调用什么代码?

您总是使用位操作将值包含或排除到寄存器中。您应该从已知值开始,然后从那里调整位,否则您可能会合并来自先前状态的位。例如,而不是:

BCSCTL1 |= CALBC1_1MHZ;
BCSCTL1 &= ~(XTS | XT2OFF);

您可以通过执行以下操作将其设置为确定值:

BCSCTL1 = XT2OFF | (CALBC1_1MHZ & 0x0F);

另一个建议是必须设置 XT2OFF 才能关闭 XT2。您正在清除该位,因此将其保持打开状态。这与您的评论冲突,因此可能是错误的。

于 2011-11-08T13:40:36.910 回答