stm32 入门系列-威尼斯人最新

thingskit · 2020年03月13日 · 最后由 回复于 2022年08月03日 · 267 次阅读

时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。我们知道 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 是外部低速时钟,通常在外部低速时钟管脚上外接一个 32.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 时钟(32.768k),还可以通过 hse 的 128 分频后得到。

(c)usb 时钟。stm32 中有一个全速功能的 usb 模块,其串行接口引擎需要一个频率为 48mhz 的时钟源,该时钟源只能从 pll 输出端获取,可以选择为 1.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、2 倍频使用。

⑤送给 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 将不工作。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
网站地图