配置主要代码如下,看起来挺简单,实际设计的东西还是挺多的,需要多看几遍,下面进行详解:
//系统时钟初始化函数
//pll:选择的倍频数,从2开始,最大值为16void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;
MYRCC_DeInit(); //复位并配置向量表
RCC->CR|=0x00010000; //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位
RCC->CFGR|=PLL<<18; //设置PLL值 2~16
RCC->CFGR|=1<<16; //PLLSRC ON
FLASH->ACR|=0x32; //FLASH 2个延时周期
RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟
while(temp!=0x02) //等待PLL作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
(1)、MYRCC_DeInit(); 配置向量表
(2)、RCC->CR|=0x00010000; 使能外部高速时钟,由时钟控制寄存器(RCC_CR)的第16位控制。
(3)、while(!(RCC->CR>>17));等待外部时钟就绪,外部时钟就绪后硬件置1
(4)、RCC->CFGR=0X00000400; 时钟配置寄存器(RCC_CFGR),设置低速APB1最大不超过36Mhz,由于系统最大为72Mhz,这里只需要设置为2分频,即100
(5)、 PLL-=2;和RCC->CFGR|=PLL<<18; 用来设置锁相环,由于外部使用的晶振为8Mhz,这样我们调用系统时钟时会设置为9(Stm32_Clock_Init(9);),这样会得到72Mhz的系统时钟,但是这样PLL 11倍频输出,这样系统时钟变成了8*11=88Mhz,因此需要先将PLL减2得到7,即0111,这样得到PLL 9倍频输出,8*9=72Mhz,这样就OK啦。
(6)、RCC->CFGR|=1<<16; 打开PLL时钟源。
(7)、FLASH->ACR|=0x32;延时一下,让CPU歇会
(8)、RCC->CR|=0x01000000; PLL使能
(9)、while(!(RCC->CR>>25));PLL时钟就绪硬件置1
(10)、RCC->CFGR|=0x00000002;设置PLL作为系统时钟
(11)、while(temp!=0x02) //等待PLL作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
} 用来查询系统时钟设置是否正常,配置正常后相应位硬件置1
(12)完成
总的来说有以下8部分组成:
1、打开外部晶振振荡器,由第16位控制,检测外部振荡器打开是否正常,由第17位指示
2、配置APB1时钟不超过36Mhz
3、设置锁相环的值
4、设置外部时钟PLL作为输入
5、稍微延时
6、启动锁相环,并检测工作是否正常
7、锁相环时钟正常之后,将它作为系统时钟
8、等待配置成功