打印
[其他ST产品]

stm32f103——时钟树的分析与配置(转载记录)

[复制链接]
楼主: 过期的塔头
手机看帖
扫描二维码
随时随地手机跟帖
21
过期的塔头|  楼主 | 2023-1-31 12:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
什么是系统时钟?它的作用是什么?

实际上,系统时钟就是机器周期(注意:是系统时钟的频率而不是外部晶振的频率),系统时钟为72Mhz ,那么 T = 1/f = 13ns(由1/1M=1us计算可知)。假设执行一条指令需要花费一个机器周期,那么执行一条指令就需要花费13ns的时间。


使用特权

评论回复
22
过期的塔头|  楼主 | 2023-1-31 12:20 | 只看该作者
系统时钟的另外的作用就是配置各个外设的时钟。由图可知,外设的时钟都是来源于系统时钟。但是,有两个外设的时钟不是来源于系统时钟SYSCLK。即:看门狗和RTC(实时时钟),它俩的时钟来源是来自LSE和LSI。

为什么要单独提供一个外部时钟给RTC?因为,有些场合需要关机后还能计时,那就需要这个RTC来计时。

使用特权

评论回复
23
过期的塔头|  楼主 | 2023-1-31 12:21 | 只看该作者
其他重要部件:

使用特权

评论回复
24
过期的塔头|  楼主 | 2023-1-31 15:46 | 只看该作者
PLL(锁相环时钟):
倍频器。其作用就是将输入的时钟频率乘以倍频系数进行倍频。由CFGR(时钟配置寄存器)中PLLMUL控制。

使用特权

评论回复
25
过期的塔头|  楼主 | 2023-1-31 16:05 | 只看该作者
来源路径:(三条路径)

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

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

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

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

使用特权

评论回复
26
过期的塔头|  楼主 | 2023-1-31 16:06 | 只看该作者
一般我们配置系统时钟为72Mhz,所以选择:8 * 9 = 72Mhz。注意:由上图知,系统时钟最大为72Mhz。

使用特权

评论回复
27
过期的塔头|  楼主 | 2023-1-31 16:07 | 只看该作者

CSS为时钟安全检测标志,因为系统时钟最大为72Mhz,如果我们配置的频率超过72Mhz,那么CSS就会置位,提醒我们时钟已经不安全了。

使用特权

评论回复
28
过期的塔头|  楼主 | 2023-1-31 16:11 | 只看该作者
.三选一选择器、AHB总线、APB总线:

图中SW是三选一选择器,在HSI、PLLCLK、HSE三个中选择其中一个作为系统时钟SYSCLK的频率。

使用特权

评论回复
29
过期的塔头|  楼主 | 2023-1-31 16:18 | 只看该作者
AHB Prescaler 是AHB预分频器,即:将输入的频率除以分配系数进行分频。预分频器和分频器不同,分频器的分频系数是固定的,而预分频器的分频系数可以设置。其输出的频率是提供给AHB总线使用的。

使用特权

评论回复
30
过期的塔头|  楼主 | 2023-1-31 16:19 | 只看该作者
APB1 Prescaler 是APB1 预分频器。其输出的频率是提供给APB1总线使用的。
上图是单片机内部的总线架构。

使用特权

评论回复
31
过期的塔头|  楼主 | 2023-1-31 16:22 | 只看该作者
AHB总线是高级高性能总线,其主要用于高性能模块之间的连接。(还有的单片机内部AHB还分为AHB1和AHB2,它俩各自连接不同的外设。)总体而言AHB的速度比APB的速度要高。 APB主要用于低带宽的周边外设之间的连接,由图中,我们可以看到APB分为APB1和APB2,它们分别连接着不同的外设。但是,注意:APB1总线的最大速度为36Mhz,而APB2总线的最大速度为72Mhz,所以,APB2总线实际上是高速总线,而APB1总线为低速总线。

使用特权

评论回复
32
过期的塔头|  楼主 | 2023-1-31 16:23 | 只看该作者
不同的总线把不同的外设区分开来,可以实现对CPU的最高利用,比如CPU和RAM之间的交互,就需要高速访问。而CPU于定时器等低速设备就不需要那么快的速度,而且速度越快,功耗就越高,所以需要对速度进行区分开来,为了节省功耗。

使用特权

评论回复
33
过期的塔头|  楼主 | 2023-1-31 16:24 | 只看该作者
3.USB预分频器:

USB Prescaler是USB预分频器,其将PLLCLK的时钟来源进行分频,注意:图中显示,USB最大传输时钟为48Mhz,如果配置时钟失败,则USB传输数据就会错误。

使用特权

评论回复
34
过期的塔头|  楼主 | 2023-1-31 16:27 | 只看该作者
定时器:

定时器的倍频器有一些不同,它的倍频有条件。

使用特权

评论回复
35
过期的塔头|  楼主 | 2023-1-31 16:27 | 只看该作者
条件如下:


if(APB1 Prescaler = 1)  


        x1


else


        x2


如果APB1预分频器的分频系数为1,那么定时器倍频器的倍频系数就为1。如果APB1预分频器的分频系数不为1,那么定时器倍频器的倍频系数就为2。

使用特权

评论回复
36
过期的塔头|  楼主 | 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

使用特权

评论回复
37
过期的塔头|  楼主 | 2023-1-31 16:30 | 只看该作者
4.ADC: ADC模数转换,其频率最大为14Mhz,所以假设APB2的频率为72Mhz,那么72 / 6 = 12Mhz < 14Mhz

使用特权

评论回复
38
过期的塔头|  楼主 | 2023-1-31 16:31 | 只看该作者

使用特权

评论回复
39
过期的塔头|  楼主 | 2023-1-31 16:31 | 只看该作者
时钟树的配置

步骤:

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

        1,打开HSE

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

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

        4,使能PLL

        5,等待PLL准备就绪

        6,设置AHB预分频器

        7,设置APB1预分频器

        8,设置APB2预分频器

        9,设置系统时钟

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


使用特权

评论回复
40
过期的塔头|  楼主 | 2023-1-31 16:32 | 只看该作者
代码:


void RCC_ConfigTo72M(void)

{

    //  1,打开HSE  

    RCC_HSEConfig(RCC_HSE_ON);


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

   while(SUCCESS!=RCC_WaitForHSEStartUp());


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

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


    // 4,使能PLL

    RCC_PLLCmd(ENABLE);


    // 5,等待PLL准备就绪

    while(SET!=RCC_GetFlagStatus(RCC_FLAG_PLLRDY));


    // 6,设置AHB预分频器

    RCC_HCLKConfig( RCC_SYSCLK_Div1);


    // 7,设置APB1预分频器

    RCC_PCLK1Config(RCC_HCLK_Div2);


    // 8,设置APB2预分频器

    RCC_PCLK2Config(RCC_HCLK_Div1);


    // 9,设置系统时钟

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


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

    while(0x08!=RCC_GetSYSCLKSource());

}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则