STM32F207是如何将25M晶振时钟转换为120M系统主频时钟的?

发布者:chi32最新更新时间:2024-06-06 来源: elecfans关键字:STM32F207 手机看文章 扫描二维码
随时随地手机看文章

01

时钟系统介绍

图片

▲时钟系统专业名词缩写

时钟系统关键组成部分

01

内部高速时钟(HSI)

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

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

02

外部高速时钟(HSE)

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

① 外部晶体/陶瓷谐振器

② 外部用户时钟

图片

▲两种时钟源接入示意图

03

锁相环时钟(PLL)

STM32F2xx具有两个PLL

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

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

图片

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

关于PLL锁相环说明

图片

从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文件中,大部分时候我们不需要修改时钟代码的,各个总线的频率我们可以在文件头看到。


=============================================================================

  *=============================================================================

  *        Supported STM32F2xx device revision    | Rev B and Y

  *-----------------------------------------------------------------------------

  *        System Clock source                    | PLL (HSE)

  *-----------------------------------------------------------------------------

  *        SYSCLK(Hz)                             | 120000000

  *-----------------------------------------------------------------------------

  *        HCLK(Hz)                               | 120000000

  *-----------------------------------------------------------------------------

  *        AHB Prescaler                          | 1

  *-----------------------------------------------------------------------------

  *        APB1 Prescaler                         | 4

  *-----------------------------------------------------------------------------

  *        APB2 Prescaler                         | 2

  *-----------------------------------------------------------------------------

  *        HSE Frequency(Hz)                      | 25000000

  *-----------------------------------------------------------------------------

  *        PLL_M                                  | 25

  *-----------------------------------------------------------------------------

  *        PLL_N                                  | 240

  *-----------------------------------------------------------------------------

  *        PLL_P                                  | 2

  *-----------------------------------------------------------------------------

  *        PLL_Q                                  | 5

  *-----------------------------------------------------------------------------

  *        PLLI2S_N                               | NA

  *-----------------------------------------------------------------------------

  *        PLLI2S_R                               | NA

  *-----------------------------------------------------------------------------

  *        I2S input clock                        | NA

  *-----------------------------------------------------------------------------

  *        VDD(V)                                 | 3.3

  *-----------------------------------------------------------------------------

  *        Flash Latency(WS)                      | 3

  *-----------------------------------------------------------------------------

  *        Prefetch Buffer                        | ON

  *-----------------------------------------------------------------------------

  *        Instruction cache                      | ON

  *-----------------------------------------------------------------------------

  *        Data cache                             | ON

  *-----------------------------------------------------------------------------

  *        Require 48MHz for USB OTG FS,          | Enabled

  *        SDIO and RNG clock                     |

  *-----------------------------------------------------------------------------

  *=============================================================================

  ******************************************************************************

在文件开始定义的有系统时钟频率的全局变量SystemCoreClock,其他地方需要时钟频率,可以直接使用该变量。


uint32_t SystemCoreClock = 120000000;

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


IMPORT  __main

    LDR     R0, =SystemInit

    BLX     R0

    LDR     R0, =__main

    BX      R0

    ENDP

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

图片

▲ STM32F20X_User_manual的V7版和V8版对比图

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

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

图片

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

1、使能HSE

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

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

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

我们找到对应的代码

1、使能HSE

/* Enable HSE */

  RCC- >CR |= ((uint32_t)RCC_CR_HSEON);


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

图片

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


/* Configure the main PLL */RCC- >PLLCFGR = PLL_M | (PLL_N < < 6) | (((PLL_P > > 1) -1) < < 16) |

                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q < < 24);

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


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


/* Configure the main PLL */RCC- >PLLCFGR = PLL_M | (PLL_N < < 6) | (((PLL_P > > 1) -1) < < 16) |

                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q < < 24);

4、配置主PLL作为系统时钟的输入时钟


/* Select the main PLL as system clock source */RCC- >CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

RCC- >CFGR |= RCC_CFGR_SW_PL

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


图片


整理后得知f(out)=f(in)* N / M / P


/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */#define PLL_M      25#define PLL_N      240/* SYSCLK = PLL_VCO / PLL_P */#define PLL_P      2

这样就获得了120M时钟


注意:

图片

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

图片

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

图片

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


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


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


(((PLL_P > > 1) -1) < < 16)

其他外设的时钟配置时


/* HCLK = SYSCLK / 1*/

RCC- >CFGR |= RCC_CFGR_HPRE_DIV1;



/* PCLK2 = HCLK / 2*/

RCC- >CFGR |= RCC_CFGR_PPRE2_DIV2;



/* PCLK1 = HCLK / 4*/

RCC- >CFGR |= RCC_CFGR_PPRE1_DIV4;

** 备 注 **


** 时钟中断**

图片

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

无源晶振不起振

没有程序,无源晶振是不起振的,需要配置RCC时钟控制寄存器的HSEON位打开或关闭HSE振荡器。

关于APB和PCLK

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

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

图片


关键字:STM32F207 引用地址:STM32F207是如何将25M晶振时钟转换为120M系统主频时钟的?

上一篇:STM32CUBEMX开发GD32F303读保护与写保护概述
下一篇:STM32FF030 替代国产单片机——DP32G030

推荐阅读最新更新时间:2026-03-25 12:10

STM32单片机外部时钟晶振该如何选择频率
芯片的主晶振频率范围一般来说在数据手册(Datasheet)和技术参考手册(Technical Reference Manual)中都有介绍。 你提到的时钟先分频再倍频,这个需要深入到STM32的内部去一探究竟了,在其技术参考手册的第7.2节Clocks的一开始有一个表格,时钟树(Figure 8. Clock tree),它完全地列出来STM32这个芯片内部各个模块的时钟来源以及相关的从属关系。 在这个图的正中央,有一个核心时钟:SYSCLK,它最大频率是72MHz,它的时钟信号通过选择器SW可以由PLLCLK提供(也可由HIS、HSE提供)。 PLL,毫无疑问,它是用来倍频的,可以*2,*3,*4……*16,它的时
[单片机]
STM32单片机<font color='red'>的</font>外部<font color='red'>时钟</font><font color='red'>晶振</font>该如何选择频率
MSP430G2553时钟外部晶振配置说明
摘要:关于MSP430G2553的时钟分类以及ACLK,MCLK和SMCLK的时钟源以下均不会做具体解释,在百度或者CSDN能搜到好多相关的说明文章。本文主要论证一下ACLK,MCLK和SMCLK可选作为时钟源的LFXT1CLK的频率是多少。在BAIDU以及TAOBAO中搜索不到下图电路板中的无源晶振,所以想要自己动手对其进行推导。(2553的技术文档介绍中该晶振为32kHz晶振) 主要思路: 配置相关时钟寄存器,将外部晶振LFXT1CLK作为SMCLK的时钟源,SMCLK作为定时器A的时钟源,配置定时器使相应引脚输出PWM波,根据PWM波的频率,最终推导出LFXT1CLK对应的外部无源晶振的频率。 小试牛刀 本步主要
[单片机]
MSP430G2553<font color='red'>时钟</font>外部<font color='red'>晶振</font>配置说明
【STM32F103攻城笔记】内部晶振HSI倍频设置系统时钟
首先说明,因为STM32芯片的型号不同,所以对于不同芯片有不同频率的限制,比如某些时钟频率不能大于多少,这是根据手册来设置的!但改变频率的寄存器都一样,只是我们设置频率大小要受芯片的限制!下面我用的芯片型号是STM32F103VBT6!它就限制了内部晶振的倍频不能大于64MHz(但其实我实验出来是52MHz)! 本文是利用内部晶振(HSI)来倍频,与外部晶振倍频区分开! 第一步:打开system_STM32f10x.c,找到函数void SystemInit (void){},把原有的都注释掉,将下面的代码复制进去: /* 开启HSI 即内部晶振时钟 */ RCC- CR |= (uint32_t)0x
[单片机]
【STM32F103攻城笔记】内部<font color='red'>晶振</font>HSI倍频设置<font color='red'>系统</font><font color='red'>时钟</font>
STM32F103C8T6最小系统构建(3)_时钟源电路-晶振
最小系统板要有处理器这是肯定的,既然我标题都是STM32F103C8T6的最小系统,那处理器就是C8T6了,电路图上,加一块芯片原理图,如此简单的操作就不做过多描述了。 系统是需要有时钟,这样,你的系统跑起来会稳定有序。STM32内部自身就有三个时钟源,这个看过32手册时钟树的都会有一定的了解,在32芯片的时钟树中需要有五个时钟源,我们需要布置的便是外部高速时钟和外部低速时钟。 我们讲硬件电路布置,32时钟树的的时钟讲解你们可以参考其他人的一些讲解性文章。硬件上需要了解的知识有两个,外部时钟源怎么和MCU相连,外部时钟源给多大? 这个都不是什么非常难找的,网上资料还是有很多的,查阅资料: 高速外部时钟,可接石英/陶
[单片机]
STM32F103C8T6最小<font color='red'>系统</font>地<font color='red'>的</font>构建(3)_<font color='red'>时钟</font>源电路-<font color='red'>晶振</font>
STM32晶振时钟稳定性要重视!!!
最近看了不少网上网友的应用案例,在 STM32 晶振问题上不少都栽了跟头。我自己也碰见过一次。就是电容值搞错了。 ourdev有网友说:他的设备隔几天系统就出问题,系统时钟变慢。 ----------------------------------------有网友说: 国产的晶振,我们用在产品里吃过很多亏。发出去几百个货(出厂都检验合格), 到客户那里几个有时就不起振了(几个月后),后来改用进口的,从此不出问题了。哎! ---------------------------------------有网友说: 第一次遇到是忘了焊接22P的电容,板子可以工作,但是运行速度慢,但是晶振起振了, 示波器看波形有刺,想必是
[单片机]
【STM32F103攻城笔记】外部晶振HSE倍频设置系统时钟
上一篇的内部晶振的系统时钟设置已经对系统时钟进行了配置,而外部晶振的倍频只需要改变上一篇的初始化函数就可以,其他均一样! 第一步:建立一个HSE倍频的初始化函数void SystemClock_Config(void) ; 所以我们由上一篇文章变为: int main (void) { RCC_ClocksTypeDef RCC_Clocks; //初始化 SystemClock_Config(); //调用刚才改过的函数 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Usart_Init(115200); //串口为了看数据而已 RCC_GetClocksF
[单片机]
STM32在外部32Mhz晶振时钟配置方法
1. 硬件平台 本例程使用的是 STM32F302RDT6 芯片,其时钟配置方法在其它ST单片机中也类似。 2. 实验目的 使用外部 32Mhz 晶振配置系统时钟为 72Mhz。 3. 配置原理 根据STM32F302RD芯片的参考手册,可以查看该芯片的时钟树结构,这里我们配置系统时钟 SYSCLK 为72Mhz,所以这里只需要修改 PREDIV 的分频值为4分频,其它 PLL 倍频等配置和使用8Mhz外部晶振时配置相同。 4. 修改配置 (1)打开工程里的 system_stm32f30x.c 文件,找到 SetSysClock() 函数,进行时钟配置修改。这里我们只需要将外部时钟四分频后得到8Mhz的时钟,所
[单片机]
STM32时钟配置,不同晶振时需要配置程序
在“stm32f10x.h”这个头文件里: #define HSE_Value ((uint32_t)8000000) /! Value of the External oscillator in Hz/ 斜体内容默认是8000000,在你修改了外部晶振时,要和你的外部晶振数值相同,不如我的外部晶振时24M,我就把它改成24M,这样就可以了, 还有一处要更改是在“system_stm32f10x.c”里: static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /! SYSCLK, HCLK, PCLK2 and PC
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved