【问题标题】:STM32L476 on Nucleo, can't run at 80 MhzNucleo 上的 STM32L476,无法以 80 Mhz 运行
【发布时间】:2026-02-15 18:10:02
【问题描述】:

我正在为我的 Nucleo-L476RG 板在一个全新的空白新项目上运行以下代码:

GPIOA->BSRR = GPIO_PIN_4;
GPIOA->BRR = GPIO_PIN_4;

时钟配置是默认的,如下:

我希望在我的示波器上看到一个 80 Mhz 的时钟,但我只看到 10 Mhz。 当我启用“主时钟输出”时,我可以看到 80 Mhz 但我的代码似乎没有以那个速度运行。

知道是什么原因造成的吗?

【问题讨论】:

  • 谁告诉你可以在一个 CPU 时钟内执行 2 条 C 语句?

标签: stm32 clock nucleo


【解决方案1】:

我希望在我的示波器上看到 80 Mhz 时钟,但我只看到 10 兆赫。

为什么你期望这两个 C 语句将在一个 CPU 时钟内执行?你认为有可能吗? 当然不是

翻译成

  str r2, [r3]
  str r2, [r3, #4]

str 指令需要 2 个时钟。其中两个 4 个时钟。如果从 FLASH 运行,则需要添加等待状态。所以这将需要大约 8 个时钟 - 你会看到 10MHz。您可以尝试从 SRAM 中运行它们,它会更快。

当然,只有你一个接一个地有这些说明才有效

GPIOA->BSRR = GPIO_PIN_4;
GPIOA->BRR = GPIO_PIN_4;
GPIOA->BSRR = GPIO_PIN_4;
GPIOA->BRR = GPIO_PIN_4;
GPIOA->BSRR = GPIO_PIN_4;
GPIOA->BRR = GPIO_PIN_4;
GPIOA->BSRR = GPIO_PIN_4;
GPIOA->BRR = GPIO_PIN_4;
GPIOA->BSRR = GPIO_PIN_4;
GPIOA->BRR = GPIO_PIN_4;
/*...*/

当你把它放在循环中时,循环会增加额外的开销。

【讨论】:

  • 好吧,有道理,我知道指令不是免费的,但我不知道确切的计数,我假设每条指令一个时钟。