STM32的时钟

STM32的时钟:
时钟为单片机提供稳定的机器周期,从而使系统能够正常运行。STM32内部有很多外设,既有高速外设,也有低速外设,各外设工作频率都不相同,比如看门口和RTC,只需要30KHz左右的时钟频率即可工作,因此内部时钟源有多种选择。系统复位后首先进入SystemInit函数设置时钟,在文件startup_stm32f1xxxx.s内调用该函数,默认初始化是由HSI时钟提供16MHZ的SYSCLK,但为了提升系统性能,一般都会使能外部时钟晶振HSE,一般为8MHz,使能后功耗温度明显升高,因此在外设不工作时,需要把时钟关闭以减少功耗。

startup_stm32f1xxxx.s:
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP


SystemInit:
void SystemInit (void)
{
  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */
  /* Set HSION bit */
  RCC->CR |= 0x00000001U;

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#if !defined(STM32F105xC) && !defined(STM32F107xC)
  RCC->CFGR &= 0xF8FF0000U;
#else
  RCC->CFGR &= 0xF0FF0000U;
#endif /* STM32F105xC */   
  
  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= 0xFEF6FFFFU;

  /* Reset HSEBYP bit */
  RCC->CR &= 0xFFFBFFFFU;

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
  RCC->CFGR &= 0xFF80FFFFU;

#if defined(STM32F105xC) || defined(STM32F107xC)
  /* Reset PLL2ON and PLL3ON bits */
  RCC->CR &= 0xEBFFFFFFU;

  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x00FF0000U;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000U;
#elif defined(STM32F100xB) || defined(STM32F100xE)
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000U;

  /* Reset CFGR2 register */
  RCC->CFGR2 = 0x00000000U;      
#else
  /* Disable all interrupts and clear pending bits  */
  RCC->CIR = 0x009F0000U;
#endif /* STM32F105xC */
    
#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
  #ifdef DATA_IN_ExtSRAM
    SystemInit_ExtMemCtl(); 
  #endif /* DATA_IN_ExtSRAM */
#endif 

#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 
}
RCC->CR:时钟控制寄存器,控制时钟的作用
RCC->CFGR2:时钟配置寄存器,配置时钟的作用。

 

 

RCC(Reset Clock Controller):
RCC是STM32的时钟控制器,可开启或关闭各总线的时钟,在使用各外设功能必须先开启其对应的时钟,若没有这个时钟,内部的各器件就不能运行。
总的来RCC起到以下两个作用:
1、作为系统时钟,驱动CPU产生执行指令功能的机器周期、产生定时;
2、作为外设时钟:可经过分频后为ADC、USART、SPI等提供时钟;
在外部时钟失效时系统时钟将由STM32自带的内部时钟提供。

RTC:
RTC是STM32内部集成的一个简单的时钟,计时用的,若不用则关闭它,若用则需要通过RCC配置其时钟源,可将其看做是一个外设器件。

高速时钟:
高速时钟主要是提供给芯片主体的主时钟

低速时钟:
低速时钟置提供给芯片中的RTC实时时钟和独立看门口使用的。

内部时钟:
内部时钟是由芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电时,默认都是使用内部高速时钟的。

外部时钟:
外部时钟是由外部晶振输入的,在精度和稳定性上都有很大优势,因此芯片在上电后再进行软件配置,来转向采用外部时钟提供信号。

上面的组合就产生了以下5个时钟源:
HSE高速外部时钟:
以外部晶振作为时钟源,晶振频率可取范围为4~16MHz,一般都是用8MHz。可为系统时钟或PLL锁相环提供输入信号,还可经过128分频后输入给RTC。


HSE有两种模式:
1.外部晶体/陶瓷谐振器模式(HSE晶体)
常用这种模式,HSE晶体可为系统提供较为精确的时钟源。通过时钟控制寄存器RCC_CR中的HSERDY位来指示高速外部正当前是否稳定。在启动时,只有当该位
被置1后,时钟才会被释放,可通过设置控制寄存器RCC_CR中的HSEON位来开启和关闭HSE晶体。
该时钟源是由外部无源晶体与MCU内部时钟驱动电路共同配合形成,有一定的启动时钟,精度较高。为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和
负载电容必须尽可能地靠近振荡器引脚。负载电容值必须根据所选择的晶体来具体调整。
一般来说,石英晶体和陶瓷晶体主要区别在于精度和温度稳定性上,石英晶体比陶瓷晶体精度高,温度稳定性好。

2.外部时钟源模式(HSE旁路)
表示无需上面模式提到的使用外部晶体时所需的芯片内部时钟驱动组件,此时HSE振荡器电路不再使用,包括外接的晶振,负载电容,芯片内部的震荡电路,而是直接从
外界导入时钟信号,犹如芯片内部的驱动组件被旁路了,在旁路情况下,需要通过OSC_IN引脚输入时钟源,OSC_OUT引脚必须悬空对外呈高阻态,
时钟源可以是50%占空比的正弦波,方波。需要将RCC_CR的HSEON位和HSEBYP位都置1来选择该模式。
自然,该模式下必须提供外部时钟。
应该注意的是,在使用该模式时,大多都会误配置成与HSE晶体模式一样的而导致失败,在旁路模式中,除了要配置HSEON外,还得配置HSEBYP位。
若是使用有源晶振作为时钟源,则也应该选择HSE旁路模式:

有源晶振一般是四脚封装,电源,地,震荡输出和一个控制端(或悬空端),相比无源晶体,有源本身就是一个完整的振荡器件,只需提供适当的电源即可输出时钟,无需额外的震荡驱动匹配电路,其时钟输出不依赖于外部器件振荡电路,相对更不容易受外部线路不稳定性的影响。因此其价格也远高于无源晶体,其缺点便是输出电平幅度不能像无源晶体一样灵活,随着应用电路的变化而变化。接法就是直接将有源晶振的输出脚接入MCU的OSC_IN脚。


HSI高速内部时钟:
由内部RC振荡器产生,频率为8MHz,但不太稳定,可为系统时钟或PLL锁相环提供输入信号。

LSE低速外部时钟:
以外部晶振作为时钟源,一般为32.768KHz,主要提供给RTC模块使用。
LSI低速内部时钟:
由内部RC振荡器产生,频率为40KHz,主要提供RTC模块和独立看门口使用,且独立看门口只能使用LSI时钟。

还有一个特别的。
PLL锁相环,它属于高速内部时钟:
用于倍频输出,由于外部高速晶体只有8MHz,而芯片需要的最大时钟频率是72MHz,因此需通过PLL锁相环来倍频。

除了以上4个时钟外,STM32时钟系统中还有第5个重要的时钟,PLL锁相环高速时钟。由前面CubeMX时钟图可知,PLL时钟可选HSI/2,HSE或HSE/2,时钟源经过2~16倍频
后输入给PLLCLK,若时钟选择由PLLCLK提供,则最大值不能超过72MHz。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值