微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第十一篇?同样的时钟配置代码,为什么IAR和GNU下配置时钟之后的频率不一样?

第十一篇?同样的时钟配置代码,为什么IAR和GNU下配置时钟之后的频率不一样?

时间:10-02 整理:3721RD 点击:
同样的时钟配置代码,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下调试,截图


在IAR下调试的截图


这些配置寄存器都是一样的,但是执行完BSP_SystemClkCfg 这个函数之后,系统时钟还是不一样啊,IAR下的是216MHz正常的.gnu下的出现了问题变成了69120000Hz.这是为什么呢?感觉很神奇阿.





并且,在线调试,我分别查看了两个工程的RCC下的寄存器,都是一样的,为什么时钟频率就是不一样呢?

在大牛的指点下,问题终于解决了,在此表示感谢,问题在于HSE_VALUE这个宏定义的值在stm32f7xx_hal_conf.h文件中.板子上的晶振是25M,但是定义中是8M.所以时钟频率总是不对.



修改之后,就可以了


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top