一,系统时钟选择
1.1时钟源
STM32的时钟源有以下四个:
- 高速外部时钟信号(HSE)—— HSE外部晶体/陶瓷谐振器 、HSE用户外部时钟
- 高速内部时钟信号(HSI)—— 由内部8MHz的RC振荡器产生
- 低速外部时钟信号(LSE)—— 32.768kHz的低速外部晶体或陶瓷谐振器
- 低速内部时钟信号(LSI)—— LSI时钟频率大约40kHz(在30kHz和60kHz之间)
1.2系统时钟时钟源
- 高速内部时钟信号(HSI)
- 高速外部时钟信号(HSE)
- 锁相环时钟(PLL)
1)高速内部时钟(HSI)-- 默认系统时钟
未设置RCC寄存器时,默认时钟为高速内部时钟HSI。
2)高速外部时钟(HSE)-- 常用系统时钟
在原理图中可看到有两个晶振,一个为外部高速时钟HSE(常用),常为8/25MHz;一个为外部低速时钟LSE,常为32.768KHz 。
参考 ---- [https://blog.csdn.net/qq_41069421/article/details/93040572]
使用方法:
① 通过RCC寄存器打开时钟。
RCC:Reset Clock Controller,复位与时钟控制
② 确认HSE晶振频率
方式1:通过单片机上的晶振直接读出,如:D8.000–> 8M
方式2:通过原理图读出,如下图:
③ 设置时钟树
CSS,时钟安全系统 : 监视 HSE振荡器,如果 HSE被直接或间接(PLL)地作为系统时钟,故障时系统时钟自动切换到 HSI振荡器,同时外部 HSE振荡器被关闭。
3)锁相环时钟(PLL)
①功能 :获取稳定且较广频率的时钟(晶振获取更高频率需高成本&精工艺);
②组成及原理 :
参考1 ---- [https://blog.csdn.net/leoufung/article/details/50268031]
参考2 ---- [https://blog.csdn.net/u013754317/article/details/52799516]
- 相位频率比较器PFD(Phase Frequency Detector):对输入的基准信号(来自晶振)和反馈回路的信号进行频率的比较,输出一个代表两者误差的信号;
- 低通滤波器LPF(Low-Pass Filter):将PFD中生成的误差信号转换为直流电压(高频成分滤除,保留直流部分);
- 压控振荡器VCO(Voltage Controlled Oscillator):根据输入电压,输出对应频率的周期信号;
- 反馈回路FL(Feedback Loop):通常由一个分频器实现。将VCO的输出降低到与基准信号相同级别的频率才能在PFD中比较。
③设置时钟树
- STM32中PLL的基准频率来源于HSI除以2或HSE或通过一个可配置分频器的PLL2时钟获得,因此使用相应的时钟源时需先使能。
- 一旦使能了PLL,配置的参数(选择时钟源、预分频系数和倍分频系数等)将不能再被改变。【这点从PLL原理中亦可得知,当基准频率与压控振荡器频率达到一致时相位频率比较器的输出端就会呈高阻态,使PLL(锁相环)被锁栓(Lock)。】
其中第4步已经涉及笔记下文第三大点的确认配置总线
1.3时钟配置常见名词
参考1 ---- [https://www.cnblogs.com/wangh0802PositiveANDupward/archive/2012/12/24/2831535.html]
参考2 ---- [https://zhidao.baidu.com/question/872390823839425172.html]
名称 | 信息 |
---|---|
SYSCLK,系统时钟 | STM32大部分器件的时钟来源 |
HCLK,CPU主频 | 由AHB(系统总线)预分频器直接输出得到,它是高速总线AHB的时钟信号,提供给存储器,DMA及cortex内核,是cortex内核运行的时钟,cpu主频就是这个信号,它的大小与STM32运算速度,数据存取速度密切相关 |
PCLK1,外设时钟 | 由APB1(外设总线)预分频器输出得到,最大频率为36MHz,提供给挂载在APB1总线上的外设 |
FCLK,自由运行的时钟 | 用来采样中断和为调试模块计时。在处理器休眠时,通过FCLK 保证可以采样到中断和跟踪休眠事件。“自由”表现在它不来自时钟 HCLK,因此在HCLK时钟停止时 FCLK 也继续运行。 |
AHB,系统总线 | 主要用于高性能模块(如CPU、DMA和DSP等)之间的连接 |
APB,外围/外设总线 | 主要用于低带宽的周边外设之间的连接 |
二,相关寄存器
RCC:Reset Clock Controller,复位与时钟控制
名称 | 信息 |
---|---|
RCC -> CR ,时钟控制寄存器 | HSI,HSE,CSS,PLL等的使能和就绪标志位 |
RCC -> CFGR,时钟配置寄存器 | 系统时钟的选择和PLLCLK、各总线的配置 |
Flash -> ACR,Flash 存取控制寄存器 | 为了准确读取 Flash 数据,FLASH_ACR中必须根据SYSCLK频率与器件电源电压正确地设置等待周期数(LATENCY) |
配置步骤 :
- 使能需要使用的时钟(RCC -> CR),[注意:使用PLLCLK做系统时钟时钟应在后续配置完毕后使能];
- 判断&等待使能的时钟是否准备就绪(RCC -> CR);
- 配置各总线(AHB、APB…)参数,设置PLL时钟源与PLLCLK倍频数等(RCC -> CFGR);
- 设置FLASH的等待周期(不然程序可能跑飞),如果使用CubeMX配置软件会自动设置,如果手动设置需遵循:
0等待周期,当 0 < SYSCLK < 24MHz ,
1等待周期,当 24MHz < SYSCLK ≤ 48MHz ,
2等待周期,当 48MHz < SYSCLK ≤ 72MHz; - 使能PLLCLK(RCC -> CR),不使用PLLCLK的跳过该步;
- 选择系统时钟源(RCC -> CFGR);
- 判断&等待是否设置成功。
三,确认配置总线
在《STM32F407VET6数据手册》2.2 Device overview(设备概述)中可看到各设备的时钟总线:
以TIM3为例:它是APB1上的 APB1TIMER,其频率由时钟树可得。
(关于具体的取值配比,暂时只能用“经验”来解释。)
当需要TIM3输出10KHz的方波时,频率是84M/(arr+1)(psc+1)=10 kHz
psc:分频系数;arr:重装载值
当频率一定时,根据公式psc取太大arr就会小,而一般调的占空比是调整arr的大小
(可以理解为同一层楼,两条楼梯,楼梯级数多一点你就走得自在点,如果只有几级,你跨得够呛)