ST意法半导体
直播中

郭中

11年用户 1051经验值
擅长:存储技术
私信 关注
[问答]

STM32 PLL配置触发WWDG死循环是什么原因导致的呢

STM32F746-Disco、Win 10、CubeIDE 1.8.0、仅 CMSIS(无 HAL)、C。
我决定将我的 MCU 时钟从 HSI 16MHz 更改为带有 PLL 的全 216MHz。我已经为 PLL 参数设置了正确的值,但是每当我实际将系统时钟切换到 PLL 时,它就会崩溃(如果我不这样做,它就不会崩溃)。
这是一个完整的空项目,仅注册来自 MCU 特定标头和 m7 内核的定义。现在它是一个空项目,只点亮一个 LED - 如果它到达那里,就是这样。
我换了AHB、APB分频器,一切正常。只要我在 HSI 上,它仍然可以正常工作。我配置 PLL 并确保设置了值 - 调试器显示所有正确的值,我用笔和纸对每个位进行三次检查。字面上地。
我注意到 HAL 在时钟设置期间激活 PWR 外围设备,但我没有这样做。参考手册中对 PWR 外围设备的描述没有理由相信它与它有任何关系,但也许我忽略了一些东西。
这是有趣的部分:
  • void rcc_init(void) {
  •         //enable HSE
  •         RCC->CR |= RCC_CR_HSEON;
  •         while (!(RCC->CR & RCC_CR_HSERDY)); //wait while hardware signals HSE is stable
  •         //configure PLL
  •         /*
  •         RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE; //PLL/PLL2S source = HSE
  •         RCC->PLLCFGR &= ~0x1F<        RCC->PLLCFGR |= 0x19 << RCC_PLLCFGR_PLLM_Pos; //PLLM 25
  •         RCC->PLLCFGR &= 0x1FF << RCC_PLLCFGR_PLLN_Pos; //reset all PLLN bits
  •         RCC->PLLCFGR |= 0x1B0 << RCC_PLLCFGR_PLLN_Pos; //PLLN 432
  •         RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLP; //PLLP 2
  •         */
  •         RCC->PLLCFGR = 0x29406C19;
  •         RCC->CR |= RCC_CR_PLLON; //Enable PLL
  •         while (!(RCC->CR & RCC_CR_PLLRDY)); //wait while hardware signals PLL is OK
  •         //configure AHB/APB clocks
  •         RCC->CFGR &= ~RCC_CFGR_HPRE_DIV1; //AHB Prescaler 1
  •         RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; //APB1 Prescaler 4
  •         RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; //APB2 Prescaler 2
  •         //Set System Clock to PLL
  •         RCC->CFGR |= RCC_CFGR_SW_PLL; // System Clock Mux: Select PLL as system clock
  •         while ((RCC->CFGR & RCC_CFGR_SWS) != (RCC_CFGR_SWS_PLL)); //wait until PLL is established as system clock
  • }
注释掉的 PLL_CFGR 手动配置无论出于何种原因都没有得到执行,寄存器保持在重置值。但是当我手动写入完整的寄存器值时,它起作用了。
它在 RCC->CFGR |= RCC_CFGR_SW_PLL 上崩溃;如果我不执行该行(注释掉),我会留在 HSI 上并且不会崩溃,工作完全正常。
我错过了什么?为什么会出现错误?我在参考手册中找不到任何暗示我做错了什么的东西。
我发现 HAL 启用 PWR 并启用超速和超速切换。所以我也这样做了。没有不同。以下是我的做法(功能上与 HAL 时钟初始化代码相同):
  • //enable PWR peripheral
  •         volatile uint32_t temp;
  •         RCC->APB1ENR |= RCC_APB1ENR_PWREN;
  •         temp = RCC->APB1ENR & RCC_APB1ENR_PWREN;
  •         (void) temp; //waste cycles until activated
  •         PWR->CR1 |= PWR_CR1_VOS; //explicit default value for internal voltage regulator
  •         (void) temp; //waste cycles until activated
  •         PWR->CR1 |= PWR_CR1_ODEN;
  •         while (!(PWR->CSR1 & PWR_CSR1_ODRDY)); //wait while overdrive gets ready
  •         PWR->CR1 |= PWR_CR1_ODSWEN; //enable overdrive switching
  •         while (!(PWR->CSR1 & PWR_CSR1_ODSWRDY)); //wait while overdrive gets ready
编辑2:
我调试了我的代码和 CubeMX 生成的代码。决定比较 RCC 和 PWR 寄存器以防我遗漏了什么。
碾压混凝土:
CR - 与位相同
PLLCFGR - 与位相同
CFGR - 与钻头相同
压水堆:
CR1 - 与位相同
CSR1 - 与位相同
CR2 - 与位相同
CSR2 - 与位相同
除了我的代码崩溃。我没主意了。





回帖(2)

王洋

2022-12-13 13:57:00
与使用 216MHz 的 CubeMX 代码相比!在功能上,我忘了更改闪存延迟!它奏效了(我还不太了解闪存)。
举报

jf_92693939

2024-5-23 11:49:51
闪存延时怎么改啊
举报

更多回帖

发帖
×
20
完善资料,
赚取积分