STM32 M0时钟配置

本文主要讲STM32 M0的时钟配置。

先来看看M0内核的时钟树(stm32f072)

STM32 M0时钟配置_第1张图片

图中可以看出,M0芯片的时钟源有4个,一个高速内部RC时钟源,频率为8M;一个高速外部时钟源,频率为8到32MHz;一个低速外部时钟源,频率一般为32.768kHz;一个低速内部时钟源,频率为40kHz;

一、HSI

芯片上电的时候默认启用内部RC震荡,即8MHz的内部时钟源,如果对时钟要求不是特尔高的时候,使用内部时钟也够了,省下一个外部晶振的钱。

下面首先说说使用内部时钟的配置,官方提供的demo默认的就是使用内部时钟的,我们先从时钟树分析,HSI(8MHz)启动,经过PLLSRC(锁相环时钟源选择寄存器),然后来到PREDIV(预分频器),预分频器选择不分频,然后是PLLMUL(锁相环倍频),这里倍频6倍,得到48MHz的频率,注意不要高于48MHz,芯片最大支持的就是48MHz.,然后是SW(时钟源选择寄存器),这里选择PLLCLK(倍频后的锁相环时钟),其实在这里可以直接选择8MHz的内部时钟,不选择PLLCLK。SW的最终选择就是我们的机器时钟。

二、HSE

HSE是高速外部时钟的意思,为了获得更低的温飘、更稳定的时钟,一般选择外加一个外部晶振,增加外部晶振的话需要开启外部时钟选择寄存器,然后等待外部时钟震荡平稳,平稳的等待时间需要根据不同的震荡频率选择时长。等待外部时钟震荡平稳后,来到PLLSRC,这里选择HSE,假设外部晶振为8MHz,PREDIV也是选择不分频,PLLMUL选择6倍频,在SW选择时钟源为HSE,然后芯片的机器时钟得到48MHz。

观察SW寄存器,这里有一个CSS的选择,这是一个时钟安全选择寄存器,功能是当外部晶振突然不工作之后立即切换到HSI的一个选项,当程序运行过程中,外部晶振不震荡之后,系统会马上切换到内部时钟,这个时候,会产生一个同步异常中断,中断级别为负数,且不可修改,在中断里面自行将HSI分频、倍频,然后将主时钟修改为需要的机器时钟。CSS只有在开启了HSE之后才有意义,如果本来就是使用内部时钟的话,这个选项也可以不理会,当然,这个选项也可以选择不开启,默认是不开启的。

三、LSE

低速外部时钟,这个也是需要自行配置开启的,开启等待震荡平稳后,RTCCLK(实时时钟选择寄存器)选择LSE,目的是给内部的RTC提供一时钟源,关于为什么这里是32.768kHz,本文不打算多讲,请自行百度。LSE也可以作为机器时钟源,本人没有试验过,相信也没有人这么干,如果有,请介绍一下经验,以及目的。

四、LSI

低速内部时钟,这个提供内部的看门狗寄存器的内部专用时钟,看门狗的看门时长设置就是在这条时钟线上了,看门狗时长一般选择秒级,我的观点是时间越长越好。关于看门狗的使用有一点需要注意的是,无论是裸机开发还是带rtos的开发,都不能在中断中喂狗,整份代码,能且只能有一个地方喂狗。当然,你非要在A、B、C任务的死循环中各喂一次狗,也可以,但是如果读者真的采用这种做法,建议认真想想软件架构是否还有改善的地方。

五、I2C1

I2C接口的时钟可以选择HSI或者机器时钟

六、I2S

I2S只能选择机器时钟

七、AHB

基本外设时钟源,根据需要,自行将机器时钟进行预分频获得所需的频率、供给AHB总线上的外设,这个时钟总线上直接挂载了DMA、SRAM、FLITFEN、CRC、GPIO、TSC等外设;分频后还有一路是供给了APB,这里也有一个预分频器,挂载了USART和TIM等,USART的时钟源选择比较丰富,可以选择APB出来的PCLK、也可以直接选择机器时钟、HSI、LSE等;TIM的时钟还有一个预分频器,称为APB1,目的还是为了得到需要的定时时间或者脉宽频率。


STM32M0的基本时钟讲到这里基本讲完了,初一看这个时钟图还是比较复杂的,就像在学模拟电路的时候,直接把开关电源的原理图拿来看,一样像看天书,但是如果能静下心来,一点一点的啃的话,还是能慢慢吃透的。最近各个芯片厂商都开发了自己的代码生成工具,对于开发而言,方便了许多,也降低开发门槛,但是如果能对芯片有一深刻的认识(当然不用深入到IP层去),出现问题的时候,DEBUG也能快一点,借用宋宝华的一句话:出来混的,迟早要还的。今天不懂的却不愿弄懂的,他日问题重现的时候,就是还的时候了。


写于2017年10月8日

深圳


你可能感兴趣的:(STM32)