STM32时钟树
- 时钟的概念
时钟就是GPIO点亮LED灯那一节的开启APB2的时钟 也是串口配置波特率的时钟
- 时钟树的概念
时钟就是心跳 他的跳动能让每个外设工作起来 时钟是基本 - 分频器 锁相环 复用器

- 树根
也就是时钟 一切外设的核心
有四个时钟源 分为高速外部 高速内部 低速外部 低速内部

为什么 内部有时钟 为什么还有外接时钟呢
内部的时钟精度不高 对精度有要求就外接时钟
接入内部的肯定是高速时钟
- 树干
对从时钟源获取的时钟进行加工 得到一个系统时钟 SYSCLK

具体怎么实现 有哪些路可以得到这个系统时钟

我们追求精度就使用外部高速晶振 追求更高的频率我们就用树干的高速晶振通过倍频得到的高速频率
没有要求就选择内部高速晶振
内部高速晶振固定为8Mhz 外部高速晶振固定为4-16MHz 直接供给时钟 来自锁相环的就是通过他的倍频得到更高频率的时钟
- 树枝
我们从通过从树干获取来的系统时钟 供给APB1 APB2 AHB
首先通过AHB分频器得到HCLK
在分频给APB2 得到PCLK2 再供给GPIOA GPIOB 等等一些基本外设
给PAB1 得到PCLK1 在给一些高级定时器等等一些设备

其中APB1的PCLK1最高频率为36Mhz
其中APB2的PCLK2最高频率为72Mhz
- 时钟的初始化状态

初始化固定默认的8MHz
不使用DELay
- 标准库的启动代码
自制延迟函数
我们知道一个时钟周期为8MHZ分之1,为0.125us for循环为10个时钟周期所以一个FOR循环为1.25us,自制延迟500ms,要循环400000个1.25us得到延迟500ms的功能 500ms/(1/8Mhz*10)
我们发现延迟的状态不是我们所说的那样 因为我们上电之后时钟树·固定帮我们 SYSTINME Init配置成了最高性能的72MHZ 首先会执行 SystemIniti 初始化 所以频率很快
我们要把自动执行的初始化注释掉 这样就是8Mhz的功能去执行我们的main函数
而不是500ms/(1/72Mhz*10)

- 时钟树的编程接口

- 配置时钟树
从当前的内部高速时钟切换到外部高速时钟 目的是为了获得更高的精度
从未初始化的8Mhz到72Mhz通过程序去配置

通过RCC库函数从内部的时钟配置为外部高速时钟在通过锁相环倍频到这个芯片的最大性能

- 配置FLASH指令预取
- 指令预取
我们写的程序通过烧录存在FLASH中 然后cuP从FLash中读取执行程序 因为FLASH读取程序是很慢的供不上cpu读取程序的速度 所以我们会在FLASH与内核中加一个缓冲区
二、指令预取(Prefetch Buffer)是什么?
1. 原理大白话
就是在 Flash 和 CPU 之间加一个高速缓存缓冲区。学霸(CPU)要读下一道题时,缓冲区会提前把后面的几道题(指令)从 Flash 里预存进来,等 CPU 需要时,直接从缓冲区里读,不用再慢吞吞地等 Flash。
- 没开预取:CPU → Flash(慢,每次都要等)
- 开了预取:CPU → 缓冲区(快,提前存好)← Flash(后台慢慢加载)
2. 作用
- 大幅提升程序执行效率,减少 CPU 空转
- 相当于给 Flash 的读取加了个 “流水线”,让 CPU 不用等
- 延迟访问
我们配置的为从内部的未初始化的内部8Mhz的时钟配置为72mhz所以我们要配置FLASH访问延迟 也就是要等待两个周期 下面的表格是为了配置时钟要获取的速度要等待的周期时间


- 总结
这一节课主要就是为了熟悉自己如何配置标准库的时钟 通过内部自带的8Mhz的时钟配置为72Mhz的外部高速时钟 首先选择外部高速时钟 其中有选择锁相环的时钟来源 开启锁相环 设置他的倍频那个然后把分支配置为这个芯片的最大时钟配置
stm公司帮我们把这个通过SYStimIniti准备好了 我们通过关闭自己配置达到他帮我们配置的功能
通过关闭他的配置自制延迟函数实现LED灯的闪烁速度和不关闭对比,发现关闭的使我们想要的 没关闭闪的很快
最后我们通过关闭实现自己配置一系列初始化最后达到和他帮我们初始化的现象一样代表我们配置完成
APB12分频36Mhz
APB21分频72Mhz
AHB 1分频72Mhz
之后就是指令预取 和延迟访问
因为CPU的读取指令很快 所以我们需要开启缓存区提前把数据放在缓冲区让CPu直接读取 从而不会让cpu空转导致浪费资源
延迟访问就是规定要等几个周期flash就把程序准备好了CPU就可以读取了 实现无缝隙衔接
更多推荐

所有评论(0)