ST意法半导体
直播中

陈文博

9年用户 1012经验值
擅长:测量仪表
私信 关注
[问答]

如何使用SPL将STM32L152上的SysClk配置为32MHz?

嘿伙计们和女孩们!使用 SPL 将 STM32L152 上的系统时钟配置为 32MHz 时,我一直面临着一个问题。它以 24MHz 的频率平稳运行,但在以最大频率运行时总是卡住。
MCU 的最大时钟频率为 32MHz,使用 STM32CUBE IDE 和 HAL 配置时钟时运行良好。目的是以这种方式通过 PLL 从 HSI (16MHz) 运行它:

它拒绝在我基于 SPL 的代码中工作,尽管该过程似乎与 HAL 代码完全相似:
  • void init32MHzClock() {
  •         RCC_DeInit();
  •         FLASH_SetLatency(FLASH_Latency_1);
  •         PWR_VoltageScalingConfig(PWR_VoltageScaling_Range1);
  •         RCC_HCLKConfig(RCC_SYSCLK_Div1);        // HCLK = SYSCLK
  •         RCC_PCLK2Config(RCC_HCLK_Div1);         // PCLK2 = HCLK
  •         RCC_PCLK1Config(RCC_HCLK_Div1);         // PCLK1 = HCLK
  •         RCC_AdjustHSICalibrationValue(0x10U);        // default HSI calibration trimming value
  •         RCC_HSICmd(ENABLE);
  •         while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) != SET);
  •         // PLL clock from 16 MHz HSI:
  •         RCC_PLLConfig(RCC_PLLSource_HSI, RCC_PLLMul_4, RCC_PLLDiv_2);        // 16*4/2 = 32MHz
  • //        RCC_PLLConfig(RCC_PLLSource_HSI, RCC_PLLMul_6, RCC_PLLDiv_4);        // 16*6/4 = 24MHz
  •         RCC_PLLCmd(ENABLE);
  •         while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) != SET);
  •         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  // select the PLL as clock source.
  •         while(RCC_GetSYSCLKSource() != 0x0C);                  // wait till PLL is used as system clock
  •         SystemCoreClock = 32000000;
  • }
它永远不会超过第 23 行的最后一个 while。我在 google 上搜索的所有代码大多与其他 MCU(主要是 F103)相关,并且在体系结构中似乎没有什么不同。你们中的任何一个,请找出不同之处或缺失的部分并提出建议?干杯!








回帖(1)

蓝孝增

2023-1-10 11:15:49
很确定你必须启用 64 位提取
此处为 SPL 示例中的 HSE/PLL


  • /**
  •   * @brief  Sets System clock frequency to 32MHz and configure HCLK, PCLK2
  •   *         and PCLK1 prescalers.
  •   * @note   This function should be used only after reset.
  •   * @param  None
  •   * @retval None
  •   */
  • static void SetSysClockTo32(void)
  • {
  •   __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  •   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
  •   /* Enable HSE */
  •   RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  •   /* Wait till HSE is ready and if Time out is reached exit */
  •   do
  •   {
  •     HSEStatus = RCC->CR & RCC_CR_HSERDY;
  •     StartUpCounter++;
  •   } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  •   if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  •   {
  •     HSEStatus = (uint32_t)0x01;
  •   }
  •   else
  •   {
  •     HSEStatus = (uint32_t)0x00;
  •   }

  •   if (HSEStatus == (uint32_t)0x01)
  •   {
  •     /* Enable 64-bit access */
  •     FLASH->ACR |= FLASH_ACR_ACC64;

  •     /* Enable Prefetch Buffer */
  •     FLASH->ACR |= FLASH_ACR_PRFTEN;

  •     /* Flash 1 wait state */
  •     FLASH->ACR |= FLASH_ACR_LATENCY;

  •     /* Enable the PWR APB1 Clock */
  •     RCC->APB1ENR |= RCC_APB1ENR_PWREN;

  •     /* Select the Voltage Range 1 (1.8V) */
  •     PWR->CR = PWR_CR_VOS_0;

  •     /* Wait Until the Voltage Regulator is ready */
  •     while((PWR->CSR & PWR_CSR_VOSF) != RESET)
  •     {
  •     }

  •     /* HCLK = SYSCLK */
  •     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

  •     /* PCLK2 = HCLK */
  •     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

  •     /* PCLK1 = HCLK */
  •     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;

  •     /*  PLL configuration: PLLCLK = (HSE * 12) / 3 = 32MHz */
  •     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL |
  •                                         RCC_CFGR_PLLDIV));
  •     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMUL12 | RCC_CFGR_PLLDIV3);

  •     /* Enable PLL */
  •     RCC->CR |= RCC_CR_PLLON;

  •     /* Wait till PLL is ready */
  •     while((RCC->CR & RCC_CR_PLLRDY) == 0)
  •     {
  •     }

  •     /* Select PLL as system clock source */
  •     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  •     RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

  •     /* Wait till PLL is used as system clock source */
  •     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x0C)
  •     {
  •     }
  •   }
  •   else
  •   {
  •     /* If HSE fails to start-up, the application will have wrong clock
  •        configuration. User can add here some code to deal with this error */
  •   }
  • }

我会尝试
...
FLASH_PrefetchBufferCmd(启用);
FLASH_ReadAccess64Cmd(启用);
FLASH_SetLatency(FLASH_Latency_1);
PWR_VoltageScalingConfig(PWR_VoltageScaling_Range1);
...
举报

更多回帖

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