【阿波罗STM32F767试用体验】第十一篇☞同样的时钟配置代码,为什么IAR和GNU下配置时钟之后的频率不一样?

2019-07-14 19:33发布

同样的时钟配置代码,ucosiii官方的例程中的代码,我分别移植到iar和eclipse+gnu下.编译之后调试发现系统时钟竟然不一样.
先看下时钟配置代码
  1. void  BSP_SystemClkCfg (void)
  2. {
  3.     static RCC_OscInitTypeDef  RCC_OscInit;
  4.     static RCC_ClkInitTypeDef  RCC_ClkInit;
  5.     HAL_StatusTypeDef   hal_status;
  6.     __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟

  7.     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别,以便在器件未以最大频率工作

  8.                                                                 /* VCO out-freq = HSE * (PLLN / PLLM)    = 432MHz.      */
  9.                                                                 /* PLLCLK       = (VCO out-freq) / PLLP  = 216MHz.      */
  10.     RCC_OscInit.OscillatorType = RCC_OSCILLATORTYPE_HSE;        /* HSE freq     = 25MHz.                                */
  11.     RCC_OscInit.HSEState       = RCC_HSE_ON;
  12.     RCC_OscInit.HSIState       = RCC_HSI_OFF;
  13.     RCC_OscInit.PLL.PLLState   = RCC_PLL_ON;
  14.     RCC_OscInit.PLL.PLLSource  = RCC_PLLSOURCE_HSE;
  15.     RCC_OscInit.PLL.PLLM       = 25u;
  16.     RCC_OscInit.PLL.PLLN       = 432u;
  17.     RCC_OscInit.PLL.PLLP       = RCC_PLLP_DIV2;
  18.     RCC_OscInit.PLL.PLLQ       = 9;/* PLL_Q out freq = (VCO out-freq) / PLLQ = 48MHz.      */
  19.     //RCC_OscInit.PLL.PLLR       = 7;

  20.     hal_status = HAL_RCC_OscConfig(&RCC_OscInit);
  21.     if (hal_status != HAL_OK) {
  22.         while (DEF_TRUE) {                                      /* STOP if error                                        */
  23.             ;
  24.         }
  25.     }

  26.     hal_status = HAL_PWREx_EnableOverDrive();                   /* Activate the OverDrive to reach the 216 Mhz Freq     */
  27.     if (hal_status != HAL_OK) {
  28.         while (DEF_TRUE) {                                      /* STOP if error                                        */
  29.             ;
  30.         }
  31.     }

  32.     RCC_ClkInit.ClockType      = RCC_CLOCKTYPE_SYSCLK |
  33.                                  RCC_CLOCKTYPE_HCLK   |
  34.                                  RCC_CLOCKTYPE_PCLK1  |
  35.                                  RCC_CLOCKTYPE_PCLK2;
  36.     RCC_ClkInit.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;
  37.     RCC_ClkInit.AHBCLKDivider  = RCC_SYSCLK_DIV1;               /* HCLK    = AHBCLK  = PLLCLK / AHBPRES(1) = 216MHz.    */
  38.     RCC_ClkInit.APB1CLKDivider = RCC_HCLK_DIV4;                 /* APB1CLK = AHBCLK  / APB1DIV(4)          =  54MHz.    */
  39.     RCC_ClkInit.APB2CLKDivider = RCC_HCLK_DIV2;                 /* APB2CLK = AHBCLK  / APB2DIV(2)          = 108MHz.    */

  40.     hal_status = HAL_RCC_ClockConfig(&RCC_ClkInit, FLASH_LATENCY_7);
  41.     if (hal_status != HAL_OK) {
  42.         while (DEF_TRUE) {                                      /* STOP if error                                        */
  43.             ;
  44.         }
  45.     }
  46. }
复制代码在eclipse下调试,截图
Image 6.png
在IAR下调试的截图
Image 4.png
这些配置寄存器都是一样的,但是执行完BSP_SystemClkCfg 这个函数之后,系统时钟还是不一样啊,IAR下的是216MHz正常的.gnu下的出现了问题变成了69120000Hz.这是为什么呢?感觉很神奇阿.
Image 5.png


Image 1.png
Image 2.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。