恐怕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采购。

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


A)MSP430默认不以25MHz运行,我什么也没有
讨人喜欢的使这一点显而易见
B)__delay_cycles()在执行期间更改MCLCK的速度
我从来没有注意到,因为我需要的延迟是如此之快
C)我不小心更改了编译器中的某些设置,或者
由于某些原因,编译器优化器弄乱了
__delay_cycles()的编译
D)我的MCLK坏了/半坏了


如果相关的信息,我的编译器就是Code Composer Studio 6.1.0.00104。

有谁有智慧分享可能出了什么问题?

谢谢。

最佳答案

用户指南在5.2节中说:


经过PUC之后,UCS模块的默认配置为:


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


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


并在5.2.12节中:


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


默认的FLL配置(FLLN = 0x1F,FLLD = 1)导致DCO频率为64×32768 Hz = 2.097152 MHz,MCLK频率为1.048576 MHz(如果REFO足够精确,足以证明此精度是合理的)。

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

10-08 02:09