声明:本文章不细究原理,只浅薄的讲解如何配置时钟树以及如何使用,如有错误,请及时指出,感谢!
首先,STM32F407ZG配置的最大频率为168MHZ,但实际上,其本身并不能达到168MHZ,而是通过外部晶振的倍频和分频来达到168MHZ。
这里首先引入一个概念----------锁相环。锁相环,简单来说,就是史蒂夫罗杰斯进行了强化,变成了拿着振金盾牌的美国队长,又高又壮又强。频率也是同理,当频率小于设定值时,锁相环就会工作,使它达到预期值,进而输出。(由于篇幅问题,仅概述,感兴趣可以自行了解相关的概念与工作原理)
对于STM32F407而言,它共有五个时钟源,分别是HSE(高速外部振荡器),LSE(低速外部振荡器),HSI(高速内部振荡器),LSI(低速内部振荡器),RTC(时钟源)。RTC时钟源可以使用上述其它四种时钟源分频后的时钟,RTC是一个实时时钟,可以简单理解成32位定时器,断电后数据可以保存,这里不细究。
而在STM32F407中,有许多的时钟线,这里给出时钟树的简图。
截取STM32_CUBE中的时钟树,我们接下来逐一分析。
input frequency,输入频率,即外部晶振,可接受的范围为4-26MHZ,一般设置为8MHZ,值得注意的是,input frequency的值越大,则微控制器处理速度越快,但同时,耗电也会更多。
输入频率通过HSE进入到main PLL(上文所提到的锁相环),在这一步,频率首先分频,以8MHZ为例,其先分频/8,变为1MHZ。接着倍频*336,变为336MHZ。往下走,频率分成两条线路,一条分频/2,变为168MHZ后,进入时钟总线;而另一条分频/4,直接进入单独的48MHZ时钟。
而在开头分频变为1MHZ的频率,如下图所示,进入了PPL,倍频*192,变成192MHZ后,分频/2,变为96MHZ,最后进入I2S时钟。
我们将目光转回时钟总线,在这里,168MHZ沿两条线前进,首先被赋予外部时钟,接着预分频/1,变为168MHZ后,依次赋予给不同的时钟/定时器,到这里,它还会进行不同程度的倍频和分频,相信大家现在已经可以理解了,我就不细讲了。需要注意的是,有些时钟有最大允许值,如APB1 peripheral clocks,该时钟的最大允许值为42MHZ,注意不要超过允许值。
那么最终,各个时钟都获得了相应的时钟频率,在进行PWM或者定时器计算的时候,一定要注意使用对应的时钟频率,不然结果肯定是不对的。
那么接下来,我们来看看HAL库的相关程序代码。
使能对应的时钟
OscillatorType是选择外部的哪个振荡器,如果要配置多个振荡器,则用竖线“|”隔开。
PPL结构体调用
配置FLASH的等待周期,由于F4系统时钟比访问FLASH的时钟更快,如果要有系统时钟访问FLASH则需要进行等待,一共是有0~15,16个选择。但是在有些芯片中,可能是0~7,那么需要查询FLASH_ACR寄存器LATENCY位域
具体配置方法
这篇文章就到这里,讲的比较粗糙,因为HAL库仅仅只是刚入门,以后学深入会继续细讲一些寄存器相关的内容,希望大家点个关注。有问题请私信或者评论区指出,我看到了都会回复。感谢阅读,希望这篇文章对您学习有所帮助。