做一条有梦想的咸鱼 发表于 2018-8-22 18:18:25

STM32CubeMX MCU执行到SystemClock_Config时钟初始化死锁

本帖最后由 少言寡语 于 2018-8-22 18:19 编辑

型号为STM32F103C8T6
调试的时候 每次执行到该处

点击调试进去进入到下面程序处的时候 会在SYSTICK那个中断函数和这个函数
来回跳很久

最后进入这个while(1)里面

Cube MX 版本用的4.25
KEIL版本5.25

以下为部分出错代码
void SystemClock_Config(void)
{

RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks
    */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}




HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef*RCC_OscInitStruct)
{
   uint32_t tickstart = 0U;

/* Check the parameters */
assert_param(RCC_OscInitStruct != NULL);
assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType));

/*------------------------------- HSE Configuration ------------------------*/
if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE)
{
    /* Check the parameters */
    assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState));

    /* When the HSE is used as system clock or clock source for PLL in these cases it is not allowed to be disabled */
    if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE)
       || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE)))
    {
      if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))
      {
      return HAL_ERROR;
      }
    }
    else
    {
      /* Set the new HSE configuration ---------------------------------------*/
      __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState);


       /* Check the HSE State */
      if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF)
      {
      /* Get Start Tick */
      tickstart = HAL_GetTick();

      /* Wait till HSE is ready */
      while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)
      {
          if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE)
          {
            return HAL_TIMEOUT;
          }
      }
      }


wenyangzeng 发表于 2018-8-22 19:16:18

检查一下外部晶振HSE的硬件。应该是晶振没有起振。

feixiang20 发表于 2018-8-22 23:53:13

可能是初始化配置的问题,定时器的初始化,晶振等
RCC_ClkInitTypeDef RCC_ClkInitStruct;   //结构体初始化
RCC_OscInitTypeDef RCC_OscInitStruct; //结构体初始化
__HAL_RCC_PWR_CLK_ENABLE();//使能电源控制时钟   
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1
这个设置用来设置调压器输出电压级别,以便在器件未以最大频率工作时使性能与功耗实现平衡
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; //时钟源为HSI内部高速时钟
                                                               //RCC_OSCILLATORTYPE_HSE   高速外部时钟
RCC_OscInitStruct.HSEState = RCC_HSE_OFF;//关闭HES
RCC_OscInitStruct.HSIState = RCC_HSI_ON;    //打开HSI
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; //打开PLL
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;//设置PLL时钟源为HSI
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4;//PLL VCO输入时钟的倍频系数
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV2;//PLL VCO输入时钟的分频系数
RCC_OscInitStruct.HSICalibrationValue = 0x10;//HSI校准调整值
HAL_RCC_OscConfig(&RCC_OscInitStruct);//初始化
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);    //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //设置系统时钟源
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; //AHB分频系数为1
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;//APB1分频系数为1
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;//APB2分频系数为1
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);//初始化并同时设置FLASH 的延迟周期为1

ayumi7 发表于 2019-7-14 13:12:36

后来呢楼主 我今天也玩到你这个错误了    到 while 就没了

u13718941626 发表于 2021-2-2 14:42:08

我也遇到这个错误,楼主解决了么。我看了一下sysclk_source的值是0x00000000,如果配置外部高速时钟,这个值应该是0x00000008
页: [1]
查看完整版本: STM32CubeMX MCU执行到SystemClock_Config时钟初始化死锁