时钟树 关于时钟树,我个人认为对于新手来说有些复杂了,但几乎用不到其中的很多功能,这里我就懒得贴出完整的时钟树图片了,我们只需要了解下面几个知识点: 每个芯片都有一个自己的最大频率,这是一个芯片的固有属性,这个最大频率代表着这颗芯片处理能力的速度上限,比如STM32F407一般是168MHz。我们可以通过不同的方案配制出这个最大频率(没有人愿意自己的芯片降频使用吧)。最最最常用的方式就是使用外部晶振提供一个基础的频率,然后在这个频率上进行加工,最终得到一个168MHz的时钟出来。给系统提供基础频率的外部晶振,一般是MHz级别的,我们称之为高速外部晶振(HSE),这里我们开发板上配置的是一颗8MHz的晶振。此外如果系统需要用到RTC时钟,还需要一个低速外部晶振(LSE),一般是额定频率32.768KHz,这是后话,此处不表。从8MHz的HSE提高变成168MHz最大频率的过程,我们叫做「倍频」,相反从一个高速频率降成低速频率的过程,称之为「分频」。STM32F4内部通过锁相环进行倍频,其原理我没高兴去了解,我们知道有一种叫锁相环的东西可以倍频就行。倍频时涉及到三个常量需要定义,分别是:PLL_M, PLL_N, PLL_P,最终得到系统频率的公式请牢记:SYSCLOCK = HSE / PPL_M * PPL_N / PPL_P,这个公式对于具体的系统来说,这么用:168MHz = 8MHz / PPL_M * PPL_N / PPL_P,因此一个合理的配置就是:
PPL_M = 8;
PPL_N = 336;
PPL_P = 2;
如果有另一块开发板,系统原理图上标明OSC_IN和OSC_OUT处接的是25MHz晶振,聪明的你一定知道把上面的PPL_M值修改为25就可以了。时钟配置时,还有一个宏定义需要定义:PPL_Q,这个是用来配置USB、SD卡读写时的频率的,计算公式是USBClock = HSE / PPL_M * PPL_N /PLL_Q,一般约定USB时钟频率小于等于48MHz,因此PPL_Q的范围也很好确定,如果项目中没有用到USB和SD卡读写,一般这个宏可以忽略,保持默认值(事实上,默认值是7,336/7=48,刚刚好可以把USB频率设置为48MHz)。
|