c - MSP430:__delay_cycles() 很慢/MCLK 可能很慢

标签 c microcontroller msp430 texas-instruments code-composer

我担心我的 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 秒才能打开。这让我担心我的微 Controller 上的 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 节中说:

After a PUC, the UCS module default configuration is:

  • XT1 in LF mode is selected as the oscillator source for XT1CLK.
  • DCOCLKDIV is selected for MCLK.
  • FLL operation is enabled and XT1CLK is selected as the FLL reference clock, FLLREFCLK.

[…] XT1 will remain disabled until the PSEL bits associated with the crystal pins are set.

以及第 5.2.12 节:

When using XT1 operation in LF mode as the reference source into the FLL (SELREF = {0}), a crystal fault automatically causes the FLL reference source, FLLREFCLK, to be sourced by the REFO.

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

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

关于c - MSP430:__delay_cycles() 很慢/MCLK 可能很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34258254/

相关文章:

c# - 尝试在 C# 中传递大量字符时尝试读取或写入 protected 内存

c - 是否有语义连接的 n*3 个寄存器的命名约定?

CS50 恢复段错误问题

c - 从USB键盘读取输入数据到树莓派

c - 在linux中使用c库进行人脸识别

c++微 Controller 全局类/单例?

c# - 使用 PIC 通过 USB 控制照明的代码?

c - MSP430 I2C 读取 SDP610 差压传感器问题

assembly - 如何让 MSP430 在模式 4 下休眠?

c - MSP430 中 TimerA 的软件串行