十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

嵌入式铁头山羊stm32-时钟树和时钟树编程(配置想要的默认初始时钟频率)-Day20

嵌入式铁头山羊stm32-时钟树和时钟树编程(配置想要的默认初始时钟频率)-Day20 嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门点击传送目录一、时钟树1.时钟和时钟树的概念2.分频器、锁相环和复用器3.树根四种4.树干5.树枝6.练习二、时钟树编程1.时钟树的初始状态代码测试2.标准库的启动代码​3.时钟树的编程接口​4.配置时钟树使用代码去配置自己想要的时钟树即时钟信号的频率由自己配置5.配置Flash指令预取6.片上外设开关和复位一、时钟树1.时钟和时钟树的概念时钟”Clock主要指的是提供给整个芯片或者其中某个模块运行的基准频率信号。这个时钟信号类似一个“节拍器”所有指令执行、外设工作、总线传输都依赖它来“按节奏”进行。注意这个时钟频率的快慢也导致了他所支持的外设的执行快慢。---简单来说这个时钟是单片机的心脏每个外设想要启动先得启动这个外设对应的时钟时钟树单片机这里分为两颗树一颗大树高速树一颗小树低速树我们主要是看大树这里首先其树根类似于左图的心跳这块即产生时钟信号的。接着树干这里是经过前面的梯形表示的复用器去复用时钟信号既而得到系统时钟SYSCLK。然后就是到分支了。即有树干产生了三个分支每个分支上的叶子就代表一个片上外设。什么是“时钟树”时钟树就是 MCU 内部时钟分配的结构图。MCU 里不止一个时钟源内部的 HSI、外部的 HSE、PLL 倍频后的时钟等等。不同的模块CPU 内核、外设、总线、定时器、ADC 等需要不一样的时钟。为了把一个或几个“总时钟源”分配给这么多模块MCU 内部就设计了一个“分发网络”它看起来像一棵树——根在底下时钟源树枝不断分叉分频、倍频、选择树叶就是外设。所以叫时钟树。形象比喻把 MCU 里的时钟源HSI/HSE/PLL想象成水厂。分频器 / 倍频器就是水管阀门可以调整水流大小。不同的外设CPU、总线、UART、SPI…就是城市里的用水户。时钟树就是一张“供水管网图”告诉你水时钟信号怎么从源头分到各个用户。为什么要搞“时钟树”灵活性不同外设需要的速度不同比如 USART 可能只要几十 MHzCPU 可能要 100 MHz。省电可以关闭不需要的时钟支路减少功耗。稳定性外设之间互不干扰每个外设有自己的“水管”。2.分频器、锁相环和复用器3.树根四种树根这里分为四种即内外接、高低速的时钟源注意根据时钟源的不同将两树分为高速树和低速树。注意为啥单片机有高低速的时钟源都有还要接外部的因为内部的一般精度要求不高所以想精度上有要求的话就得外接。4.树干主要就剩复用器这里的三种路径罢了5.树枝经过AHB总线得到的三大分支6.练习二、时钟树编程1.时钟树的初始状态初始的所有分频器后都产生的是8MHz注意这里涉及到启动文件的细节后面会讲其实默认情况是72MHz代码测试这里使用代码进行测试是否初始是8MHz判断之前的延迟使用的是delay函数这里使用for循环假设一个for循环消耗10个时钟周期那要延迟500ms就是400000次循环。这里注意1/f是一个时钟周期所以会乘10代表一次for循环对应的时间。按照上面的想法去运行发现一次闪烁即一次亮灭很快闪烁的非常快说明有问题看下面继续讲2.标准库的启动代码在启动文件里面发现这句话即在main函数执行前都会先执行SystemInit主要帮助用户选择最高频率。既而就表示你默认的是72MHz所以会闪烁的很快这里尝试注释这两行汇编语言使用封号注释然后再运行观察发现效果好多了但是还是有点快这个问题出现在一开始的假设一个for循环为10个时钟周期因为不同设备时钟周期不一样这里比如一个for循环是6个时钟周期等等发现闪烁正常实现了。3.时钟树的编程接口举个图中的例子锁相环第一个参数是复用器选择的传入信号第二个是选择是*6或者乘多少即参数1 为源头参数2为倍频系数4.配置时钟树使用代码去配置自己想要的时钟树即时钟信号的频率由自己配置这里当注释掉一开使的SystemInit后默认就是直接走main直接为8MHz。所以这里尝试使用代码去配置想要的时钟树这里尝试将默认的8MHz配置为72MHz的时钟树。使用前面的编程接口 。注意顺序一定是1.先选择输入信号为HSE即开始HSE因为开启要时间所以还要判断标志位2.之后配置索相环配置输入的信号和乘以的系数即源头和倍频系数3.之后先配置分频系数4.最后配置复用器为HSE5.(增加“指令预取”的操作这个后面讲了)Q为啥要先设置分配器再切换源头#3设置分频器 就是先规定好「CPU、外设们最多能跑多快」。比如CPU 72 MHzAPB1 ≤ 36 MHzAPB2 ≤ 72 MHz#4切换 SYSCLK 就是把 MCU 的真正工作时钟切换到你配置好的 PLL。⚠️ 如果你先执行 #4切时钟再去执行 #3分频在那一瞬间所有总线和外设会直接吃到未分频的高频时钟可能超过它们的极限。结果就是外设异常、死机、复位。所以 ST 官方手册里要求✅ 必须先设置分频器 (#3)确保“护栏”立好 → 再切换 SYSCLK (#4)这样就不会超频。一句话总结分频器相当于「限速器」要先设好限速再让车跑起来如果先让车跑起来切 SYSCLK再设限速就有可能瞬间超速出事。5.配置Flash指令预取当你配置了72MHz的时钟树后就需要配置指令预取这是因为本来cpu只是简单的8MHz的话自己没延迟因为小于24MHz但是当你指定配置了72MHz的频率树太快了所以就需要配置这个《预取功能》了专业解释CPU 执行指令的速度 vs Flash 读出的速度STM32 的代码存放在Flash片上程序存储器里。当 CPU 时钟频率很高比如 72 MHz时Flash 的读取速度跟不上 CPU 的取指速度。如果 CPU 每个周期都要等 Flash 慢吞吞地把指令拿出来性能就会大幅下降。预取缓冲的作用Prefetch Buffer就是一个小缓存它会提前把后面可能要用的指令读到缓冲区里。这样 CPU 要用的时候就能直接取减少等待。为什么在配置时钟树时要开预取一旦系统切换到高频率运行Flash 不开预取就会变成瓶颈。所以在切换 SYSCLK 到 PLL 高速运行之前要配置开启指令预取设置 Flash 等待周期LATENCY确保读取稳定。通俗解释小白版想象 MCU 一个学生CPU 写作业的手Flash 铅笔盒里拿铅笔如果 CPU 写字速度很慢低频每次从铅笔盒里慢慢拿笔不会影响。但当 CPU 写字特别快高频它每次都要等你打开铅笔盒 → 卡顿 → 写不下去。解决办法在桌上先摆一排备用的笔 预取缓冲。CPU 要写字时直接从桌子上拿笔就行不用等铅笔盒。这样CPU 即使跑得飞快拿笔取指令的速度也能跟上。总结一句话配置时钟树后 MCU 可能跑到几十 MHz 甚至上百 MHzFlash 太慢跟不上 CPU。所以要开启预取功能提前把指令准备好避免 CPU 卡住等 Flash。6.片上外设开关和复位这里面没有说明白其实就是复位按钮的实现是需要写两句话的一句是按下按钮一句是抬起。
返回列表