STM32有3个系统时钟源(HSI、HSE和PLL)和2个RTC时钟源(LSI和LSE),系统上电默认是HSI 8MHZ启动,要想系统跑72MHZ,则必须对RTC时钟进行配置。
寄存器配置大致步骤:
1) 打开HSE外部高速时钟,并等待至其打开
RCC_CR |= 0x00010000; //set HSEON ON
while((RCC_CR & (1<<17)) == 0); //HSERDY ON?
2) 设置HCLK、PCLK1和PCLK2时钟
RCC_CFGR &= 0xFFFFFF0F; //HCLK=SYSCLK
RCC_CFGR &= 0xFFFFC7FF; //PCLK2=HCLK
RCC_CFGR = (RCC_CFGR & 0xFFFFF8FF) | 0x00000400; //PCLK1=HCLK/2
3)使能预取值缓冲
FLASH_ACR |= 0x00000010;
FLASH_ACR =(FLASH_ACR & 0xFFFFFFF8) | 0x00000002;
4)设置PLL倍频,并打开PLL时钟(PLL可取2~16,但最好别超过72MHZ)
RCC_CFGR = (RCC_CFGR & 0xFFDFFFFF) | 0x00D00000;
RCC_CR |= 1<<24;
while((RCC_CR & (1<<25)) == 0);
5)配置PLL时钟为系统时钟源,并等待配置完成
RCC_CFGR = (RCC_CFGR & 0xFFFFFFFE) | 0x00000002;
while((RCC_CFGR & 0x0000000C) != 0x08);
库函数版:
RCC_DeInit(); //将外设RCC寄存器重设为缺省值
//设置外部高速晶振(HSE)
RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打开(ON)
//等待HSE起振
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪
{
//设置AHB时钟(HCLK)
RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB时钟= 系统时钟
/*/设置高速AHB时钟(PCLK2)
RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟= HCLK
//设置低速AHB时钟(PCLK1)
RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1时钟= HCLK / 2
//设置FLASH存储器延时时钟周期数
FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延时周期
//选择FLASH预取指缓存的模式
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLL=输入时钟HSEx 9
RCC_PLLCmd(ENABLE); //使能PLL
//检查指定的RCC标志位(PLL准备好标志)设置与否
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
;
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟(SYSCLK),选择PLL作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作为系统时钟
;