原文链接:https://www.yourcee.com/newsinfo/2972607.html
时钟是同步单片机系统各个部件工作时序的最小时间单位,对于单片机MCU来说,时钟就是单片机的心脏,在单片机中,始终在一定周期内做出上升或者下降的动作,实际上就是方波,而单片机的的每条指令都是按照一定时序进行的,因此单片机的工作离不开时钟信号的输入。
在我们刚开始学习51单片机的时候,我们知道,传统的STC89C52是没有内部时钟系统的,那个时候我们只有外接一个石英晶振来作为51单片机的时钟输入信号,现在新的51单片机也都带有内部时钟了,不过精确度不够高而已,我们知道51单片机1个机器周期=12个时钟周期,频率为12MHZ,则一个机器周期为1US,具体到定时器程序就是,假如你想定1MS,那么单片机每次加一个一,就要过1US,那么1MS就要加1000次,所以用65535-1000=64535;再把64535换成16进制为FC17,把FC付给TH0,17给TLO,即可定时1MS,因为65535他就溢出进入中断。STM32其实也是类似的,下图为51单片机的时钟电路原理图。
我们可以从下面这张图中来大致看下STM32的时钟源可以从那些地方获取,现在CUBEMX开发软件中也可以很直观的看出,具体如下:
从上图中我们可以看出STM32具有五个时钟源作为单片机的时钟输入信号,经过后续相关倍频和分频后得到系统时钟给系统提供时钟,我们在使用的时候就需要配置相关库函数来达到对应总线需要的时钟是多少,可以列举出下五种:
①:HSI是高速内部时钟,RC振荡器,频率为8Mhz,精度不高
②:HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz
③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。WDG
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
STM32并不像传统的51一样。系统时钟只能来源于一个时钟源,在STM32中,系统时钟可以是来源于以下三个时钟源:
①、HSI振荡器时钟
②、HSE振荡器时钟
③、PLL时钟
注意STM32不像51直接使用时钟,在每一个外设使用之前必须对相应总线上的时钟使能。
在库函数中有对应结构体:
RCC时钟相关寄存器
typedef struct
{
__IO uint32_t CR; //HSI,HSE,CSS,PLL等的使能和就绪标志位
__IO uint32_t CFGR; //PLL等的时钟源选择,分频系数设定
__IO uint32_t CIR; // 清除/使能 时钟就绪中断
__IO uint32_t APB2RSTR; //APB2线上外设复位寄存器
__IO uint32_t APB1RSTR; //APB1线上外设复位寄存器
__IO uint32_t AHBENR; //DMA,SDIO等时钟使能
__IO uint32_t APB2ENR; //APB2线上外设时钟使能
__IO uint32_t APB1ENR; //APB1线上外设时钟使能
__IO uint32_t BDCR; //备份域控制寄存器
__IO uint32_t CSR; //控制状态寄存器
} RCC_TypeDef;
在使用库函数编程时可以直接在库函数中找到对应头文件和源文件如下:
1. 时钟使能配置:
RCC_LSEConfig() 、RCC_HSEConfig()、
RCC_HSICmd() 、 RCC_LSICmd() 、 RCC_PLLCmd() ……
2. 时钟源相关配置:
RCC_PLLConfig ()、 RCC_SYSCLKConfig() 、
RCC_RTCCLKConfig() …
3. 分频系数选择配置:
RCC_HCLKConfig() 、 RCC_PCLK1Config() 、 RCC_PCLK2Config()…
4. 外设时钟使能:
RCC_APB1PeriphClockCmd(): //APB1线上外设时钟使能
RCC_APB2PeriphClockCmd(); //APB2线上外设时钟使能
RCC_AHBPeriphClockCmd(); //AHB线上外设时钟使能
5. 其他外设时钟配置:
RCC_ADCCLKConfig (); RCC_RTCCLKConfig();
6. 状态参数获取参数:
RCC_GetClocksFreq();
RCC_GetSYSCLKSource();
RCC_GetFlagStatus()
7. RCC中断相关函数 :
RCC_ITConfig() 、 RCC_GetITStatus() 、 RCC_ClearITPendingBit()…
在STM32的学习中时钟系统是一个比较需要注重的一个知识点,因为在单片机的运行过程中离不开时钟,而STM32的时钟远比我这里讲解的更多,这里只是降到了我们需要注意的点,具体的还是需要在实际项目中更加深入了解STM32的时钟系统才能灵活运用。