历史上的今天
返回首页

历史上的今天

今天是:2025年02月18日(星期二)

正在发生

2019年02月18日 | STM32系统时钟配置及时钟树

2019-02-18 来源:eefocus

参考资料:《 STM32F4xx 中文参考手册》 RCC 章节。


STM32时钟可大致分为系统时钟和其它时钟两大类,总共包含5个时钟源 HSI(High Speed Internal Clock)、HSE(High Speed External Clock)、LSI(low Speed Internal Clock)、LSE(Low Speed External Clock )、PLL(Phase Locked Loop Clock)。


下图即为STM32时钟树,黄色标识部分即为系统时钟部分,橙色即为其它时钟部分。



一、系统时钟


①HSE(High Speed External Clock)高速外部时钟信号



HSE 是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从 4-26MHZ不等。当使用有源晶振时,时钟从 OSC_IN引脚进入,OSC_OUT 引脚悬空,当选用无源晶振时,时钟从 OSC_IN 和 OSC_OUT 进入,并且要配谐振电容。HSE 我们使用25M 的无源晶振。如果我们使用 HSE 或者 HSE 经过 PLL倍频之后的时钟作为系统时钟 SYSCLK,当 HSE 故障时候,不仅HSE 会被关闭,PLL也会被关闭,此时高速的内部时钟时钟信号HSI 会作为备用的系统时钟,直到 HSE 恢复正常,HSI=16M。


HSI(High Speed Internal Clock)高速内部时钟信号



由芯片内部RC振荡器提供,大小为16MHZ,当HSE故障时,系统时钟会自动切换到HSI,直到HSE 启动成功。


②锁相环 PLL(Phase Locked Loop )



PLL的主要作用是对时钟进行倍频,然后把时钟输出到各个功能部件。PLL有两个,一个是主 PLL(黄色部分,为系统时钟部分),另外一个是专用的 PLLI2S(橙色部分),他们均由 HSE 或者 HSI 提供时钟输入信号。


主 PLL有两路的时钟输出,第一个输出时钟 PLLCLK用于系统时钟,第二个输出用于 USB OTG FS 的时钟、RNG 和 SDIO 时钟。专用的 PLLI2S 用于生成精确时钟,给 I2S 提供时钟。


HSE 或者 HSI 经过 PLL 时钟输入分频因子 M分频后,成为 VCO 的时钟输入,VCO 的时钟必须在 1~2M 之间,我们选择HSE=25M 作为 PLL 的时钟输入,M 设置为 25,那么 VCO输入时钟就等于 1M。VCO 输入时钟经过 VCO倍频因子 N 倍频之后,成为 VCO时钟输出,VCO时钟必须在 192~432M 之间。我们配置 N 为 360,则 VCO的输出时钟等于 360M。VCO 输出时钟之后有三个分频因子:PLLCLK分频因子 p,USB OTG FS/RNG/SDIO时钟分频因子 Q,分频因子R


具体公式如下


                                                             PLLCLK = HSE(HSI) / M *N /P 


                                                             PLL48CK =  HSE(HSI) / M *N /Q


③系统时钟 SYSCLK



系统时钟来源可以是:HSI、PLLCLK、HSE,具体的由时钟配置寄存器 RCC_CFGR的 SW位配置。如果系统时钟是由HSE 经


过 PLL倍频之后的 PLLCLK 得到,当 HSE 出现故障的时候,系统时钟会切换为HSI=16M,直到 HSE 恢复正常为止。


④AHB 总线时钟 HCLK



系统时钟 SYSCLK 经过 AHB 预分频器分频之后得到时钟叫 AHB 总线时钟,即 HCLK,分频因子可以是:[1,2,4,8,16,64,


128,256,512],具体的由时钟配置寄存器RCC_CFGR 的 HPRE 位设置。片上大部分外设的时钟都是经过 HCLK 分频得到,


至于 AHB总线上的外设的时钟设置为多少,得等到我们使用该外设的时候才设置。这里只需粗线条的设置好AHB的时钟即可。


⑤APB2总线时钟 PCLK2



APB2总线时钟 PCLK2 由 HCLK经过高速 APB2预分频器得到,分频因子可以是:[1,2,4,8,16],具体由时钟配置寄存器RCC_CFGR 的 PPRE2位设置。HCLK2属于高速的总线时钟,片上高速的外设就挂载到这条总线上,比如全部的 GPIO、USART1、SPI等。至于 APB2总线上的外设的时钟设置为多少,得等到我们使用该外设的时候才设置。这里只需粗线条的设置好APB2的时钟即可。


⑥APB1总线时钟 PCLK1


APB1 总线时钟 PCLK1 由 HCLK经过低速 APB预分频器得到,分频因子可以是:[1,2,4,8,16],具体由时钟配置寄存器RCC_CFGR的 PPRE1位设置。HCLK1属于低速的总线时钟,最高为 45M,片上低速的外设就挂载到这条总线上,比如USART2/3/4/5、SPI2/3,I2C1/2等。至于 APB1总线上的外设的时钟设置为多少,得等到我们使用该外设的时候才设置。


这里只需粗线条的设置好APB的时钟即可。


系统初始化时钟过程如下


Reset_Handler    PROC

                 EXPORT  Reset_Handler             [WEAK]

        IMPORT  SystemInit

        IMPORT  __main

 

                 LDR     R0, =SystemInit

                 BLX     R0

                 LDR     R0, =__main

                 BX      R0

                 ENDP


这是一个启动文件,当我们单片机上电后,首先执行的启动文件,会进入SystemInit函数


void SystemInit(void)

{

  /* FPU设置 ------------------------------------------------------------*/

  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)

    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */

  #endif

  /* 复位RCC时钟配置到默认的初始化状态 ------------*/

  /* Set HSION bit */

  RCC->CR |= (uint32_t)0x00000001;

 

  /* Reset CFGR register */

  RCC->CFGR = 0x00000000;

 

  /* Reset HSEON, CSSON and PLLON bits */

  RCC->CR &= (uint32_t)0xFEF6FFFF;

 

  /* Reset PLLCFGR register */

  RCC->PLLCFGR = 0x24003010;

 

  /* Reset HSEBYP bit */

  RCC->CR &= (uint32_t)0xFFFBFFFF;

 

  /* Disable all interrupts */

  RCC->CIR = 0x00000000;

 

#if defined(DATA_IN_ExtSRAM) || defined(DATA_IN_ExtSDRAM)

  SystemInit_ExtMemCtl(); 

#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */

         

  /* 配置系统时钟 ----------------------------------*/

  SetSysClock();

 

  /* Configure the Vector Table location add offset address ------------------*/

#ifdef VECT_TAB_SRAM

  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */

#else

  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */

#endif

}

在SystemInit中会配置系统时钟


配置系统时钟的代码如下



下面是CMSIS Cortex-M4设备外围设备访问层系统源文件中的设置系统时钟函数SetSysClock(void)


static void SetSysClock(void)

{

 

/******************************************************************************/

/*            使用HSE作为PLL的输入来配置系统时钟                                */

/******************************************************************************/

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  

  /* 一、使能HSE */

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

 

  /* 等待HSE使能稳定,如果时间超时,则跳出 */

  do

  {

    HSEStatus = RCC->CR & RCC_CR_HSERDY;

    StartUpCounter++;

  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

 

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)

  {

    HSEStatus = (uint32_t)0x01;

  }

  else

  {

    HSEStatus = (uint32_t)0x00;

  }

/*二、HSE稳定后,开始配置HCLK、PCLK2、PCLK1、PLL各自的预分频因子与倍频因子 */

  if (HSEStatus == (uint32_t)0x01)

  {



/* 配置HCLK为1分频,即HCLK = 系统时钟 HCLK = SYSCLK / 1 */

RCC->CFGR |= RCC_CFGR_HPRE_DIV1;

    

/*配置APB2总线时钟为2分频  PCLK2 = HCLK / 2 */

RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;


/*配置APB1总线时钟为4分频PCLK1 = HCLK / 4 */

RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;

   

/* 配置主PLL */

RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |

(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

   

    /* 三、使能主PLL */

    RCC->CR |= RCC_CR_PLLON;

 

    /*等待主PLL稳定 */

    while((RCC->CR & RCC_CR_PLLRDY) == 0)

    {

    }

/*------------------------------------------------------------------------------------------*/    

/* 使能Over-drive 模式来达到更高的时钟频率 */

PWR->CR |= PWR_CR_ODEN;

while((PWR->CSR & PWR_CSR_ODRDY) == 0)        //判断Over-drive模式是否已经成功启动

{

}

PWR->CR |= PWR_CR_ODSWEN;

while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)

{

}      

/*选择FLASH预取指缓存的模式, 指令缓存, 数据缓存和等待缓存 */

FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;

/*------------------------------------------------------------------------------------------*/


    /* 四、选择主PLL作为系统时钟源 */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

    RCC->CFGR |= RCC_CFGR_SW_PLL;

 

    /*判断系统时钟是否已经稳定 */

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);

    {

    }

  }

  else

  { /* 如果HSE启动失败,那么时钟就会被错误的配置,用户可以在这里添加一些代码来处理错误 */

  }

 

}

系统时钟配置主要就是以上部分,系统时钟初始化就进行的是上述操作.


 


二、其它时钟


A、RTC时钟



RTCCLK 时钟源可以是 HSE 1 MHz( HSE 由一个可编程的预分频器分频)、 LSE 或者 LSI 时钟。选择方式是编程 RCC 备份


域控制寄存器 (RCC_BDCR) 中的 RTCSEL[1:0] 位和 RCC时钟配置寄存器 (RCC_CFGR) 中的 RTCPRE[4:0] 位。所做的选择只


能通过复位备份域的方式修改。我们通常的做法是由 LSE 给 RTC提供时钟,大小为 32.768KHZ。LSE由外接的晶体谐振器产生,


所配的谐振电容精度要求高,不然很容易不起震。


B、独立看门狗时钟



独立看门狗时钟由内部的低速时钟 LSI 提供,大小为 32KHZ。


C、I2S 时钟



I2S 时钟可由外部的时钟引脚 I2S_CKIN 输入,也可由专用的 PLLI2SCLK提供,具体的由 RCC 时钟配置寄存器 (RCC_CFGR)的 I2SSCR位配置。


D、PHY以太网时钟



F429要想实现以太网功能,除了有本身内置的 MAC之外,还需要外接一个 PHY 芯片,常见的 PHY 芯片有 DP83848和LAN8720,其中 DP83848支持 MII 和 RMII 接口,LAN8720只支持 RMII 接口。野火 F429 开发板用的是 RMII 接口,选择的PHY 芯片是LAB8720。使用 RMII 接口的好处是使用的 IO 减少了一半,速度还是跟 MII 接口一样。当使用 RMII 接口时,PHY芯片只需输出一路时钟给 MCU 即可,如果是 MII 接口,PHY 芯片则需要提供两路时钟给 MCU。


E、USB PHY 时钟



F429 的 USB 没有集成 PHY,要想实现 USB 高速传输的话,必须外置 USB PHY 芯片,常用的芯片是 USB3300。当外接 USBPHY 芯片时,PHY 芯片需要给 MCU 提供一个时钟。


F、MCO时钟输出



MCO 是 microcontroller clock output 的缩写,是微控制器时钟输出引脚,主要作用是可以对外提供时钟,相当于一个有源晶振。


F429中有两个 MCO,由 PA8/PC9复用所得。MCO1所需的时钟源通过 RCC 时钟配置寄存器 (RCC_CFGR) 中MCO1PRE[2:0]


和MCO1[1:0]位选择。MCO2所需的时钟源通过 RCC 时钟配置寄存器 (RCC_CFGR) 中的MCO2PRE[2:0] 和 MCO2位选择。


以上就是STM32f429的时钟树讲解,理解之后,以此类推,对于学习STM32其它时钟树有很大的帮助。

推荐阅读

史海拾趣

Gang Song Electronics Co Ltd公司的发展小趣事

随着物联网市场的快速发展,Telit作为全球领先的物联网模组和平台提供商,开始寻求通过并购来增强自身在低功耗WiFi技术领域的实力。2017年,Telit宣布收购GainSpan,这一举措不仅丰富了Telit的无线模组产品线,还进一步巩固了其在物联网市场的领先地位。GainSpan的技术与Telit的平台和服务相结合,为客户提供了更加全面的物联网解决方案。

ERP公司的发展小趣事

随着云计算和大数据技术的兴起,电子智链在2010年代初期开始了技术转型。公司投入大量资源研发基于云计算的ERP系统,并在2015年成功推出“云链”系列产品。这一产品迅速受到市场的欢迎,电子智链的客户群迅速扩大,不仅涵盖了中小型企业,还吸引了众多大型电子集团。同时,公司也在国际市场上积极扩张,与多家海外企业建立了合作关系。

Aleph America Corporation公司的发展小趣事

随着云计算和大数据技术的兴起,电子智链在2010年代初期开始了技术转型。公司投入大量资源研发基于云计算的ERP系统,并在2015年成功推出“云链”系列产品。这一产品迅速受到市场的欢迎,电子智链的客户群迅速扩大,不仅涵盖了中小型企业,还吸引了众多大型电子集团。同时,公司也在国际市场上积极扩张,与多家海外企业建立了合作关系。

GETEDZ ( HVGT)公司的发展小趣事
要仔细分析电器设备之间的动作关系,确保联锁逻辑的正确性。
Chiefdom Electronic Co Ltd公司的发展小趣事

面对全球市场的日益开放和竞争,Chiefdom Electronic Co Ltd积极寻求与其他行业巨头的战略合作。通过与全球知名的电子产品制造商、芯片供应商等建立紧密的合作关系,公司不仅获得了更多的技术和市场资源,还进一步提升了自身的品牌影响力和市场份额。这些合作不仅帮助公司拓展了业务领域,还为其在全球电子行业中树立了良好的口碑。

ETAL公司的发展小趣事

随着电子行业的快速发展,ETAL意识到只有不断创新才能在竞争中立于不败之地。因此,公司加大了对研发的投入,积极引进高素质的技术人才和先进的生产设备。经过多年的努力,ETAL成功研发出了具有自主知识产权的一系列高性能电子产品,如高精度传感器、智能控制模块等。这些产品不仅满足了市场的需求,还为公司带来了可观的利润。

问答坊 | AI 解惑

关于定时器延时程序的疑问

大家好,我想针对这个定时器延时程序问几个问题: #define  f   3686400  //系统时钟为3.6864MHz void t0_wait_ms(unsigned char ms) {    TCON &=~ 0x30;    TMOD &=~ 0x0F;   &nbs ...…

查看全部问答>

51单片机C语言教程

这是我在买的一块51板子时,一同附赠的一份资料。我自己觉得还不错,所以就拿出来和大家一起分享一下。希望对大家也能有所帮助………

查看全部问答>

采用UC3854的有源功率因数校正电路工作原理与应用

简介:   本文主要介绍了有源功率因数校正(APFC)的工作原理、电路分类。并对在国内得到广泛应用的UC3854集成电路 的典型应用电路、工作原理做了介绍、分析。…

查看全部问答>

请教信号量定义时是否需要用volatile

多线程之间共享的变量定义时要使用关键字volatile,那么信号量是否定义时也需要用volatile?…

查看全部问答>

GSM模块 短信接收问题

利用CMGR或者CMGL的AT命令读取短信时,经常收到内容之后,OK接收不完整。有时能够收到正常的,有时又无法收到,或只收到部分,导致对其没办法处理。因为我是在收到OK后再进行处理的,谁能够帮我看看是什么方面的原因,谢谢了? 注:我在程序中用过 ...…

查看全部问答>

在主界面弹出一个窗口后,总会把界面的工具栏隐藏掉,有什么方法可以显示出来?哪位仁兄赐教

如题: evc中在主界面弹出一个窗口后,总会把界面的工具栏隐藏掉,有什么方法可以显示出来?哪位仁兄赐教…

查看全部问答>

装机配置但

我这份装机配置单麻烦大虾们指点一二 cpu                 amd Phenom 8650(盒)                    700 ...…

查看全部问答>

收集的一些PID控制方面的资料50M左右,内有目录

目录在此:  还有几个文档一次截图没截完!!! 都是不知道哪搜集的! 发出来供大家参考!       下载在此!!!  (*^__^*) 嘻嘻……  觉得值就下载吧!! 分成4个卷,大家看好啦!   [ 本帖最后 ...…

查看全部问答>

关于DSP上电引导的提问

最近看了两个TI的文档呢。DSP281x_HeaderFiles_QuickStart_Readme和spru095a_TMS320F28x Boot ROM Reference Guide (Rev. A)这两个文档。了解了一下 DSP有了复位信号后,会跳到0x3FFFC0这个地址上去,假设现在是BOOT-ROM映射到0x3FF000这个地址上面 ...…

查看全部问答>

STM8在STVD下debug时候,ST-link一直闪

STM8在STVD下debug时候,ST-link一直闪,这是为什么呢?谢谢高人指教!   之前自己做的demo板没有供电,出现error【30006】chip  is not answer,供电后通信不了,st-link灯一直闪,一两分钟以后就出错了,烧录不了也debug不了。…

查看全部问答>