//插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///
入门系列-STM32时钟系统,STM32时钟树
时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。我们知道STM32属于高级单片机,其内部有很多的外设,但不是所有外设都使用同一时钟频率工作,比如内部看门狗和RTC,它只需30KHz的时钟频率即可工作,所以内部时钟源就有多种选择。在前面章节的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,将STM32F1系统时钟设置为72MHz,然后进入主函数。那么这个系统时钟大小如何得来,其他外设的时钟又如何划分,可以通过一张时钟树图找到答案,只要理解好时钟树,STM32一切时钟的来龙去脉就会非常清楚。下面就来了解下时钟树,如下图所示。
在STM32时钟系统中,有5个重要的时钟源,分别是LSI、LSE、HSI、HSE、PLL。依照时钟频次分可分为高速时钟源和低速时钟源,在这5个中HSI、HSE以及PLL属于高速时钟,LSI和LSE属于低速时钟。依照时钟来源可分为外部时钟源和内部时钟源,外部时钟源就是在STM32晶振管脚处接入外部晶振的方式获取时钟源,其中HSE和LSE是外部时钟源,其他的是内部时钟源。下面我们就依照上图中数字顺序来介绍。
(1)图标1中HSI是内部高速时钟,RC振荡器,频次为8MHz。可作为系统时钟或PLL锁相环的输写。
(2)图标2中HSE是外部高速时钟,可通过外接一个频次范围是4-16MHz的时钟或者晶振,HSE能够作为系统时钟和PLL锁相环输写,还能够经过128分频后输写给RTC。
(3)图标3中LSI是内部低速时钟,RC振荡器,频次大约为40K,可供独立看门狗和RTC运用,并且独立看门狗只能运用LSI时钟。
(4)图标4的LSE是外部低速时钟,通常在外部低速时钟管脚上外接一个3二.768KHz的晶振,供RTC运用。
(5)图标5的PLL是锁相环,用于倍频输出,由于开发板外部高速晶振也独有8M,假如要使芯片的最大时钟频次是72M,可通过PLL锁相环来倍频。从图标5中能够看到,PLL时钟输写源可选择为HSI/2、HSE或者HSE/2,时钟源经过2-16倍频后输写给PLLCLK,假如系统时钟选择由PLLCLK提供,则PLLCLK最大值不要超过72M。
那么它是怎么倍频产生72MHz系统时钟的呢?我们看到在主PLL内有倍频器和分频器,PLL时钟源的输写信号要先经过一个PLLMUL倍频器,将HSE或HSI倍频2-16后输写给PLLCLK,假如系统时钟源SYSCLK选择PLLCLK作为它的来源,则最大值不能超过72M。虽然能够做超频处理,但会打破系统的稳定性,这个是不划算的。假设PLLSRC的时钟来源由HSE提供,开发板运用的HSE是8M晶振,经过PLLMUL的9倍频后能够输出72M时钟频次给PLLCLK。
假如我们选择的HSE是PLL的时钟源,PLL是SYSCLK的时钟源,即SYSCLK为72MHz,这个也是我们库函数模板中SystemInit所配置的最终系统时钟。
上面简略介绍了下STM32的5个时钟源,那么它们是怎么给其他外设和系统提供时钟的呢?在上面时钟树图中常用的时钟用字母框起来,依照它们顺序依次介绍。
(A)MCO是STM32的一个时钟输出IO(PA8),它能够选择一个时钟信号输出,能够选择为PLL输出的2分频、HSI、HSE或者系统时钟。这个时钟能够拿来给外部其他系统提供时钟源。
(B)RTC时钟。从图中线的流向可知,RTC时钟来源能够是内部低速的LSI时钟,外部低速LSE时钟(3二.768K),还能够通过HSE的128分频后得到。
(C)USB时钟。STM32中有一个全速功能的USB模块,其串行接口引擎须要一个频次为48MHz的时钟源,该时钟源只能从PLL输出端获取,能够选择为一.5分频或者1分频,也就是当须要运用USB模块时,PLL必需使能,并且PLLCLK时钟频次配置为48MHz或72MHz。
(D)SYSCLK系统时钟。它是STM32中绝大局部部件工作的时钟源。它的时钟来源能够由HSI、HSE、PLLCLK提供,相信大家选择STM32F1这种高级芯片,都希望有一个比较大的时钟频次,因此选择PLLCLK作为系统时钟。PLLCLK又是从HSE或HSI经过PLL倍频得到。依据前面PLL计算关系大家就能够算出系统时钟是多少。
(E)其他所有外设。从时钟图上能够看出,其他所有外设的时钟最终来源都是 SYSCLK。SYSCLK通过AHB分频器分频后送给各模块运用。这些模块包含:
①AHB总线、内核、内存和DMA运用的HCLK时钟。
②通过8分频后送给Cortex系统定时器时钟,即SysTick。
③直接送给Cortex的空闲运行时钟FCLK。
④送给APB1分频器。APB1分频器输出一路供APB1外设运用(PCLK1,最大频次36MHz),另一路送给定时器(Timer)1、两倍频运用。
⑤送给APB2分频器。APB2分频器分频输出一路供APB2外设运用(PCLK2,最大频次72MHz),另一路送给定时器(Timer)1倍频器运用。
⑥送给ADC分频器。ADC分频器经过2、4、6、8分频后送给ADC1/2/3运用,ADC最大频次为14M。
⑦二分频后送给SDIO运用。
其中须要了解的是APB1和APB2的差别,APB1上面连接的是低速外设,包含电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等。APB2上面连接的是高速外设包含UART1、SPI1、Timer1、ADC1、ADC2、GPIO等。
在时钟树图中我们还能够得到一个重要信息,大部分相关时钟输出局部都有一个使能控制,假如AHB总线、APB1外设、APB2外设、内核时钟等。当须要运用某个时钟的时候一定要开启它的使能,否则将不工作。在前面运用库函数点亮一个LED实验的时候就使能了GPIO的外设时钟,假如不开启,LED 将不工作。
想要学习单片机的朋友 ,做毕业设计的同学,关注我们,口令小哥,与导师一起学习成长,共同进步,还有更多资料领取。
说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~