3

恐怕我的 MSP430F5529 启动板可能有问题,因为我无法让 __delay_cycles 正常运行。它总是可以正常工作,但现在突然似乎有问题了。我只想使用计时器模块来造成延迟,但当前程序已经在使用所有这些模块,我更愿意让它们专注于他们的任务。我只需要在初始化期间进行几次延迟,因此“尽量不要使用 __delay_cycles”的典型警告,因为它会暂停程序在这里并不是真正的问题。

所以问题是使用 __delay_cycles() 花费的时间比它应该花费的时间长,尽管事实上我最近在另一个程序上使用它没有问题。我尝试在具有默认设置的不同项目上使用相同的代码,并确保我的代码没有做一些奇怪的事情,我制作了一个快速程序,在应该延迟一秒后打开 LED:

void main(void){

WDTCTL = WDTPW | WDTHOLD;     // Stop watchdog timer

P1OUT &= ~(BIT0);
P1DIR |= BIT0;
P1REN |= BIT0;

__delay_cycles(25000000);

P1OUT |= BIT0;
}

由于 MCLK 以 25MHz 运行,延迟 2500 万个周期应该会产生大约 1 秒的延迟,但是,在调试器中启动程序后,LED 需要大约 25 秒才能打开。这让我担心我的微控制器上的 MCLK 有问题,虽然我觉得这不太可能,但据我所知,在我没有改变任何东西之后,我似乎找不到发生这种情况的另一个原因. 由于 LED 需要 25 秒才能打开,因此 MCLK 似乎以 1MHz 运行,或者由于某种原因该功能来自 SMCLK。

我是否一直处于高位,而 MCLK 在使用 __delay_cycles() 时始终以 1MHz 运行?我只是没有注意到,因为我之前“成功”使用的延迟只有几毫秒?我发誓默认情况下 MCLK 的频率是 25MHz,唯一的改变方法是通过代码设置它。所以在我看来,要么:

  • A) 默认情况下,MSP430 不以 25MHz 运行,而我编写的代码并没有使这一点变得明显
  • B) __delay_cycles() 在执行过程中改变了 MCLCK 的速度,我从来没有注意到,因为我需要的延迟是如此之快
  • C) 我不小心更改了编译器中的某些设置,或者由于某种原因编译器优化器弄乱了 __delay_cycles() 的编译
  • D) 我的 MCLK 坏了/坏了一半

顺便说一句,如果该信息相关,我的编译器是 Code Composer Studio 6.1.0.00104。

有没有人有智慧分享什么可能是错的?

谢谢。

4

1 回答 1

3

用户指南在第 5.2 节中说:

PUC后,UCS模块默认配置为:

  • 选择 LF 模式下的 XT1 作为 XT1CLK 的振荡器源。
  • MCLK 选择 DCOCLKDIV。
  • FLL 操作使能,选择 XT1CLK 作为 FLL 参考时钟 FLLREFCLK。

[…] XT1 将保持禁用状态,直到与晶振引脚相关的 PSEL 位被置位。

在第 5.2.12 节中:

当在 LF 模式下使用 XT1 操作作为 FLL 的参考源 (SELREF = {0}) 时,晶体故障会自动导致 FLL 参考源 FLLREFCLK 由 REFO 提供。

默认 FLL 配置 (FLLN = 0x1F, FLLD = 1) 产生 64 × 32768 Hz = 2.097152 MHz 的 DCO 频率和 1.048576 MHz 的 MCLK 频率(如果 REFO 足够准确以证明该精度是正确的)。

要以 25 MHz 运行 CPU,您必须重新编程 FLL(并增加 PMMCOREV)。

于 2015-12-14T08:37:12.143 回答