各位朋友在使用MCU进行开发时,是否有遇到过以下现象:将两份同样的程序下载到两块相同的MCU,最终运行时,发现其中一块时序正常,而另一块时序异常,无论是采用定时器延时 或 使用通信接口通信,都会发现时钟速度不正常。别担心,通过本次的学习,也许能解决问题!
(相关资料图)
本文将讲解MCU中的时钟树,通过分析一款具体型号的MCU手册,来说明MCU中的时钟的来源以及其作用,分析时钟树对于编程的影响。
以下内容,只表示个人观点,不一定完全正确,但欢迎大家指正错误和提出建议,必有重谢。
Part 1
时钟树介绍
单片机中的时钟树是什么?有什么作用?
笔者认为,时钟树是关注单片机的时钟源和时钟的流向的树状结构。单片机开发工程师通过分析一款单片机芯片的时钟树,可以获取到这款芯片中的时钟数目以及各时钟作用。当芯片工作时序紊乱时,结合时钟树分析以及使用示波器等工具,就可以排查出问题的根源。
Part 2
STM32F4xx时钟树分析
本例以STM32F407ZG芯片为例来分析时钟树,此款芯片正常工作时主频率为168MHz。打开此款芯片的参考手册,找到时钟树的图片。
Step1,找出此款STM32芯片中5个时钟源:低速内部时钟LSI,低速外部时钟LSE,高速内部时钟HSI,高速内部时钟HSE,锁相环路时钟PLL。找出他们后,关注这5个时钟的来源和流向。
Step2,在图中标注这5种时钟源的来源和流向。
Step3,对于每个时钟源逐个分析,逐个击破!
LSI,低速内部时钟(位于图片上方,用蓝线标记),时钟来源是MCU内部的RC振荡电路,频率为32KHz。作用:驱动独立看门狗, 也可以驱动RTC(实时时钟,本质还是一款定时器,一般不用LSI驱动RTC)
2.LSE,低速外部时钟(位于图片上方,用绿线标记),时钟来源是MCU的OSC32IN和OSC32OUT连接晶振电路提供的时钟信号,在本开发板使用的32.768kHz(LSE一般也使用32.768kHz)。
作用:驱动RTC(一般用LSE驱动RTC,因为RTC内部可以达到32768分频,故产生的计数频率为1Hz)
补充:LSE的时钟可以通过MCO1引脚输出,用于测试外部低速晶振电路是否正常。
3.HSI,高速内部时钟(位于图片中心,用紫线标记),时钟来源是MCU内部的RC振荡电路,频率为16MHz。
作用:提供芯片的主频(16MHz), 也可以为PLL提供时钟输入。
补充:HSI的时钟可以通过MCO1引脚输出,用于测试内部高速振荡电路是否正常。
4.HSE,高速外部时钟(位于图片左下,用粉线标记),时钟来源是MCU的OSC_IN和OSC_OUT连接晶振电路提供的时钟信号,在本开发板使用的25MHz。
作用:驱动RTC , 提供芯片的主频(25MHz) ,也可以为PLL提供时钟输入。
补充:HSE的时钟可以通过MCO1和MCO2引脚输出,用于测试外部高速晶振电路是否正常。
5.PLL,锁相环路时钟(位于图片左下,用红线标记),时钟来源是HSI或HSE。
作用:放大时钟来源的频率,提供芯片主频(又称系统时钟SYSCLK)。
Part 3
MCU系统时钟(主频)的计算
考虑到常规使用STM32时,不会直接使用HSI和HSE作为芯片的主频(数值较小),一般都是用HSE作为PLL的时钟输入,再用PLL时钟输出作为MCU的主频。
结合上图左下角PLL部分框图中出现的系数,可以得到MCU主频为:
f ~ SYSCLK~ = (f ~ HSE ~ / M) * (N/P); //单位MHz
故说明MCU的主频受到外部晶振电路的频率以及PLL时钟电路中的M、N、P的影响。笔者以自己使用的开发板(信盈达公司的STM32F407ZG开发板)为例,做进一步的说明。
电路上,用于连接HSE的晶振电路是25MHz,如下图所示。
故公式中f ~ HSE~数值为25MHz,另外三个参数M、N、P是通过编程配置的,定义于文件system_stm32f4xx.c中(这个文件是由STM32厂商提供,是建立工程的必要文件之一)。
可以看到其中M为25,N为336,P为2。代入公式
f ~ SYSCLK~ = (f ~ HSE~ / M) * (N/P); //单位MHz
计算出芯片的主频为168MHz。如果开发板上使用的外部晶振电路被替换为8MHz,则需要更改程序中出现的PLL_M的值,将它由25修改为8后,才可以保证MCU继续维持168MHz的主频。
总结:一款MCU的主频的设置取决于两方面:硬件电路设计(特别是MCU外部的晶振电路)和软件设计(关于PLL时钟相关的分频和倍频系数,通过程序设置)。但这一切归根结底,还是在于能否正确理解一款芯片时钟树!
留给读者的思考,下图为STM32F1xx时钟树,找出它的各个时钟源的来源和流向,分析各自的作用。并思考STM32F1xx系列芯片在时钟上和STM32F4xx系列芯片有何不同。
标签: