复位后MSP430时钟问题

时间:2011-11-05 16:23:34

标签: real-time reset clock msp430

我使用以下程序配置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次左右)。有关时钟配置的任何想法吗?

谢谢!

佩尔

2 个答案:

答案 0 :(得分:1)

首先,您可以查看电源电压。如果在启动期间出现一些尖峰,那么DCO将无法工作。在这种情况下,尝试在将值与BCSCTL1对齐之前使用延迟。

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

这将确保抑制启动峰值。

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

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

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

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

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

答案 1 :(得分:0)

我可以向您的代码建议的唯一内容如下。无论他们是否解决了你的问题我都不知道,因为第一次运行是好的但似乎很奇怪,但重置之后却没有。你在其他地方访问时钟配置吗?你在重置时调用了什么代码?

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

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

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

BCSCTL1 = XT2OFF | (CALBC1_1MHZ & 0x0F);

另一个建议是必须设置XT2OFF才能关闭XT2。你正在清理它,所以要保持它。这与您的评论相冲突,因此可能是错误。