zoukankan      html  css  js  c++  java
  • 转 STM32 时钟树

    本文章来自:  http://www.openedv.com/posts/list/302.htm 

    作者 张洋

     时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32。
        下面是从网上找的一个STM32时钟框图,比《STM32中文参考手册》里面的是中途看起来清晰一些:
      


       
    重要的时钟:
      PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2 之间的关系要弄清楚;


          1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率)     精度较差
          2、HSE:高速外部时钟信号  精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振)  (2)HSE用户外部时钟         
          3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时钟使用 


    在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 

      ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。

      ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

      ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。

      ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

      ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

      其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。

      STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。

      另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。

      系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:

      ①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。

      ②、通过8分频后送给Cortex的系统定时器时钟。

      ③、直接送给Cortex的空闲运行时钟FCLK。

      ④、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。

      ⑤、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。

      在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。

      需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。

      连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。

      连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。


    涉及的寄存器:
    RCC 寄存器结构,RCC_TypeDeff,在文件“stm32f10x_map.h”中定义如下: 
    typedef struct 

    vu32 CR;                  //HSI,HSE,CSS,PLL等的使能 
    vu32 CFGR;              //PLL等的时钟源选择以及分频系数设定
    vu32 CIR;                // 清除/使能 时钟就绪中断
    vu32 APB2RSTR;      //APB2线上外设复位寄存器
    vu32 APB1RSTR;      //APB1线上外设复位寄存器
    vu32 AHBENR;         //DMA,SDIO等时钟使能
    vu32 APB2ENR;       //APB2线上外设时钟使能
    vu32 APB1ENR;      //APB1线上外设时钟使能
    vu32 BDCR;           //备份域控制寄存器
    vu32 CSR;            
    } RCC_TypeDef;

    可以对上上面的时钟框图和RCC寄存器来学习,对STM32的时钟系统有个大概的了解,然后对照我们的《STM32不完全手册》的系统时钟配置函数void Stm32_Clock_Init(u8 PLL)一同来学习。

  • 相关阅读:
    108. Convert Sorted Array to Binary Search Tree
    How to check if one path is a child of another path?
    Why there is two completely different version of Reverse for List and IEnumerable?
    在Jenkins中集成Sonarqube
    如何查看sonarqube的版本 how to check the version of sonarqube
    Queue
    BFS广度优先 vs DFS深度优先 for Binary Tree
    Depth-first search and Breadth-first search 深度优先搜索和广度优先搜索
    102. Binary Tree Level Order Traversal 广度优先遍历
    How do I check if a type is a subtype OR the type of an object?
  • 原文地址:https://www.cnblogs.com/hisoka/p/4149796.html
Copyright © 2011-2022 走看看