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

STM32F207时钟系统解析

[复制链接]
STMCU 发布时间:2020-9-7 13:46
下文将介绍STM32F207的时钟系统如何将25M晶振时钟转换为120M系统主频时钟的。

01
时钟系统介绍
1.png


▲时钟系统专业名词缩写

时钟系统关键组成部分


01 内部高速时钟(HSI)

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

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


02 外部高速时钟(HSE)


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

① 外部晶体/陶瓷谐振器

② 外部用户时钟

22.png
▲两种时钟源接入示意图

03
主锁相环时钟(PLL)

STM32F2xx具有两个PLL

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

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

3.png

HSE/M*N/P得到PLL时钟
关于PLL锁相环说明

4.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
复制代码




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

STM32F20X_User_manual的V7版和V8版对比图

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

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

6.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的控制位
1.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寄存器中有说明
2.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时钟




注意:
7.png
PLL_M大于等于2且小于等于63

8.png
PLL_N大于等于64且小于等于432

9.png
PLL_P只能是2、4、6、或8

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

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

  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;
复制代码




备 注




时钟中断

10.png

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


无源晶振不起振

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


关于APB和PCLK

F207是时钟图没有显示PCLK1和PCLK2,应该就是APB1和APB2
应该指的是一个PCLK应该是PeripheralClock的简称,看F105手册

11.png




收藏 评论0 发布时间:2020-9-7 13:46

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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