OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5077|回复: 8

为什么工作在691200Hz呢?

[复制链接]

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2017-4-16
在线时间
33 小时
发表于 2017-5-11 23:39:12 | 显示全部楼层 |阅读模式
1金钱
时钟配置之前
Image 4.png
[mw_shl_code=applescript,true]sysclk=HAL_RCC_GetHCLKFreq();
    pclk1=HAL_RCC_GetPCLK1Freq();
    pclk2=HAL_RCC_GetPCLK1Freq();
    BSP_SystemClkCfg();                                         /* Initialize CPU clock frequency to 216Mhz             */
    sysclk=HAL_RCC_GetHCLKFreq();
    pclk1=HAL_RCC_GetPCLK1Freq();
    pclk2=HAL_RCC_GetPCLK1Freq();[/mw_shl_code]
时钟配置之后
Image 3.png
时钟配置代码
[mw_shl_code=applescript,true]void  BSP_SystemClkCfg (void)
{
    RCC_OscInitTypeDef  RCC_OscInit;
    RCC_ClkInitTypeDef  RCC_ClkInit;
    HAL_StatusTypeDef   hal_status;
    __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟

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

                                                                /* VCO out-freq = HSE * (PLLN / PLLM)    = 432MHz.      */
                                                                /* PLLCLK       = (VCO out-freq) / PLLP  = 216MHz.      */
    RCC_OscInit.OscillatorType = RCC_OSCILLATORTYPE_HSE;        /* HSE freq     = 25MHz.                                */
    RCC_OscInit.HSEState       = RCC_HSE_ON;
    RCC_OscInit.HSIState       = RCC_HSI_OFF;
    RCC_OscInit.PLL.PLLState   = RCC_PLL_ON;
    RCC_OscInit.PLL.PLLSource  = RCC_PLLSOURCE_HSE;
    RCC_OscInit.PLL.PLLM       = 25u;
    RCC_OscInit.PLL.PLLN       = 432u;
    RCC_OscInit.PLL.PLLP       = RCC_PLLP_DIV2;
    RCC_OscInit.PLL.PLLQ       = 9;/* PLL_Q out freq = (VCO out-freq) / PLLQ = 48MHz.      */
    RCC_OscInit.PLL.PLLR       = 7;

    hal_status = HAL_RCC_OscConfig(&RCC_OscInit);
    if (hal_status != HAL_OK) {
        while (DEF_TRUE) {                                      /* STOP if error                                        */
            ;
        }
    }

    hal_status = HAL_PWREx_EnableOverDrive();                   /* Activate the OverDrive to reach the 216 Mhz Freq     */
    if (hal_status != HAL_OK) {
        while (DEF_TRUE) {                                      /* STOP if error                                        */
            ;
        }
    }

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

    hal_status = HAL_RCC_ClockConfig(&RCC_ClkInit, FLASH_LATENCY_7);
    if (hal_status != HAL_OK) {
        while (DEF_TRUE) {                                      /* STOP if error                                        */
            ;
        }
    }
}
[/mw_shl_code]
ucosiii官方的时钟配置代码。明显配置的时钟和输出的时钟不一样啊???这是什么原因呢?

最佳答案

查看完整内容[请看2#楼]

#define HSE_VALUE 是什么,有没有写错
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

104

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
456475
金钱
456475
注册时间
2014-8-23
在线时间
59 小时
发表于 2017-5-11 23:39:13 | 显示全部楼层
#define HSE_VALUE  是什么,有没有写错
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-12 00:44:50 | 显示全部楼层
帮顶
回复

使用道具 举报

30

主题

104

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
456475
金钱
456475
注册时间
2014-8-23
在线时间
59 小时
发表于 2017-5-13 00:13:06 | 显示全部楼层
HSE_VALUE改了没,还有最好带上RCC寄存器信息,别人好分析啊。
回复

使用道具 举报

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2017-4-16
在线时间
33 小时
 楼主| 发表于 2017-5-13 12:25:19 | 显示全部楼层
cl17726 发表于 2017-5-13 00:13
HSE_VALUE改了没,还有最好带上RCC寄存器信息,别人好分析啊。

RCC寄存器的值都一样,,但是时钟频率就是不一样,这是出现了什么神奇的问题。
这是69120000情况下的RCC寄存器的截图
时钟初始化函数运行之前
Image 4.png Image 4-2.png
由于寄存器比较多,我就截了两张截图
这是正常216000000Hz下的截图
Image 5.png Image 5-2.png
这是时钟配置函数运行之后,系统时钟频率变为691200Hz时的寄存器截图
Image 4-after.png Image 4-2-after.png
这是正常时钟频率为216Mhz时的截图
Image 5-after.png Image 5-2-after.png
这什么原因阿,我对比了每个寄存器的值都是一样的,但是就是sysclck不一样,

回复

使用道具 举报

30

主题

104

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
456475
金钱
456475
注册时间
2014-8-23
在线时间
59 小时
发表于 2017-5-13 12:40:07 | 显示全部楼层
SysmteCoreClockUpdate函数贴出来
回复

使用道具 举报

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2017-4-16
在线时间
33 小时
 楼主| 发表于 2017-5-13 15:40:33 | 显示全部楼层
cl17726 发表于 2017-5-13 12:40
SysmteCoreClockUpdate函数贴出来

[mw_shl_code=applescript,true]void SystemCoreClockUpdate(void)
{
  uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
  
  /* Get SYSCLK source -------------------------------------------------------*/
  tmp = RCC->CFGR & RCC_CFGR_SWS;

  switch (tmp)
  {
    case 0x00:  /* HSI used as system clock source */
      SystemCoreClock = HSI_VALUE;
      break;
    case 0x04:  /* HSE used as system clock source */
      SystemCoreClock = HSE_VALUE;
      break;
    case 0x08:  /* PLL used as system clock source */

      /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
         SYSCLK = PLL_VCO / PLL_P
         */   
      pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
      pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
      
      if (pllsource != 0)
      {
        /* HSE used as PLL clock source */
        pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
      }
      else
      {
        /* HSI used as PLL clock source */
        pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);      
      }

      pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
      SystemCoreClock = pllvco/pllp;
      break;
    default:
      SystemCoreClock = HSI_VALUE;
      break;
  }
  /* Compute HCLK frequency --------------------------------------------------*/
  /* Get HCLK prescaler */
  tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
  /* HCLK frequency */
  SystemCoreClock >>= tmp;
}[/mw_shl_code]
上述是system_stm32f7xx.c文件中的SystemCoreClockUpdate函数。

回复

使用道具 举报

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2017-4-16
在线时间
33 小时
 楼主| 发表于 2017-5-13 22:29:46 | 显示全部楼层
cl17726 发表于 2017-5-13 15:54
#define HSE_VALUE  是什么,有没有写错

我写错了,谢谢你,最开始是8Mhz,我改成25Mhz就可以了,谢谢.
ok1.png ok2.png
okk.png
回复

使用道具 举报

30

主题

104

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
456475
金钱
456475
注册时间
2014-8-23
在线时间
59 小时
发表于 2017-5-14 09:42:17 | 显示全部楼层
iysheng 发表于 2017-5-13 22:29
我写错了,谢谢你,最开始是8Mhz,我改成25Mhz就可以了,谢谢.

great
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 08:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表