0

我正在研究 Stm32F407 探索板。但我没有解决我的时钟配置问题。我想要 168Mhz 的工作频率,并从 CubeMx 时钟配置管理器获得帮助。这是我来自 CubeMx 的 PLLCFGR 寄存器值0x4405408(我对这个寄存器有问题)。然后我将所有 RCC 寄存器复制粘贴到我的 CMSIS 代码中。这是我的时钟配置代码。


    RCC-> CFGR       = 0x4008940A;          //MCO2 Source is PLLI2S (4), HSE Divided by 8 for RTC (8), APB2 Divided by 2 for 84Mhz, APB1 Divided by 4 for 42 Mhz
    RCC-> CR         = 0x0F0B6783;          //PLL, PLLI2S, HSE, CSS ON
    RCC-> PLLCFGR    = 0x04405408;          //PLLQ 4 (4), PLLSRC = HSE (4), PLLP 2 (0), PLLN 336 (54), PLLM 8 (8)
    RCC-> PLLI2SCFGR = 0x50003C00;          //PLLI2SR 5 (5), PLLI2SN 240 (3C)

但我无法从 Atollic 的 SFR 菜单中读取相同的值。所有寄存器均正确,但 PLLCFGR 寄存器值为 0x04405419。这个问题会影响我的时钟速度、外围速度等。我想将 PLLM 位设置为 8,但我读到了 19。所以我得到的速度比我想要的要低。因为 PLLM 位决定 PLL 输入时钟分频。我该如何解决这个注册问题?谢谢。

4

2 回答 2

3

在进行时钟配置时,您不能只加载寄存器的最终值。您需要遵循一些逻辑顺序并满足参考手册中提到的限制。您还必须考虑闪存等待状态

这是使用 8 MHz HSE 以 48 MHz 运行 STM32F407 的示例代码。我懒得修改和测试 168 MHz,但这应该会给你一个想法和一个起点。

FLASH->ACR |= FLASH_ACR_LATENCY_1WS; // 1 wait state for 48 MHz
RCC->CR |= RCC_CR_HSEON; // Activate external clock (HSE: 8 MHz)
while ((RCC->CR & RCC_CR_HSERDY) == 0); // Wait until HSE is ready
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLQ;
RCC->PLLCFGR |= 4 << RCC_PLLCFGR_PLLQ_Pos; // PLL-Q: /4
RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE; // PLL source is HSE
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLP; // PLL-P: /2
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLN;
RCC->PLLCFGR |= 96 << RCC_PLLCFGR_PLLN_Pos; // PLL-N: x96
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLM;
RCC->PLLCFGR |= 4 << RCC_PLLCFGR_PLLM_Pos; // PLL-M: /4
RCC->CR |= RCC_CR_PLLON; // Activate the PLL (Output: 96 MHz)
while ((RCC->CR & RCC_CR_PLLRDY) == 0); // Wait until PLL is ready
RCC->CFGR |= RCC_CFGR_HPRE_DIV2 // AHB divider: /2 (48 MHz)
        | RCC_CFGR_PPRE1_DIV2 // APB1 divider: /2 (24 MHz)
        | RCC_CFGR_PPRE2_DIV2; // APB2 divider: /2 (24 MHz)
RCC->CFGR |= RCC_CFGR_SW_PLL; // Switching to PLL clock source
于 2020-07-18T07:28:56.583 回答
0

我发现我的问题是从哪里来的。system_stm32f4xx.c 和 stm32f4xx.h 文件需要针对 Stm32f4 Discovery 板进行更改。此代码为 25Mhz HSE 晶体编写,但 Discovery Board 具有 8Mhz HSE 晶体。然后是 PLL 位。这些位在 system_stm32f4xx.c 文件中定义。您必须根据需要更改 PLL 位。谢谢我们所有人;)

于 2020-07-19T15:55:29.387 回答