当前位置: 首页 > news >正文

嵌入式-时钟树和时钟树编程-Day20

一、时钟树

1.时钟和时钟树的概念

时钟”(Clock),主要指的是提供给整个芯片(或者其中某个模块)运行的基准频率信号。这个时钟信号类似一个“节拍器”,所有指令执行、外设工作、总线传输都依赖它来“按节奏”进行。注意:这个时钟频率的快慢,也导致了他所支持的外设的执行快慢。

---简单来说,这个时钟是单片机的心脏,每个外设想要启动,先得启动这个外设对应的时钟

时钟树,单片机这里分为两颗树,一颗大树(高速树),一颗小树(低速树),主要是大树这里,树根类似于左图的心跳这,即产生时钟信号的。

接着,树干这里经过前面的复用器得到系统时钟。

然后就是有每个分支,每个分支上的叶子,就代表一个片上外设。


2.分频器、锁相环和复用器


3.树根(四种)

树根这里分为四种,即内外接、高低速的时钟源,根据时钟源的不同,将两树分为高速树和低速树。

注意:为啥单片机有高低速的时钟源都有还要接外部的,因为内部的一般精度要求不高,一高的化就得外接。

4.树干

5.树枝

6.练习

二、时钟树编程

1.时钟树的初始状态

初始的所有分频器后都是8MHz

代码测试:

这里使用代码进行测试是否初始是8MHz

判断:之前的延迟使用的是delay函数这里使用for循环,假设一个for循环消耗10个时钟周期,那要延迟500ms就是400000次循环。这里注意1/f是一个时钟周期,所以会乘10代表一次for循环对应的时间。

按照上面的想法去运行发现一次闪烁,即一次亮灭很快,闪烁的非常快,说明有问题,看下面继续讲


2.标准库的启动代码

在启动文件里面发现这句话,即在main函数执行前都会先执行SystemInit,主要帮助用户选择最高频率。既而就表示你默认的是72MHz,所以会闪烁的很快

这里尝试注释这两行汇编语言(使用封号注释),然后再运行观察发现效果好多了,但是还是有点快,

这个问题出现在一开始的假设一个for循环为10个时钟周期(因为不同设备时钟周期不一样),这里比如一个for循环是6个时钟周期等等,发现闪烁正常实现了。


3.时钟树的编程接口

举个图中的例子,锁相环,第一个参数是复用器选择的传入信号,第二个是选择是*6或者乘多少


4.配置时钟树(代码实现指定时钟树的配置)

这里当注释掉一开使的SystemInit后,默认就是直接走main,直接为8MHz。

所以这里尝试使用代码去配置想要的时钟树,这里尝试将默认的8MHz配置为72MHz的时钟树。使用前面的编程接口  。


注意顺序一定是:
1.先选择输入信号为HSE,即开始HSE,因为开启要时间,所以还要判断标志位

2.之后配置索相环,配置输入的信号和乘以的系数,即源头和倍频系数

3.之后先配置分频系数

4.最后配置复用器为HSE

5.(增加指令预取下一节)

Q为啥要先设置分配器再切换源头

  • #3:设置分频器
    👉 就是先规定好「CPU、外设们最多能跑多快」。
    (比如:CPU = 72 MHz,APB1 ≤ 36 MHz,APB2 ≤ 72 MHz)

  • #4:切换 SYSCLK
    👉 就是把 MCU 的真正工作时钟切换到你配置好的 PLL。


⚠️ 如果你先执行 #4(切时钟),再去执行 #3(分频):

  • 在那一瞬间,所有总线和外设会直接吃到 未分频的高频时钟,可能超过它们的极限。

  • 结果就是 外设异常、死机、复位

所以 ST 官方手册里要求:
✅ 必须 先设置分频器 (#3),确保“护栏”立好 → 再切换 SYSCLK (#4),这样就不会超频。


📌 一句话总结
分频器相当于「限速器」,要先设好限速,再让车跑起来;
如果先让车跑起来(切 SYSCLK),再设限速,就有可能瞬间超速出事。


5.配置Flash指令预取

当你配置了72MHz的时钟树后就需要配置指令预取,这是因为

专业解释

  1. CPU 执行指令的速度 vs Flash 读出的速度

    • STM32 的代码存放在 Flash(片上程序存储器)里。

    • 当 CPU 时钟频率很高(比如 72 MHz)时,Flash 的读取速度跟不上 CPU 的取指速度

    • 如果 CPU 每个周期都要等 Flash 慢吞吞地把指令拿出来,性能就会大幅下降。

  2. 预取缓冲的作用

    • Prefetch Buffer 就是一个小缓存:它会提前把后面可能要用的指令读到缓冲区里。

    • 这样 CPU 要用的时候就能直接取,减少等待。

  3. 为什么在配置时钟树时要开预取?

    • 一旦系统切换到高频率运行,Flash 不开预取就会变成瓶颈

    • 所以在切换 SYSCLK 到 PLL 高速运行之前,要配置:

      • 开启指令预取

      • 设置 Flash 等待周期(LATENCY),确保读取稳定。


通俗解释(小白版)

想象 MCU = 一个学生,

  • CPU = 写作业的手

  • Flash = 铅笔盒里拿铅笔

如果 CPU 写字速度很慢(低频),每次从铅笔盒里慢慢拿笔,不会影响。
但当 CPU 写字特别快(高频),它每次都要等你打开铅笔盒 → 卡顿 → 写不下去。

解决办法

  • 在桌上先摆一排备用的笔(= 预取缓冲)。

  • CPU 要写字时,直接从桌子上拿笔就行,不用等铅笔盒。

这样,CPU 即使跑得飞快,拿笔(取指令)的速度也能跟上。


总结一句话
配置时钟树后 MCU 可能跑到几十 MHz 甚至上百 MHz,Flash 太慢跟不上 CPU。
所以要开启预取功能,提前把指令准备好,避免 CPU 卡住等 Flash。

6.片上外设开关和复位

http://www.dtcms.com/a/346473.html

相关文章:

  • 大宗商品、股票指数及ETF期权五档买卖分时tick级历史交易数据深度解析
  • zynq的vitis工程烧录到Winbond(华邦)型号W25Q256JVEQ的QSPI FLAHS
  • 2025最新版mgg格式转MP3,mflac转mp3,mgg格式如何转mp3?
  • FastText 词向量全景指南(没那么全)
  • 【论文】Zotero文献管理
  • [e3nn] docs | 不可约表示(Irreps)
  • AI 大模型 “进化史”:从参数竞赛到场景落地,技术突破藏着哪些逻辑?
  • C#_异步编程范式
  • kvcache比赛记录
  • JavaScript Object 操作方法及 API
  • GEO优化专家孟庆涛发布:《GEO内容优化的四大黄金标准》
  • 20250822 组题总结
  • 车辆方向数据集 - 物体检测
  • 深度学习:入门简介
  • 本地部署DeepSeek实战
  • 工作后的总结和反思1
  • Huggingface入门实践 Audio-NLP 语音-文字模型调用(一)
  • FPGA 在情绪识别领域的护理应用(四)
  • 【电子通识】芯片生产考验“三重门”之CP、FT与WAT测试
  • Excel表格指定数据读取写入到另一个Excel表中(指定列指定行)
  • 使用配置文件恢复开启Telnet端口(IndivKey方式)
  • 20250822给荣品RD-RK3588开发板刷Rockchip原厂的Android14时点亮荣品的8寸屏
  • 情绪感知+低延迟,声网语音在实战里太稳了
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析八
  • Mixture of Experts Guided by Gaussian Splatters Matters
  • Python 调用 sora_image模型 API 实现图片生成与垫图
  • 判断一个字母是 ​大写字母​ 还是 ​小写字母
  • [RestGPT] OpenAPI规范(OAS)
  • 容器安全实践(一):概念篇 - 从“想当然”到“真相”
  • Go语言延迟初始化(Lazy Initialization)最佳实践指南