嵌入式开发学习日志28stm32之时钟系统
嵌入式开发学习日志28——stm32之时钟系统
之前说到过,stm32的中断并非只有外部中断一种,但在介绍下一种中断——定时器中断前,还是需要先从时钟系统入手,了解stm32所有时钟工作的来龙去脉,这样才有助于接下来的学习。
时钟系统对于stm32甚至其他单片机来说就相当于人类的心脏,起着非常重要的作用。stm32作为较为高级的单片机,并非所有的外设都是依靠一个时钟进行工作的,而stm32内部就能够提供多种时钟源供选择。
stm32系统复位之后,首先会进入SystemInit函数进行时钟的配置,将系统时钟设置为72MHz后进入主函数,系统时钟哪来的?时钟树给你答案。
首先隆重介绍一下时钟树中出现的5个重要时钟源,LSE,LSI,HSE,HSI以及PLL。
都什么意思呢?LSE,外部低速时钟(low speed external);LSI,内部低速时钟(low speed internal);HSE,外部高速时钟(high speed external);HSI,内部高速时钟(high speed internal);PLL,锁相环(学电工的不会陌生)。
下面就这几个时钟源进行解释。
HSI,一个RC振荡器,提供8MHz的频率,可直接作为系统时钟(SYSCLK)的输入,也可以输入PLL锁相环进行倍频。
HSE,频率4-16MHz,开发板上接的是一个8MHz的晶振,可输入系统时钟,也可以进入PLL锁相环进行倍频,当然也可以经过128分频后进入RTC实时时钟系统。
LSI,一个RC振荡器,提供40k的频率,可以提供给独立看门狗(唯一的时钟源)以及RTC(使用起来相对稳定)。
LSE,stm32芯片的PC14与PC15即为该时钟的管脚,一般有32.768KHZ的晶振提供频率,可供RTC使用。
PLL,可以将进入的HSE或者HSI的频率进行倍频,由于stm32开发板上接的是8MHz的外部晶振,板子的最大时钟频率为72MHz,所以通过倍频来抵达这个上限,不过PLLCLK提供时钟频率的话,不能超过72MHz这个上限。
说完这几个时钟源,我们接着往后看。
在图中标出A位置的MCO,一个可以进行时钟输出的IO口,从图上就能看出它能输出哪些时钟,,而这输出的时钟可以作为其他系统的时钟源。
图中B位置标出来的是RTC实时时钟,具体关于这个的知识要等到后面解释。
C位置是USB时钟,它只能从PLL输出端获取时钟源频率。
D位置就是最重要的SYSCLK系统时钟,由于在stm32中我们希望能够获得一个比较大的时钟频率,所以一般选它作为stm32中绝大部分工作的时钟源。
而E部分就是stm32芯片上绝大部分的外设了,他们的时钟源都是来自SYSCLK,它提供的时钟频率经过预分频之后传送给各个模块进行使用。而E模块最需要注意的,是APB1以及APB2,这在后面的实际操作中是常客,其实在前面几章的简单项目练习中已经能够看得出来了。
APB1是挂载的低速外设,包括电源接口,I2C总线,UART2等;而APB2挂载的是高速外设,包括UART1,SPI,GPIO等。
总之,无论使用哪一个时钟,一定要记住对时钟使能,把它打开才能使用!
虽然讲了这么多模块,但接下来要说的是,时钟树最常用的一个工作线路并没有那么复杂。
首先让我们看向HSE外部高速时钟,由片上的晶振提供8MHz的频率给PLL锁相环进行倍频,之后得到想要的72MHz并将时钟放到PLLCLK中寄存,在需要时输出到SYSCLK,由SYSCLK传到AHB预分频器进行分频,然后传给外设,一般进入APB1时会进行二分频,所以常会是36MHz(也是上限),而进入APB2时,可以将72MHz全部传入。
而初步掌握了时钟树后,接下来对一些知识的理解也会更好些。