以前使用STM32写程序的时候,使用的都是默认时钟。因此写数码管显示、A/D测量电压的时候都没有去关心RCC时钟配置这个事情。那时候只知道在配置外设的时候使用GPIO_InitTypeDef或者ADC_InitTypeDef这些结构体对外设进行初始化,以及使用RCC_APB2PeriphClockCmd或者RCC_ADCCLKConfig函数对外设的时钟开启与配置。
这几天尝试使用STM32的USB通信写一个鼠标,发现一些例程中有关于时钟配置的代码,才注意起这个事情。为此进行了一些学习,并且记录如下的笔记。
一、RCC的结构
以下是STM32时钟系统的结构图:
从图中,我们可以看到,STM32的时钟有四个来源:外部晶振提供的高速外部时钟(HSE)、外部晶振提供的低速外部时钟(LSE)、内部RC振荡器提供的高速内部时钟(HSI)、内部RC振荡器提供的低速内部时钟(LSI)。看上去RCC的工作过程好像很复杂,其实细看并不然。
举个例子吧,Keil编写程序是默认的时钟为72Mhz,其实是这么来的: