STM32
直播中

陆军航空兵

8年用户 781经验值
私信 关注
[问答]

STM32F1时钟树是由哪些部分组成的

STM32F1时钟树是由哪些部分组成的?

如何去配置STM32F1时钟树的库函数?

回帖(2)

张桂芳

2021-9-23 10:32:11
  STM32F1 时钟树
  
  时钟源
  HSI:高速内部时钟,RC振荡器,频率为8MHz
  HSE:高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz
  LSI:低速内部时钟,RC振荡器,频率为40kHz
  LSE:低速外部时钟,接频率为32.768kHz的石英晶体
  LSI可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。LSE也可用来通过程序选择驱动RTC。
  内部即指芯片已经集成,外部即指需要设计PCB时接入
  锁相环:这个东西可以将输入频率进行放大然后输出,比如说输入1MHz,设置倍频为3倍,最后就能输出3MHz的信号。STM32的锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
  时钟配置
  主要
  SYSCLK:系统时钟
  HCLK:AHB总线时钟
  PCLK2:APB2总线时钟
  PCLK1:APB1总线时钟
  库函数的标准配置:PCLK2 = HCLK = SYSCLK = PLLCLK = 72M,PCLK1 = HCLK/2 = 36M
  APB1和APB2搭载的外设如下图所示:
  
  其它
  USB时钟
  USB 时钟是由 PLLCLK 经过 USB 预分频器得到,分频因子可以是:[1,1.5],具体的由时钟配置寄存器 CFGR 的位 22:USBPRE 配置。USB 的时钟最高是 48M,根据分频因子反推过来算,PLLCLK 只能是 48M 或者是 72M。一般我们设置 PLLCLK=72M,USBCLK=48M。USB 对时钟要求比较高,所以 PLLCLK 只能是由 HSE 倍频得到,不能使用 HSI 倍频。
  Cortex 系统时钟
  Cortex 系统时钟由 HCLK 8 分频得到,等于 9M,Cortex 系统时钟用来驱动内核的系统定时器 SysTick,SysTick 一般用于操作系统的时钟节拍,也可以用做普通的定时。
  ADC 时钟
  ADC 时钟由 PCLK2 经过 ADC 预分频器得到,分频因子可以是[2,4,6,8],具体的由时钟配置寄存器 CFGR 的位 15-14:ADCPRE[1:0]决定。很奇怪的是怎么没有 1 分频。ADC时钟最高只能是 14M,如果采样周期设置成最短的 1.5 个周期的话,ADC 的转换时间可以达到最短的 1us。如果真要达到最短的转换时间 1us 的话,那 ADC 的时钟就得是 14M,反推 PCLK2 的时钟只能是:28M、56M、84M、112M,鉴于 PCLK2 最高是 72M,所以只能取 28M 和 56M。
  RTC 时钟、独立看门狗时钟
  RTC 时钟可由 HSE/128 分频得到,也可由低速外部时钟信号 LSE 提供,频率为32.768KHZ,也可由低速内部时钟信号 HSI 提供,具体选用哪个时钟由备份域控制寄存器BDCR 的位 9-8:RTCSEL[1:0]配置。独立看门狗的时钟由 LSI 提供,且只能是由 LSI 提供,LSI 是低速的内部时钟信号,频率为 30~60KHZ 直接不等,一般取 40KHZ。
  MCO 时钟输出
  MCO 是 microcontroller clock output 的缩写,是微控制器时钟输出引脚,在 STM32 F1系列中 由 PA8 复用所得,主要作用是可以对外提供时钟,相当于一个有源晶振。MCO 的时钟来源可以是:PLLCLK/2、HSI、HSE、SYSCLK,具体选哪个由时钟配置寄存器CFGR 的位 26-24:MCO[2:0]决定。除了对外提供时钟这个作用之外,我们还可以通过示波器监控 MCO 引脚的时钟输出来验证我们的系统时钟配置是否正确。
  基于标准库的设置代码
  使用标准库的模板工程,在系统启动的时候,statup_stm32f10x_hd.s 已经调用 SystemInit()函数把系统时钟初始化成 72MHZ,SystemInit()在库文件:system_stm32f10x.c 中定义。然后再进入main函数。
  如果我们想把系统时钟设置低一点或者超频的话,可以修改底层的库文件,即改动SystemInit()函数。但是为了维持库的完整性,可以在按照标准库的方法启动后进入main函数中时,再自己写个时钟初始化函数将系统时钟重新配置。
  HSI 设置系统时钟函数跟 HSE 设置系统时钟函数在原理上是一样的,有一个区别的地方就是,HSI 必须 2 分频之后才能作为 PLL 的时钟来源,所以使用 HSI 时,最大的系统时钟 SYSCLK 只能是 HSI/216=416=64MHZ。
举报

李秀容

2021-9-23 10:33:56
  STM32F1 时钟树
  
  时钟源
  HSI:高速内部时钟,RC振荡器,频率为8MHz
  HSE:高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz
  LSI:低速内部时钟,RC振荡器,频率为40kHz
  LSE:低速外部时钟,接频率为32.768kHz的石英晶体
  LSI可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。LSE也可用来通过程序选择驱动RTC。
  内部即指芯片已经集成,外部即指需要设计PCB时接入
  锁相环:这个东西可以将输入频率进行放大然后输出,比如说输入1MHz,设置倍频为3倍,最后就能输出3MHz的信号。STM32的锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
  时钟配置
  主要
  SYSCLK:系统时钟
  HCLK:AHB总线时钟
  PCLK2:APB2总线时钟
  PCLK1:APB1总线时钟
  库函数的标准配置:PCLK2 = HCLK = SYSCLK = PLLCLK = 72M,PCLK1 = HCLK/2 = 36M
  APB1和APB2搭载的外设如下图所示:
  
  其它
  USB时钟
  USB 时钟是由 PLLCLK 经过 USB 预分频器得到,分频因子可以是:[1,1.5],具体的由时钟配置寄存器 CFGR 的位 22:USBPRE 配置。USB 的时钟最高是 48M,根据分频因子反推过来算,PLLCLK 只能是 48M 或者是 72M。一般我们设置 PLLCLK=72M,USBCLK=48M。USB 对时钟要求比较高,所以 PLLCLK 只能是由 HSE 倍频得到,不能使用 HSI 倍频。
  Cortex 系统时钟
  Cortex 系统时钟由 HCLK 8 分频得到,等于 9M,Cortex 系统时钟用来驱动内核的系统定时器 SysTick,SysTick 一般用于操作系统的时钟节拍,也可以用做普通的定时。
  ADC 时钟
  ADC 时钟由 PCLK2 经过 ADC 预分频器得到,分频因子可以是[2,4,6,8],具体的由时钟配置寄存器 CFGR 的位 15-14:ADCPRE[1:0]决定。很奇怪的是怎么没有 1 分频。ADC时钟最高只能是 14M,如果采样周期设置成最短的 1.5 个周期的话,ADC 的转换时间可以达到最短的 1us。如果真要达到最短的转换时间 1us 的话,那 ADC 的时钟就得是 14M,反推 PCLK2 的时钟只能是:28M、56M、84M、112M,鉴于 PCLK2 最高是 72M,所以只能取 28M 和 56M。
  RTC 时钟、独立看门狗时钟
  RTC 时钟可由 HSE/128 分频得到,也可由低速外部时钟信号 LSE 提供,频率为32.768KHZ,也可由低速内部时钟信号 HSI 提供,具体选用哪个时钟由备份域控制寄存器BDCR 的位 9-8:RTCSEL[1:0]配置。独立看门狗的时钟由 LSI 提供,且只能是由 LSI 提供,LSI 是低速的内部时钟信号,频率为 30~60KHZ 直接不等,一般取 40KHZ。
  MCO 时钟输出
  MCO 是 microcontroller clock output 的缩写,是微控制器时钟输出引脚,在 STM32 F1系列中 由 PA8 复用所得,主要作用是可以对外提供时钟,相当于一个有源晶振。MCO 的时钟来源可以是:PLLCLK/2、HSI、HSE、SYSCLK,具体选哪个由时钟配置寄存器CFGR 的位 26-24:MCO[2:0]决定。除了对外提供时钟这个作用之外,我们还可以通过示波器监控 MCO 引脚的时钟输出来验证我们的系统时钟配置是否正确。
  基于标准库的设置代码
  使用标准库的模板工程,在系统启动的时候,statup_stm32f10x_hd.s 已经调用 SystemInit()函数把系统时钟初始化成 72MHZ,SystemInit()在库文件:system_stm32f10x.c 中定义。然后再进入main函数。
  如果我们想把系统时钟设置低一点或者超频的话,可以修改底层的库文件,即改动SystemInit()函数。但是为了维持库的完整性,可以在按照标准库的方法启动后进入main函数中时,再自己写个时钟初始化函数将系统时钟重新配置。
  HSI 设置系统时钟函数跟 HSE 设置系统时钟函数在原理上是一样的,有一个区别的地方就是,HSI 必须 2 分频之后才能作为 PLL 的时钟来源,所以使用 HSI 时,最大的系统时钟 SYSCLK 只能是 HSI/216=416=64MHZ。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分