概念:
HSI振荡器时钟:
系统上电默认时钟,内部振荡器 8MHZ,可以直接作为系统时钟或在2分频后作为PLL的输入。时钟频率精度较差
HSE 振荡器时钟 外部:
提供非常精确的主时钟,板上的 8MHZ
PLL 倍频:
时钟源输入: HSI时钟/2, HSE或通过一个可配置分频的PLL2时钟
LSE 时钟:
LSE晶体是一个32.867的低速外部晶体。提供实时时钟
LSI时钟 Internal 内部:
LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保存运行。为独立看门狗和自动唤醒单元提供时钟。LSI时钟频率大约40KHZ。
配置时钟流程:
1.将RCC寄存器重新设置为默认值
RCC_DeInit
2.打开外部高速时钟晶振HSE
RCC_HSEConfig(RCC_HSE_ON);
3.等待外部高速时钟晶振工作
HSEStartUpStatus =RCC_WaitForHSEStartUp();
4.设置AHB时钟
RCC_HCLKConfig;
5.设置高速APB2时钟RCC_PCLK2Config;
6.设置低速速APB1时钟
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()
//*******************************************************************************
* Function Name: RCC_Configuration
* Description: Configures the different system clocks.
* Input: None
* Output: None
* Return: None
//*******************************************************************************
ErrorStatus HSEStartUpStatus;
void RCC_Configuration(void)
{
RCC_DeInit();
//RCC system reset
RCC_HSEConfig(RCC_HSE_ON);
// Enable HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp();
// Wait till HSE is ready
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
// Enable Prefetch Buffer
FLASH_SetLatency(FLASH_Latency_2);
// Flash 2 wait state
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
// PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div1);
// PCLK1 = HCLK
#ifdefHSE_Value_8M
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
// PLLCLK = 8MHz/2 * 9 = 36 MHz
#elif defined HSE_Value_12M
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_6);
// PLLCLK = 12MHz/2 * 6 = 36 MHz
#endif
RCC_PLLCmd(ENABLE);
// Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)// Wait till PLL is ready
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// Select PLL as system clock source
while(RCC_GetSYSCLKSource() != 0x08)// Wait till PLL is used as system clock source
{}
}
/* Enable PWR and BKP clocks
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/* Enable DMA clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable AFIO clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
/*GPIOA Periph clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/* GPIOB Periph clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/* GPIOC Periph clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
/* GPI0D Periph clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
/* GPI0E Periph clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
/* Enable TIM1 clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/* EnableTIM2TIM3TIM4 clocks
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);
/*Enable USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/* Enable USART2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
/*Enable USART3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
/*EnableI2C1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
/*EnableADC1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
/*Enable ADC2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);
/* DAC Periph clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
} 【stm32的RCC配置】
推荐阅读
- stm32|基于STM32和freeRTOS智能门锁设计方案
- 日常分享|共享充电宝方案原理,具体部件组成以及主控MUC参数
- #|ARM裸机开发(汇编LED灯实验(I.MX6UL芯片))
- STM32|STM32的四种IO输出模式
- STM32 远程升级(ISP / IAP)
- stm32|stm32f103can总线过滤器配置
- STM32CubeMX配置SDIO模式(非DMA方式)
- STM32|如何建一个STM32F030标准库工程模板
- STM32 时钟RCC相关配置参考stm32f10x_rcc.h
- STM32 NVIC