本篇文章将详细讲述时钟系统的相关知识。小白总结,如有错误,请大神指教。
任何一个外设在使用之前,必须首先使能其相应的时钟。所以学会时钟系统知识显得尤为重要。
一、时钟系统框图
(1)时钟源:HSI RC,HSE OSC,LSE OSC,LSI RC,PLL。
(2)三种不同的时钟源可被用来驱动系统时钟(SYSCLK):HSI振荡器时钟 , HSE振荡器时钟 ,PLL时钟。
(3)HSE主要通过外部晶振来开启频率,频率范围约是4MHz---16MHz在这个模式里,必须提供外部时钟。它的频率最高可达50MHz。外部时钟信号(50%占空比的方波、正弦波或三角波)必须连到SOC_IN引脚,同时保证OSC_OUT引脚悬空。3~25Mz外部振荡器可为系统提供非常精确的主时钟。
(4)HSI时钟信号由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差。
(5)PLL:锁相环内部输出。主PLL以下述时钟源之一为输入,产生倍频的输出:HSI时钟除以2 ,HSE或通过一个可配置分频器的PLL2时钟。当改变主PLL的输入时钟源时,必须在选中了新的时钟源(通过时钟配置寄存器(RCC_CFGR)的PLLSRC位)之后才能关闭原来的时钟源。 如果使能了时钟中断寄存器(RCC_CIR),可以在PLL就绪时产生一个中断。
(6)LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源。LSE晶体通过在备份域控制寄存器(RCC_BDCR)里的LSEON位启动和关闭。
(7)LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。LSI时钟频率大约40kHz(在30kHz和60kHz之间)。
(8)系统时钟(SYSCLK):系统复位后,HSI振荡器被选为系统时钟。当时钟源被直接或通过PLL间接作为系统时钟时,它将不能被停止。 只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),从一个时钟源到另一个时钟源的切换才会发生。在被选择时钟源没有就绪时,系统时钟的切换不会发生。直至目标时钟源就绪,才发生切换。
(9)时钟安全系统(CSS) :时钟安全系统可以通过软件被激活。一旦其被激活,时钟监测器将在HSE振荡器启动延迟后被使能,并在HSE时钟关闭后关闭。
(10)几个重要的时钟:SYSCLK(系统时钟),AHB总线时钟,APB1总线时钟(低速)(速度最高36MHz),APB2总线时钟(高速)(速度最高72MHz),PLL时钟。
二、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;
三、RCC相关头文件和固件库源文件
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();
RCC_APB2PeriphClockCmd();
RCC_AHBPeriphClockCmd();
5.其他外设时钟配置:
RCC_ADCCLKConfig();
RCC_RTCCLKConfig();
6.状态参数获取参数:
RCC_GetClocksFreq();
RCC_GetSYSCLKSource();
RCC_GetFlagStatus();
7.RCC中断相关函数:
RCC_ITConfig();
RCC_GetITStatus();
RCC_ClearITPendingBit();