你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F207时钟系统解析

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
板子使用的是25M无源晶振,下文将介绍STM32F207的时钟系统如何将25M晶振时钟转换为120M系统主频时钟的。

01、时钟系统介绍

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png

                                                                    ▲时钟系统专业名词缩写

时钟系统关键组成部分

01 内部高速时钟(HSI)

HSI时钟信号可以通过内部16MHZ的RC振荡器产生,可以直接用于系统时钟或者用于PLL输入。

HSI的RC振荡器的优势是:在最小成本(没有外部器件)情况下提供一个时钟源。它的启动速度要比HSE晶体振荡器更快,但是即使校准频率后,它的精度仍然小于外部晶体振荡器或陶瓷谐振器。

02 外部高速时钟(HSE)

外部高速时钟信息(HSE)可以通过两个时钟源产生:

① 外部晶体/陶瓷谐振器

② 外部用户时钟

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png


▲两种时钟源接入示意图


03 主锁相环时钟(PLL)

STM32F2xx具有两个PLL

① 主要的PLL通过HSE或HSI提供时钟,并且有两个输出时钟;

② 专用的PLL(PLLI2S)被用于产生一个精确的时钟去实现高质量音频效果在I2S接口;

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png



HSE/M*N/P得到PLL时钟

关于PLL锁相环说明

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png



从1处输入,3处输出是1的N倍。

3处除以N又作为输入,当1和2的频率一样,就锁定了。(之所以图上是xN,因为从2看向3的)



04 低速外部时钟(LSE)

LSE是一个32.768KHZ低速外部晶振或陶瓷谐振器。

它的优点:提供低速但是高精度时钟给RTC外设,为时钟/日历或其他时间应用。


05低速内部时钟(LSI)

LSI RC作为一个低速时钟源,它可以运行在停止和待机模式中给独立看门狗(IWDG)和自动唤醒(AWU)。它的时钟频率在32MHZ左右。

02、代码分析
时钟初始化代码在system_stm32f2xx.c文件中,大部分时候我们不需要修改时钟代码的,各个总线的频率我们可以在文件头看到。

  1. =============================================================================
  2.   *=============================================================================
  3.   *        Supported STM32F2xx device revision    | Rev B and Y
  4.   *-----------------------------------------------------------------------------
  5.   *        System Clock source                    | PLL (HSE)
  6.   *-----------------------------------------------------------------------------
  7.   *        SYSCLK(Hz)                             | 120000000
  8.   *-----------------------------------------------------------------------------
  9.   *        HCLK(Hz)                               | 120000000
  10.   *-----------------------------------------------------------------------------
  11.   *        AHB Prescaler                          | 1
  12.   *-----------------------------------------------------------------------------
  13.   *        APB1 Prescaler                         | 4
  14.   *-----------------------------------------------------------------------------
  15.   *        APB2 Prescaler                         | 2
  16.   *-----------------------------------------------------------------------------
  17.   *        HSE Frequency(Hz)                      | 25000000
  18.   *-----------------------------------------------------------------------------
  19.   *        PLL_M                                  | 25
  20.   *-----------------------------------------------------------------------------
  21.   *        PLL_N                                  | 240
  22.   *-----------------------------------------------------------------------------
  23.   *        PLL_P                                  | 2
  24.   *-----------------------------------------------------------------------------
  25.   *        PLL_Q                                  | 5
  26.   *-----------------------------------------------------------------------------
  27.   *        PLLI2S_N                               | NA
  28.   *-----------------------------------------------------------------------------
  29.   *        PLLI2S_R                               | NA
  30.   *-----------------------------------------------------------------------------
  31.   *        I2S input clock                        | NA
  32.   *-----------------------------------------------------------------------------
  33.   *        VDD(V)                                 | 3.3
  34.   *-----------------------------------------------------------------------------
  35.   *        Flash Latency(WS)                      | 3
  36.   *-----------------------------------------------------------------------------
  37.   *        Prefetch Buffer                        | ON
  38.   *-----------------------------------------------------------------------------
  39.   *        Instruction cache                      | ON
  40.   *-----------------------------------------------------------------------------
  41.   *        Data cache                             | ON
  42.   *-----------------------------------------------------------------------------
  43.   *        Require 48MHz for USB OTG FS,          | Enabled
  44.   *        SDIO and RNG clock                     |
  45.   *-----------------------------------------------------------------------------
  46.   *=============================================================================
  47.   ******************************************************************************
复制代码
在文件开始定义的有系统时钟频率的全局变量SystemCoreClock,其他地方需要时钟频率,可以直接使用该变量。
  1. uint32_t SystemCoreClock = 120000000;
复制代码

时钟配置从SystemInit函数执行,调用SystemInit的在汇编文件中startup_stm32f2xx.s(Keil编译环境)。

  1. IMPORT  __main
  2.     LDR     R0, =SystemInit
  3.     BLX     R0
  4.     LDR     R0, =__main
  5.     BX      R0
  6.     ENDP
复制代码

在这里说明一下文档版本的问题:

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png


▲STM32F20X_User_manual的V7版和V8版对比图

上述两图的区别是系统最大时钟从120MHZ变成了168MHZ,我的理解是同样是STM32F20X,ST由于技术进步或其他,使得新版STM32F207芯片超频支持168MHZ。

下面我们主要分析SystemCoreClock的120M时钟怎么从一个外部25MHZ的HSE得到的。

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png


我们要从25MHZ的外部时钟得到120M的系统时钟,需要上图中标注的重要4点:

1、使能HSE

2、选择HSE作为主PLL的输入时钟

3、主PLL倍频后得到120MHZ时钟

4、系统时钟选择主PLL时钟输出作为系统时钟

我们找到对应的代码

  1、使能HSE
  1. /* Enable HSE */
  2. RCC->CR |= ((uint32_t)RCC_CR_HSEON);
复制代码

在RCC_CR寄存器(RCCclock control register RCC时钟控制器)中,有打开HSE的控制位
aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png


2、选择HSE作为主PLL的输入时钟
  1. /* Configure the main PLL */
  2. RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
  3.                    (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
复制代码

RCC_PLLCFGR_PLLSRC_HSE就是配置HSE作为主PLL的输入时钟

  3、主PLL倍频后得到120MHZ时钟
  1. /* Configure the main PLL */
  2. RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
  3.                    (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
复制代码

4、配置主PLL作为系统时钟的输入时钟
  1. /* Select the main PLL as system clock source */
  2. RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
  3. RCC->CFGR |= RCC_CFGR_SW_PL
复制代码

对于主PLL的配置寄存器,在RCC_PLLCFGR寄存器中有说明

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png


整理后得知f(out)=f(in)* N / M / P
  1. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
  2. #define PLL_M      25
  3. #define PLL_N      240
  4. /* SYSCLK = PLL_VCO / PLL_P */
  5. #define PLL_P      2
复制代码

这样就获得了120M时钟

注意:

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png


PLL_M大于等于2且小于等于63

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png


PLL_N大于等于64且小于等于432

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png


PLL_P只能是2、4、6、或8

但2对应0,4对应1,6对应2,8对应3。

ST并没有使用if或case语句判断,因为对应的数据除以2减去1就是寄存器这两位的值,所以可以按照下面这样写,这种写法值得我们学习。

(((PLL_P >> 1) -1) << 16)
其他外设的时钟配置时
  1. /* HCLK = SYSCLK / 1*/
  2. RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
  3. /* PCLK2 = HCLK / 2*/
  4. RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
  5. /* PCLK1 = HCLK / 4*/
  6. RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
复制代码

03、备 注

时钟中断

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.png


可以配置外部晶振出错时的中断,还有RCC中断,因此我们可以在外部时钟出问题时,切换为内部时钟,不至于整个系统挂掉。具体见ST给的官方代码。

无源晶振不起振

没有程序,无源晶振是不起振的,需要配置RCC时钟控制寄存器的HSEON位打开或关闭HSE振荡器。具体可以看之前的文章《晶振原理解析》。

关于APB和PCLK

F207是时钟图没有显示PCLK1和PCLK2,应该就是APB1和APB2

应该指的是一个PCLK应该是PeripheralClock的简称,看F105手册

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy8wUmc4RGRwQWliZlVxc2pZQ3lEVzVKQUZpY3NG.jpg








收藏 评论0 发布时间:2021-12-3 17:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版