从STM32开始的RoboMaster生活:进阶篇 V [Clock Tree]
本文已经同步发布于作者部署的私人博客为了更好的排版和观看体验
可以移步到 从STM32开始的RoboMaster生活:进阶篇 V
## 从STM32开始的RoboMaster生活:进阶篇 V
## 1.0 什么是Clock Tree?
### 1.1 定义
> 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。**时钟系统就是CPU的心脏**,决定CPU速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。
>
> STM32本身十分复杂,外设非常多但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费 并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。所以便有了STM32的时钟系统和时钟树。
>
> 1. STM32时钟系统主要的目的就是给相对独立的外设模块提供时钟,也是为了**降低整个芯片的耗能**。
> 2. 系统时钟,是处理器运行时间基准(每一条机器指令一个时钟周期)
> 3. 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。
> 4. 一个单片机内提供多个不同的系统时钟,可以适应更多的应用场合。
> 5. 不同的功能模块会有不同的时钟上限,因此提供不同的时钟,也能在一个单片机内放置更多的功能模块。
> 6. 对不同模块的时钟增加开启和关闭功能,可以降低单片机的功耗
> 7. STM32为了低功耗,他将所有的外设时钟都设置为disable(不使能),用到什么外设,只要打开对应外设的时钟就可以, 其他的没用到的可以还是disable(不使能),这样耗能就会减少。这就是为什么不管你配置什么功能都需要先打开对应的时钟的原因。
### 1.2 解析
!(https://i.loli.net/2020/03/19/jq3UoHD2Jn4hbWA.png)
先不要被吓到,我们慢慢来一条线一条线地梳理清楚。
除了时钟,有两个概念必须提前讲解
!(https://i.loli.net/2020/03/19/ELGc2FiOAHbrfMy.png)
- **Phase-Locked Loop ( PLL )** :锁相环 的作用是整数倍地增高频率
- **Prescaler**:预分频器 的作用是整数倍地降低频率
在STM32F4系列中,有5个最重要的时钟源,为HSI、HSE、LSI、LSE、PLL。其中PLL实际是分为三个时钟源,分别为主PLL和I2S部分专用PLLI2S和SAI部分专用PLLSAI。从时钟频率来分可以分为高速时钟源和低速时钟源,在这5个中HSI,HSE以及PLL是高速时钟,LSI和LSE是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中HSE和LSE是外部时钟源,其他的是内部时钟源。
- **❶ LSI**:Low Speed Internal 低速内部时钟,RC振荡器,频率为32kHz左右,供独立看门狗和自动唤醒单元使用
- **❷ LSE**:Low Speed External 低速外部时钟,接频率为32.768kHz的石英晶体,这个主要是RTC的时钟源
- **❸ HSE**:High Speed External 高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz,HSE也可以直接做为系统时钟或者PLL输入
- **❹ HSI**:High Speed Internal 高速内部时钟,RC振荡器,频率为16MHz,可以直接作为系统时钟或者用作PLL输入
- **❺ PLL**:Phase-Locked Loop 锁相环倍频输出,STM32F4有三个PLL
1. **主PLL**由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟,第一个输出PLLP用于生成高速的系统时钟(最高180MHz);第二个输出PLLQ为48M时钟,用于USB OTG FS时钟,随机数发生器的时钟,和SDIO时钟
2. 第一个专用PLL ( **PLLI2S** ) 用于生成精确时钟,在I2S和SAI1上实现高品质音频性能,其中,N是用于PLLI2S vco的倍频系数,其取值范围是:192\~432;R是I2S时钟的分频系数,其取值范围是:2\~7;Q是SAI时钟分频系数,其取值范围是:2\~15;P没用到
3. 第二个专用PLL ( **PLLSAI** ) 同样用于生成精确时钟,用于SAI1输入时钟,同时还为LCD_TFT接口提供精确时钟,其中,N是用于PLLSAI vco的倍频系数,其取值范围是:192\~432;Q是SAI时钟分频系数,其取值范围是:2\~15;R是LTDC时钟的分频系数,其取值范围是:2\~7;P没用到
- **A 看门狗时钟**:看门狗时钟源只能是低速的 LSI 时钟
- **B RTC时钟源**:RTC的时钟源可以选择LSI,LSE,以及HSE分频后的时钟,HSE 分频系数为2\~31
- **C MCO1 MCO2输出时钟**:MCO1是向芯片的PA8引脚输出时钟,它有四个时钟来源分别为:HSI,LSE,HSE,和PLL时钟;MCO2是向芯片的PC9输出时钟,它同样有四个时钟来源分别为:HSE,PLL,SYSCLK以及PLLI2S时钟;MCO输出时钟频率最大不超过100MHz
- **D 系统时钟**:SYSCLK系统时钟来源有三个方面:HSI,HSE,和PLL,在我们实际应用中,因为对时钟速度要求都比较高我们才会选用STM32F4这种高性能处理器,所以一般情况下,都是采用PLL作为SYSCLK时钟源
- **E 以太网PTP时钟 AHB时钟 APB2高速时钟 APB1低速时钟**:这些时钟都是来源于 SYSCLK系统时钟,其中以太网PTP时钟是使用系统时钟,AHB,APB2,和APB1时钟是经过SYSCLK时钟分频得来,这里大家记住,AHB最大时钟为168MHz,APB2高速时钟最大频率为84MHz,而APB1低速时钟最大频率为42MHz
- **F PLLI2S_R时钟**:可以作为I2S时钟源
- **G PLLI2S_Q时钟**:可以作为SAI1_A和SAI1_B时钟来源
- **H PLLSAI_Q时钟**:可以作为SAI1_A和SAI1_B时钟来源
- **I PLLSAI_R时钟**:LCD-TFT ( LTDC ) 接口时钟唯一来源
- **J 以太网MAC时钟**:对于MII接口来说,必须向外部PHY芯片提供25Mhz的时钟,这个时钟,可以由PHY芯片外接晶振,或者使用STM32F4的MCO输出来提供,然后,PHY芯片再给STM32F4提供ETH_MII_TX_CLK和ETH_MII_RX_CLK时钟,对于RMII 接口来说,外部必须提供50Mhz的时钟驱动PHY和STM32F4的 ETH_RMII_REF_CLK,这个 50Mhz时钟可以来自 PHY,有源晶振,或者STM32F4的MCO
- **K USB OTG HS时钟**:指外部PHY提供的USB OTG HS ( 60MHZ ) 时钟
## 2.0 如何配置Clock Tree?
- 配置方式
- **STM32CubeMX**静态调控
- 函数动态调控(RM暂时用不上,这部分不讲解)
- **STM32CubeMX**
- **PLL Source Mux**选择HSE,因为HSE比HSI的精确性和最大频率高得多
- **System Clock Mux**选择PLLCLK,因为即便选择HSE,频率依然不足,而PLLCLK可以成倍增加频率
- 最后,在**Ethernet PTP clock**那里,输入168,回车,STM32CubeMX会自动配置剩下的东西,到这一步,iRM2018的Clock Tree就已经配置完成了!
如果你成功了,将会看到下面这个配置
!(https://i.loli.net/2020/03/19/Jt8nEB7XNkK4ljf.jpg)
本文已经同步发布于作者部署的私人博客
为了更好的排版和观看体验
可以移步到 从STM32开始的RoboMaster生活:进阶篇 V
如果诸位看官喜欢的话,想让这个系列继续下去的话,就请在下方留言吧~
我很好奇支持Arduino IDE编程STM32和普通的STM32有没有区别,没区别的话可以省去很多时间啊 帅猫 发表于 2020-3-19 21:44
我很好奇支持Arduino IDE编程STM32和普通的STM32有没有区别,没区别的话可以省去很多时间啊 ...
其实道理很简单,还是拿入门篇的那个例子,“请问建造帝国大厦,是用乐高?还是钢筋水泥?”。而用Arduino IDE来开发STM32,的确似乎是既能坐拥STM32的高性能,又能像开发Arduino一样简单。但是,其实,实际上,是两个都没有届到(届不到的爱恋~~(X))。真实情况是,只不过是把制作乐高的材料从塑料变成了水泥,强度是提高了,似乎离帝国大厦进了一步。但是,阻碍用乐高的方式(Arduino IDE)建造帝国大厦的,不是乐高的材料,就算用振金做,你也建不成帝国大厦。因为,究其根本原因,是因为乐高这种建造模式根本简化了太多的细节,导致了“失真效应”。你想想,乐高造大厦会考虑防火吗?能铺电线吗?隔音呢?反地震呢?反雷击呢?采光呢?老化呢?环保呢?透气呢?更精细的双电梯设计呢?可以说,就是因为乐高简化了考虑的细节,所以高效,但也正是因为如此,所以没用。细节不仅仅决定成败,在工程领域更是精湛技艺和独到匠心的体现,很多时候是必须且必要的。Arduino为了迎合电子爱好者,决定抛弃细节,就决定了其绝对无法进入工程领域的身份。但是,换个角度,说白了,如果本身就只是电子爱好者,Arduino就是最佳选择,而工程师,是没法选则Arduino,不是因为我们不想,谁都想简单点,但是Arduino就是无论如何都没法达到我们想要的效果。我拿个实际的例子,做六足恐怖机器人的时候,我就发现,Arduino虽然可以我自己设计手写个中断程序,但是一旦需要中断的程序多了,就需要分优先级,就需要多线程,就需要像FreeRTOS这样的实时操作系统,像这种操作,反倒STM32实现起来非常简单,而Arduino做起来非常难搞。 帅猫 发表于 2020-3-19 21:44
我很好奇支持Arduino IDE编程STM32和普通的STM32有没有区别,没区别的话可以省去很多时间啊 ...
简单来说,借用Linux领域非常著名的一句话:若无力驾驭,自由便是负担。反过来说,只有有能力驾驭的人,才配也才能拥有自由。用过STM32就知道,Arduino才是工程师的枷锁,很多复杂的东西都做不到,STM32才是自由。正因为复杂,所以才自由,正因为自由,所以才复杂。从古至今,无论是工程领域,还是对于人类本身来说,真正的自由从来都不是简单的享乐的东西,而是常人所难以容忍的负担与责任,甚至是苦难。这就是世间唯一永恒不变的真理,过去是这样,现在是这样,未来也一定是这样的唯一真理。 帅猫 发表于 2020-3-19 21:44
我很好奇支持Arduino IDE编程STM32和普通的STM32有没有区别,没区别的话可以省去很多时间啊 ...
从Windows到Linux,从Lego到钢筋水泥,从Arduino到STM32。一代又一代工程师,无论是网络工程师与软件工程师(和黑客),建筑工程师,还是计算机工程师,都做出了同样的选择。甚至在以上都不好用的情况下,自己从零设计新的轮子。可以说人类的进步,科技的进步,都是在这种对真正自由的追求与赫拉克勒斯的十二试炼般的苦难中,一步一步走出来的。 帅猫 发表于 2020-3-19 21:44
我很好奇支持Arduino IDE编程STM32和普通的STM32有没有区别,没区别的话可以省去很多时间啊 ...
如果大部分的人还是愿意在熟练掌握了Arduino后依然不愿意接受STM32,或者投机取巧,用Arduino IDE开发STM32这种即没Arduino便利,又限制STM32潜力的方式开发。那我只能说:世界上有很多生活方式,我只是选择了自由。 顶了
页:
[1]