STM32F103调试出现 while((RCC->CR & RCC_CR_PLL2RDY) == 0) 死循环。

网上很多都说是晶振问题,我这边不是这个问题。从断点向上看代码。

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }

可见哪里定义了STM32F10X_CL,查下来,这个只有在105和107才会定义这个可用。查到此项定义位置项目右键选择option如下图。将里面STM32F10X_CL改成如下。看define sysmbols部分。

STM32F103调试出现 while((RCC->CR & RCC_CR_PLL2RDY) == 0) 死循环。

修改后编译调试,成功通过。

以下简单介绍:

STM32F103调试出现 while((RCC->CR & RCC_CR_PLL2RDY) == 0) 死循环。

  至于要使用哪个宏,则需要根据具体的芯片来进行选择。如果是STM32F105xx和STM32F107xx,是Connectivity Line Devices,则宏定义选择的是STM32F10X_CL;如果是别的型号,则根据FLASH的容量来进行选择。可能文字写的有点不太清楚,还是以表格来说明:

STM32F103调试出现 while((RCC->CR & RCC_CR_PLL2RDY) == 0) 死循环。

END