分享

STM32时钟系统

 笔录收藏 2020-02-01

一,时钟系统框图

  这里写图片描述

下面我们根据这张图说说有关STM32时钟系统的那些事


二,STM32的5个时钟源:HSI HSE LSI LSE PLL

 1. HSI:高速内部时钟

  由内部RC振荡器产生,频率不稳定,约8M

   这里写图片描述

   可直接作为系统时钟的选择(如图:系统时钟源有4个来源选择,后边讲解)

   可2分频后经过选择器做PLL时钟源


 2. HSE:高速外部时钟

  由外部时钟源产生,可接4M-16MHz晶振(开发板为8兆)

  这里写图片描述

   可经过选择器1,选择器2做PLL时钟源

   可2分频后经过选择器1,选择器2做PLL时钟源

   可直接作为系统时钟的时钟源

   可128分频后做RTC时钟源


 3. PLL:锁相环

  作用:可关闭或倍频2-16倍,共16种选择(最大不能超过72MHz)

  这里写图片描述

   倍频后的PLLCLK可直接做系统时钟源

   可经过USB预分频器(分频前48或72MHz)分频后,做USB时钟(48MHz)-具体后边说

   例如:HSE外接8M晶振通过选择器1选择器2进入PLL,可设置PLL的倍频系数(通过配置相关寄存器配置,后边说)

   倍频后产生的PLLCLK可作为系统时钟的一个选择


 4. LSE:低速外部时钟

  由外部晶振产生,一般外接32.768MHz晶振给RTC(STM32芯片内部时钟单元)时钟提供时钟源

  这里写图片描述

   外接32.768MHz晶振为RTC时钟提供时钟源


 5. LSI:低速内部时钟

  由内部RC振荡器产生,频率不稳定 约40KHz

  这里写图片描述

   为STM32独立看门狗单元提供时钟来源

   也可为RTC提供时钟来源(RTC有3个可选时钟源,后面说)

   由于RTC实时时钟对时钟的要求较高

   所以一般不使用LSI作为时钟源,采用LSE外接32.768MHz晶振作为RTC时钟源


三,STM32的八个时钟

  这里写图片描述


 1. 系统时钟-SYSCLK

  这里写图片描述

  系统时钟的来源:

   1,HSI直接做系统时钟源

   2,HSE直接做系统时钟源

   3,PLL倍频后的PLLCLK做系统时钟源(这里的PLL时钟来源有3种,一会儿说)

   4,CSS单元(时钟监控系统)

   CSS作用是监听系统时钟是否出了问题(间接知道外部晶振是否坏了)

   项目中大多系统时钟来源采用HSE,一旦监控到HSE失败,会自动切换系统时钟源为HSI


 2. PLL时钟-PLLCLK

  这里写图片描述

  PLL的时钟来源:

   1,HSI的2分频

   2,HSE->选择器1->选择器2

   3,HSE的2分频->经过选择器1->选择器2


 3. RTC时钟-RTCCLK:32.768MHz

  这里写图片描述

  RTC时钟来源:

   1,HSE的128分频

   2,LSE外接32.768MHz晶振

   3,LSI直接做RTC时钟源

   由于LSI是由内部RC振荡器产生,不稳定,RTC时钟对时钟源的要求较高,多以一般用LSE外接32.768MHz晶振做RTC时钟源


 4,独立看门狗时钟-IWDGCLK:40MHz

  独立看门狗时钟来源

  独立看门狗时钟来源:

   由LSI直接作为其时钟源


 5. AHB总线时钟-HCLK:速度最高72MHz

  AHB预分频器,9种分频因子为:1,2,4,8,16,64,128,256,512

  这里写图片描述

  系统时钟HCLK 经过AHB预分频器,产生HCLK时钟(最高72M)

  一般将系统时钟设置为72M将AHB预分频器设置为1

  AHB总线下还挂载了ABP1预分频器和APB2预分频器(后边说)


 6. APB1总线时钟-PCLK1(低速):速度最高36MHz

  APB1预分频器:分频因子:1,2,4,8,16

  这里写图片描述

  AHB时钟HCLK经过APB1预分频器,产生PCLK1时钟(最高到36M)-低速外设总线时钟

  下面挂一些低速外设,如:通用定时器时钟

  APB1总线下挂载的部分这里不做讲解(到定时器时再说)


 7. APB2总线时钟-PCLK2(高速):速度最高72MHz

  APB2预分频器-5种分频因子为:1,2,4,8,16

  这里写图片描述

  AHB时钟HCLK经过APB2预分频器,产生PCLK2时钟(最高到72M)-高速外设总线时钟

  下面挂一些高速外设,如:TIM1时钟,ADC时钟

  APB2总线下挂载的部分这里不做讲解(到定时器和ADC时再说)


 8. USB时钟-USBCLK:48MHz

  这里写图片描述

  来自PLLCLK经过USB分频器(可通过相关寄存器配置 1倍 1.5倍)

   F1芯片在不超频时的最大时钟是72MHz,也就是说:

   当PLLCLK为72MHz系统时钟时,USB分频器为1.5倍,72/1.5=48MHz

   当PLLCLK为48MHz时,USB分频器为1倍,48/1=48MHz


所以:使用外设前需要使能相应的钟使能位,否则外设不能使用

STM32有很多外设,不使用的不打开,否则增加功耗(耗电)


四,MCO:输出内部时钟的引脚

 MCO:输出内部时钟的引脚(PA8),可输出相关内部时钟

  这里写图片描述

 MCO输出内部时钟的选择:

  SYSCLK-系统时钟

  HSI-高速内部时钟

  HSE-高速外部时钟

  PLLCLK的2分频


五,时钟系统寄存器

 与时钟相关的配置寄存器一般在:stm32f10x_rcc.c下stm32f10x_rcc.h头文件中

 stm32f10x_rcc.c下stm32f10x.h中包含了大多数的地址映射,可找到RCC结构体

        /** 
          * @brief Reset and Clock Control
          */
        typedef struct
        {
          __IO uint32_t CR;           // HSI,HSE,CSS,PLL等的使能和就绪标志位 
          __IO uint32_t CFGR;         // PLL等的时钟源选择,分频系数设定
          __IO uint32_t CIR;          // 清除/使能 时钟就绪中断
          __IO uint32_t APB2RSTR;     // APB2线上外设复位寄存器
          __IO uint32_t APB1RSTR;     // APB1线上外设复位寄存器
          __IO uint32_t AHBENR;       // DMA,SDIO等时钟使能
          __IO uint32_t APB2ENR;      // APB2线上外设时钟使能
          __IO uint32_t APB1ENR;      // APB1线上外设时钟使能
          __IO uint32_t BDCR;         // 备份域控制寄存器
          __IO uint32_t CSR;          // 控制状态寄存器

        #ifdef STM32F10X_CL  
          __IO uint32_t AHBRSTR;
          __IO uint32_t CFGR2;
        #endif /* STM32F10X_CL */ 

        #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)   
          uint32_t RESERVED0;
          __IO uint32_t CFGR2;
        #endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ 
        } RCC_TypeDef;

 其中常用的五个寄存器:

          __IO uint32_t CR;           // HSI,HSE,CSS,PLL等的使能和就绪标志位 
          __IO uint32_t CFGR;         // PLL等的时钟源选择,分频系数设定
          __IO uint32_t AHBENR;       // DMA,SDIO等时钟使能
          __IO uint32_t APB2ENR;      // APB2线上外设时钟使能
          __IO uint32_t APB1ENR;      // APB1线上外设时钟使能

后三个寄存器:

 外设时钟使能寄存器-控制AHB,APB1,APB2
 例如:
  AHB控制SDIO时钟,CRC时钟使能
  APB1控制IO口时钟使能
  APB1控制串口使能,I2
 更多配置项参考数据手册

CR寄存器:

 时钟源的使能和就绪标志位
 使能时钟源(CR振荡器和外部晶振),使能后不能立刻稳定(有一个起振的过程),需要等待稳定
稳定后会在CR寄存器设置标志位
  这里写图片描述
 CR寄存器包含多个标志位,记录是否时开启和就绪
选取位0和位1(HSI)进行说明(其他详见数据手册)
  这里写图片描述
位0-HSION:内部高速时钟8M是否使能(0:关闭,1:使能)
位1-HSIRDY:内部高速时钟是都就绪(是否已稳定 0:尚未就绪,1:已就绪)

CFGR寄存器:

 设置时钟源的选择和分频/倍频系数寄存器
  这里写图片描述

 RCC_CDGR寄存器:
 这里写图片描述
 系统时钟切换控制位1:0
 这里写图片描述
 AHB预分频系数控制位7:4
 这里写图片描述

 所有选择器的最终选择结果都是有CFGR寄存器配置的
 所有预分频器/倍频器的实际参数也是由CFGR寄存器配置的

库函数分类

    //时钟源使能配置
    RCC_LSEConfig(),
    RCC_HSEConfig(),
    RCC_HSICmd(),
    RCC_LSICmd(),
    RCC_PLLCmd()...
    //时钟源选择配置:(最终配置的是CFGR寄存器)
    RCC_PLLConfig(),
    RCC_SYSCLKConfig(),
    RCC_RTCCLKConfig()...
    //分频系数选择
    RCC_HCLKConfig();
    RCC_PCLK1Config();
    RCC_PCLK2Config();
    //外设时钟使能:
    RCC_APB1PeriphClockCmd();  //APB1线上外设使能
    RCC_APB2PeriphClockCmd();  //APB2线上外设使能
    RCC_AHBPeriphClockCmd();   //AHB线上外设使能
    //其他外设时钟使能:
    RCC_ADCCLKConfig();
    RCC_RTCCLKConfig()
    //状态参数获取参数:
    RCC_GetClocksFreq();
    RCC_GetSYSCLKSource();
    RCC_GetFlagStatus();
    //RCC中断相关函数:
    RCC_ITConfig();
    RCC_GetITStatus();
    RCC_ClearITPendingBit();

 STM32系统初始化函数已经通过配置寄存器的方式,对以上做了初始化,当然我们了解了这些配置也可以写自己需要的STM32系统初始化函数

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多