stm32时钟配置
stm32的时钟比51种类多,在这归纳总结
?
一 stm32有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
?
?①HSI是高速内部时钟,RC振荡器,频率为8MHz
?
?②HSE?? 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
?
③LSI??? 是低速内部时钟,RC振荡器,频率为40kHz。
?
?
④LSE??? 是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤PLL??
是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。是高速内部时钟,RC振荡器,频率为8MHz。
??
二 使用HSE时钟,程序设置时钟参数流程:
1、将RCC寄存器重新设置为默认值? ???????????? RCC_DeInit;
2、打开外部高速时钟晶振HSE???????????????????????RCC_HSEConfig(RCC_HSE_ON);
3、等待外部高速时钟晶振工作?????????????????????HSEStartUpStatus = RCC_WaitForHSEStartUp();
4、设置AHB时钟??????????????????????????????????????????????RCC_HCLKConfig;
5、设置高速AHB时钟??????????????????????????????????????RCC_PCLK2Config;
6、设置低速速AHB时钟??????????????????????????????????RCC_PCLK1Config;
7、设置PLL????????????????????????????????????????????????????? ?RCC_PLLConfig;
8、打开PLL????????????????????????????????????????????????? ?????RCC_PLLCmd(ENABLE);
9、等待PLL工作???????????????????????????????????while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
10、设置系统时钟??????????????????????????????????????????RCC_SYSCLKConfig;
11、判断是否PLL是系统时钟?????????????while(RCC_GetSYSCLKSource() != 0x08)
12、打开要使用的外设时钟? ??????????? RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()
三?RCC的配置函数举例(使用外部8MHz晶振)
/*******************************************************************************
* Function Name??: RCC_Configuration
* Description? ? :??RCC配置(使用外部8MHz晶振)
* Input? ?? ?? ?? ?: 无
* Output? ?? ?? ?: 无
* Return? ?? ?? ?: 无
*******************************************************************************/
void RCC_Configuration(void)
{
??/*将外设RCC寄存器重设为缺省值 */
??RCC_DeInit();
??/*设置外部高速晶振(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);? ???// 预取指缓存使能
? ? /*设置PLL时钟源及倍频系数*/
? ? RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);? ?
// PLL的输入时钟 = HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9
? ?
??/*使能PLL */
? ? RCC_PLLCmd(ENABLE);
? ? /*检查指定的RCC标志位(PLL准备好标志)设置与否*/? ?
? ? while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)? ???
? ?? ? {
? ?? ? }
? ? /*设置系统时钟(SYSCLK) */
? ? RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟
? ? /* PLL返回用作系统时钟的时钟源*/
? ? while(RCC_GetSYSCLKSource() != 0x08)? ???//0x08:PLL作为系统时钟
? ?? ? {
? ?? ? }
? ???}
/*使能或者失能APB2外设时钟*/? ?
??RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC , ENABLE);
//RCC_APB2Periph_GPIOA? ? GPIOA时钟
//RCC_APB2Periph_GPIOB? ? GPIOB时钟
//RCC_APB2Periph_GPIOC? ? GPIOC时钟
//RCC_APB2Periph_GPIOD? ? GPIOD时钟
}
?
?