0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 来源:知晓编程 作者:Firefly 2023-07-11 16:00 次阅读

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手册

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 陶瓷谐振器
    +关注

    关注

    0

    文章

    21

    浏览量

    9485
  • PLL电路
    +关注

    关注

    0

    文章

    91

    浏览量

    6281
  • STM32F207
    +关注

    关注

    0

    文章

    9

    浏览量

    6510
  • rc振荡器
    +关注

    关注

    3

    文章

    43

    浏览量

    9454
  • 时钟系统
    +关注

    关注

    1

    文章

    83

    浏览量

    11389
收藏 人收藏

    评论

    相关推荐

    STM32F030K6T6和STM32F103C8T6的换成25M的可以吗?

    大神们,如果 把STM32F030K6T6 和 STM32F103C8T6 的换成25M的,可以吗?
    发表于 04-26 06:12

    雷达用25M、50M、100M高稳

    大家好我们是高稳的生产厂家,可提供雷达用25M、50M、100M高稳
    发表于 08-26 13:33

    stm32f439外部HSE不起,求大神解答

    stm32f439新做了块板子,发现外部高速不起,但是能下载程序,程序的stm32内部的时钟
    发表于 10-19 15:09

    STM32时钟配置问题

    使用STM32,之前用的外部无源25M,现在硬件上改成了有源的25M
    发表于 04-21 20:29

    stm32F207 APB1输出最大时钟给TIMER3问题

    ”。AHB:即HPRE[3:0],PLL作为系统时钟输出为120M)(2)现象:配置TIMER3,120分频,溢出中断次数为1000,中断产生周期是1ms(APB1,未分频)。(3)疑
    发表于 12-11 09:01

    为什么LAN8720A的25M不起呢?

    STM32F407加LAN8720A以太网通信,原理图都是按照开发板的原理图设计的, 为什么LAN8720A的25M不起呢。LAN87
    发表于 10-16 04:35

    STM32F207时钟系统如何将25M时钟转换为120M系统主频时钟

    在前几天的文章《原理解析》中介绍了如何产生时钟的,板子使用的是25M无源
    发表于 08-02 06:34

    STM32F429的时钟走向

    是:2~63,一般取外部的频率(比如 25M ,设置为 25)。注意,这个分频系数,对主
    发表于 08-09 06:25

    STM32F103芯片外接去除使用内部HSI时钟

    STM32F103使用内部的配置及64M主频异常的解决方法为了节省空间与成本,
    发表于 08-12 07:51

    STM32F1最大的主频时钟

      STM32F1官方默认及大部分场合下都是使用8MHz的外部STM32F1最大的主频时钟
    发表于 08-12 06:57

    时钟跑的到底是多少M

    新到一家公司后,有个项目要用到STM32F207Vx单片机,找到网上的例子照猫画虎的写了几个例子,比如ADC,可是到了ADC多通道转换的时候就有点傻眼了,这里面的时钟跑的到底是多少M
    发表于 08-12 08:09

    stm32外部时钟源8M如何修改成12M

    stm32外部时钟源8M换成12M
    发表于 08-12 08:30

    STM32F107的时钟设置如何倍频到72M呢 精选资料分享

    STM32F107的时钟设置STM32的库函数好像只有外部8M倍频到72M,现在用的板子外部25M
    发表于 08-13 06:17

    如何将25M时钟转换为120M系统主频时钟

    时钟系统有哪些关键组成部分?STM32F207时钟系统如何将
    发表于 09-26 08:39

    gd32f303外部使用25M,会对rt thread中的定时器精度造成影响吗?

    大家好因为项目需要gd32f303外部使用25M,不知道会不会对rt thread中的定时器精度造成影响?如果造成影响应该如何解决?大家好,咨询个问题,因为功能需要gd32
    发表于 06-14 09:40