[其他ST产品] stm32f103——时钟树的分析与配置(转载记录)

[复制链接]
1421|51
 楼主| 过期的塔头 发表于 2023-1-31 12:19 | 显示全部楼层
什么是系统时钟?它的作用是什么?

实际上,系统时钟就是机器周期(注意:是系统时钟的频率而不是外部晶振的频率),系统时钟为72Mhz ,那么 T = 1/f = 13ns(由1/1M=1us计算可知)。假设执行一条指令需要花费一个机器周期,那么执行一条指令就需要花费13ns的时间。
2907163d896b50a659.png
4882863d896bcc1f22.png
2356163d896c4d1bf9.png
 楼主| 过期的塔头 发表于 2023-1-31 12:20 | 显示全部楼层
系统时钟的另外的作用就是配置各个外设的时钟。由图可知,外设的时钟都是来源于系统时钟。但是,有两个外设的时钟不是来源于系统时钟SYSCLK。即:看门狗和RTC(实时时钟),它俩的时钟来源是来自LSE和LSI。
3718763d8970f17acc.png
为什么要单独提供一个外部时钟给RTC?因为,有些场合需要关机后还能计时,那就需要这个RTC来计时。
 楼主| 过期的塔头 发表于 2023-1-31 12:21 | 显示全部楼层
其他重要部件:
7165063d89762c2254.png
 楼主| 过期的塔头 发表于 2023-1-31 15:46 | 显示全部楼层
PLL(锁相环时钟): 9749263d8c768e7dd2.png
倍频器。其作用就是将输入的时钟频率乘以倍频系数进行倍频。由CFGR(时钟配置寄存器)中PLLMUL控制。

 楼主| 过期的塔头 发表于 2023-1-31 16:05 | 显示全部楼层
来源路径:(三条路径)
154863d8cbdd1cb26.png
HSI (8Mhz)------> HSI/2 (分频器) (4Mhz)------> PLLSRC(二选一选择器)  ------>  PLL

HSE ------> PLLXTPRE(二选一选择器) ------>  PLLSRC(二选一选择器)  ------>  PLL

HSE(8Mhz) ------> HSE/2 (分频器)(4Mhz) ------> PLLXTPRE(二选一选择器) ------>  PLLSRC(二选一选择器)  ------>  PLL

所以,PLL的输入来源,来自HSI或者HSE。

 楼主| 过期的塔头 发表于 2023-1-31 16:06 | 显示全部楼层
一般我们配置系统时钟为72Mhz,所以选择:8 * 9 = 72Mhz。注意:由上图知,系统时钟最大为72Mhz。
9998863d8cc0ecdfde.png
 楼主| 过期的塔头 发表于 2023-1-31 16:07 | 显示全部楼层
9304063d8cc1b3aaca.png
CSS为时钟安全检测标志,因为系统时钟最大为72Mhz,如果我们配置的频率超过72Mhz,那么CSS就会置位,提醒我们时钟已经不安全了。
 楼主| 过期的塔头 发表于 2023-1-31 16:11 | 显示全部楼层
.三选一选择器、AHB总线、APB总线:
4416563d8cd3bd0557.png
2640763d8cd2c9bfce.png
图中SW是三选一选择器,在HSI、PLLCLK、HSE三个中选择其中一个作为系统时钟SYSCLK的频率。
 楼主| 过期的塔头 发表于 2023-1-31 16:18 | 显示全部楼层
AHB Prescaler 是AHB预分频器,即:将输入的频率除以分配系数进行分频。预分频器和分频器不同,分频器的分频系数是固定的,而预分频器的分频系数可以设置。其输出的频率是提供给AHB总线使用的。
 楼主| 过期的塔头 发表于 2023-1-31 16:19 | 显示全部楼层
APB1 Prescaler 是APB1 预分频器。其输出的频率是提供给APB1总线使用的。
6454963d8ceebdec41.png 上图是单片机内部的总线架构。

 楼主| 过期的塔头 发表于 2023-1-31 16:22 | 显示全部楼层
AHB总线是高级高性能总线,其主要用于高性能模块之间的连接。(还有的单片机内部AHB还分为AHB1和AHB2,它俩各自连接不同的外设。)总体而言AHB的速度比APB的速度要高。 4356563d8cfaaca38a.png APB主要用于低带宽的周边外设之间的连接,由图中,我们可以看到APB分为APB1和APB2,它们分别连接着不同的外设。但是,注意:APB1总线的最大速度为36Mhz,而APB2总线的最大速度为72Mhz,所以,APB2总线实际上是高速总线,而APB1总线为低速总线。
 楼主| 过期的塔头 发表于 2023-1-31 16:23 | 显示全部楼层
不同的总线把不同的外设区分开来,可以实现对CPU的最高利用,比如CPU和RAM之间的交互,就需要高速访问。而CPU于定时器等低速设备就不需要那么快的速度,而且速度越快,功耗就越高,所以需要对速度进行区分开来,为了节省功耗。
 楼主| 过期的塔头 发表于 2023-1-31 16:24 | 显示全部楼层
3.USB预分频器:
211163d8d046b9af8.png
USB Prescaler是USB预分频器,其将PLLCLK的时钟来源进行分频,注意:图中显示,USB最大传输时钟为48Mhz,如果配置时钟失败,则USB传输数据就会错误。
 楼主| 过期的塔头 发表于 2023-1-31 16:27 | 显示全部楼层
定时器:
4852263d8d0f7ce7fb.png
定时器的倍频器有一些不同,它的倍频有条件。
 楼主| 过期的塔头 发表于 2023-1-31 16:27 | 显示全部楼层
条件如下:


  1. if(APB1 Prescaler = 1)  


  2.         x1


  3. else


  4.         x2


如果APB1预分频器的分频系数为1,那么定时器倍频器的倍频系数就为1。如果APB1预分频器的分频系数不为1,那么定时器倍频器的倍频系数就为2。
 楼主| 过期的塔头 发表于 2023-1-31 16:29 | 显示全部楼层
所以,假设AHB的频率为72Mhz,那么定时器的最大频率为72Mhz。因为,APB1最大频率为36Mhz,所以,APB1的分频系数


为2 而不为1。所以定时器的倍频系数就是x2,所以36 * 2  = 72Mhz。


面试题:定时器2、3、4、5、6、7的频率最大是多少hz?  答案是:72Mhz
 楼主| 过期的塔头 发表于 2023-1-31 16:30 | 显示全部楼层
4.ADC: 8948563d8d18588774.png ADC模数转换,其频率最大为14Mhz,所以假设APB2的频率为72Mhz,那么72 / 6 = 12Mhz < 14Mhz
 楼主| 过期的塔头 发表于 2023-1-31 16:31 | 显示全部楼层
 楼主| 过期的塔头 发表于 2023-1-31 16:31 | 显示全部楼层
时钟树的配置

步骤:

RCC配置到72MHZ,编程步骤:

        1,打开HSE

        2,等待外部高速时钟稳定且就绪

        3,设置PLL时钟源和倍频系数

        4,使能PLL

        5,等待PLL准备就绪

        6,设置AHB预分频器

        7,设置APB1预分频器

        8,设置APB2预分频器

        9,设置系统时钟

       10,查看系统时钟是否设置正确


 楼主| 过期的塔头 发表于 2023-1-31 16:32 | 显示全部楼层
  1. 代码:


  2. void RCC_ConfigTo72M(void)

  3. {

  4.     //  1,打开HSE  

  5.     RCC_HSEConfig(RCC_HSE_ON);


  6.     // 2,等待外部高速时钟稳定且就绪

  7.    while(SUCCESS!=RCC_WaitForHSEStartUp());


  8.     // 3,设置PLL时钟源和倍频系数   

  9.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


  10.     // 4,使能PLL

  11.     RCC_PLLCmd(ENABLE);


  12.     // 5,等待PLL准备就绪

  13.     while(SET!=RCC_GetFlagStatus(RCC_FLAG_PLLRDY));


  14.     // 6,设置AHB预分频器

  15.     RCC_HCLKConfig( RCC_SYSCLK_Div1);


  16.     // 7,设置APB1预分频器

  17.     RCC_PCLK1Config(RCC_HCLK_Div2);


  18.     // 8,设置APB2预分频器

  19.     RCC_PCLK2Config(RCC_HCLK_Div1);


  20.     // 9,设置系统时钟

  21.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


  22.     // 10,查看系统时钟是否设置正确

  23.     while(0x08!=RCC_GetSYSCLKSource());

  24. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部