我使用以下程序配置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次左右)。有关时钟配置的任何想法吗?
谢谢!
佩尔
答案 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。你正在清理它,所以要保持它。这与您的评论相冲突,因此可能是错误。