1. 时钟树:
2. 三种时钟来源
● HSI振荡器时钟
● HSE振荡器时钟
● PLL时钟
2.1.二级时钟源
● 40kHz低速内部RC(LSI RC)振荡器,可以用于驱动独立看门狗或通过程序选择驱动RTC
● 选择32.768kHz低速外部晶体(LSE晶体)用来驱动RTC(RTCCLK)
2.2.HSE 时钟
以下两种时钟源产生:
● HSE外部晶体/陶瓷谐振器
● HSE用户外部时钟
2.3.HSI 时钟
由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。
2.4.PLL 时钟
产生倍频的输出,主PLL以下述时钟源之一为输入:
● HSI时钟除以2
● HSE或通过一个可配置分频器的PLL2时钟
2.5.LSE 时钟
是一个32.768kHz的低速外部晶体或陶瓷谐振器,为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源
2.6.LSI 时钟
担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。大约40kHz(在30kHz和60kHz之间)
2.7.时钟安全系统(CSS)
CSS 被激活,并且 HSE 时钟出现故障, CSS 中断就产生,并且 NMI 也自动产生。在 NMI 的处理程序中必须通过设置时钟中断寄存器(RCC_CIR) 里的 CSSC 位来清除 CSS 中断。
如果HSE振荡器被直接或间接地作为系统时钟,时钟故障将导致系统时钟自动切换到HSI振荡器。
3.系统时钟(SYSCLK) 选择
系统复位后,HSI振荡器被选为系统时钟。目标时钟源就绪了,从一个时钟源到另一个时钟源的切换才会发生。在时钟控制寄存器(RCC_CR)里的状态位指示哪个时钟已经准备好了,哪个时钟目前被用作系统时钟。
3.1.RTC 时钟
通过设置 里的RTCSEL[1:0]位,RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供。
3.2.看门狗时钟
如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关
闭。在LSI振荡器稳定后,时钟供应给IWDG。
3.3.时钟输出
允许输出时钟信号到外部MCO引脚,GPIO端口寄存器必须被配置为相应功能。小于50MHz(这是I/O端口的最大速度),时钟的选择寄存器(RCC_CFGR)中的MCO[3:0]位控制 。可被选作MCO的时钟:
● SYSCLK
● HSI
● HSE
● 除2的PLL时钟
● PLL2时钟
● PLL3时钟除以2
● XT1外部3~25MHz振荡器(用于以太网)
● PLL3时钟(用于以太网)
4.RCC 寄存器
4.1.时钟控制寄存器(RCC_CR)
4.2.时钟配置寄存器(RCC_CFGR)
5.stm32f10x_rcc.c文件里的函数
5.1 void RCC_DeInit(void)
功能:将RCC时钟配置重置为默认重置状态
5.2 void RCC_HSEConfig(uint32_t RCC_HSE)
功能:配置外部高速振荡器(HSE)(被直接或间接用到的时候不能停止)
参数:改变HSE新状态
RCC_HSE_OFF: 外部高速振荡器HSE关闭
RCC_HSE_ON: 外部高速振荡器HSE打开
RCC_HSE_Bypass: 外部时钟绕过HSE振荡器
5.3 ErrorStatus RCC_WaitForHSEStartUp(void)
功能:等待HSE启动
返回值:错误状态枚举值
SUCCESS: 振荡器HSE稳定,随时可用
ERROR: 振荡器HSE尚未就绪
5.4 void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue)
功能:调整内部高速振荡器(HSI)校准值
参数:指定校准微调值
0-0x1F
5.5 void RCC_HSICmd(FunctionalState NewState)
功能:启用或禁用内部高速振荡器(HSI)
参数:NewState
ENABLE
DISABLE
5.6 void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul)
功能:配置锁相环源与倍频因子(在PLL失效时配置)
参数1:RCC_PLLSource
RCC_PLLSource_HSI_Div2:选择HSI/2作为PLL时钟源
RCC_PLLSource_HSE_Div1:选择HSE作为PLL时钟源
RCC_PLLSource_HSE_Div2:选择HSE/2时钟作为PLL时钟源
参数2:RCC_PLLMul
此参数可以是rcc_pllmul_x,其中x:[2,16]
5.7 void RCC_PLLCmd(FunctionalState NewState)
功能:启用或禁用PLL
参数:NewState:
ENABLE
DISABLE
5.8 void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource)
功能:配置系统时钟(sysclk)
参数:RCC_SYSCLKSource:
RCC_SYSCLKSource_HSI
RCC_SYSCLKSource_HSE
RCC_SYSCLKSource_PLLCLK
5.9 uint8_t RCC_GetSYSCLKSource(void)
功能:返回用作系统时钟的时钟源
返回值:
0x00: 系统时钟为 HSI
0x04:系统时钟为 HSE
0x08:系统时钟为 PLL
5.10 void RCC_HCLKConfig(uint32_t RCC_SYSCLK)
功能:设置AHB时钟(HCLK)
参数:RCC_SYSCLK
RCC_SYSCLK_Div1: AHB = SYSCLK
RCC_SYSCLK_Div2: AHB = SYSCLK/2
RCC_SYSCLK_Div4: AHB = SYSCLK/4
RCC_SYSCLK_Div8: AHB = SYSCLK/8
RCC_SYSCLK_Div16: AHB = SYSCLK/16
RCC_SYSCLK_Div64: AHB = SYSCLK/64
RCC_SYSCLK_Div128: AHB = SYSCLK/128
RCC_SYSCLK_Div256: AHB = SYSCLK/256
RCC_SYSCLK_Div512: AHB = SYSCLK/512
5.11 void RCC_PCLK1Config(uint32_t RCC_HCLK)
功能:配置低速ABP时钟(PCLK1)
参数:RCC_HCLK
RCC_HCLK_Div1: APB1 = HCLK
RCC_HCLK_Div2: APB1 = HCLK/2
RCC_HCLK_Div4: APB1 = HCLK/4
RCC_HCLK_Div8: APB1 = HCLK/8
RCC_HCLK_Div16: APB1 = HCLK/16
5.12 void RCC_PCLK2Config(uint32_t RCC_HCLK)
功能: 配置高速ABP时钟(PCLK2)
参数:RCC_HCLK
RCC_HCLK_Div1: APB2 = HCLK
RCC_HCLK_Div2: APB2 = HCLK/2
RCC_HCLK_Div4: APB2 = HCLK/4
RCC_HCLK_Div8: APB2 = HCLK/8
RCC_HCLK_Div16: APB2 = HCLK/16
5.13 void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState)
功能: 启用或禁用指定的RCC中断
参数1:RCC_IT
RCC_IT_LSIRDY: LSI 就绪中断
RCC_IT_LSERDY: LSE 就绪中断
RCC_IT_HSIRDY: HSI 就绪中断
RCC_IT_HSERDY: HSE 就绪中断
RCC_IT_PLLRDY: PLL 就绪中断
参数1:NewState
ENABLE
DISABLE
5.14 void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource)
功能:配置USB时钟(USBCLK)
参数:RCC_USBCLKSource
RCC_USBCLKSource_PLLCLK_1Div5: USB = PLL/5
RCC_USBCLKSource_PLLCLK_Div1: USB = PLL
5.15 void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)
功能:配置ADC时钟(ADCCLK)
参数:RCC_PCLK2
RCC_PCLK2_Div2: ADC = PCLK2/2
RCC_PCLK2_Div4: ADC = PCLK2/4
RCC_PCLK2_Div6: ADC = PCLK2/6
RCC_PCLK2_Div8: ADC = PCLK2/8
5.16 void RCC_LSEConfig(uint8_t RCC_LSE)
功能:配置外部低速时钟(LSE)
参数:RCC_LSE
arg RCC_LSE_OFF: 关闭外部低速时钟 LSE
RCC_LSE_ON: 关闭外部低速时钟 LSE
RCC_LSE_Bypass: 绕过外部低速时钟 LSE
5.17 void RCC_LSICmd(FunctionalState NewState)
功能:使能或禁止外部低速时钟(LSE)(IDDG运行则不能关闭 LSE)
参数:NewState
ENABLE
DISABLE
5.18 void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource)
功能:配置 RTC 时钟(RTCCLK)(被选择后不能改变,除非后备重置)
参数:RCC_RTCCLKSource
RCC_RTCCLKSource_LSE: LSE 作为 RTC 时钟
RCC_RTCCLKSource_LSI: LSI 作为 RTC 时钟
RCC_RTCCLKSource_HSE_Div128: HSE/128 作为 RTC 时钟
5.19 void RCC_RTCCLKCmd(FunctionalState NewState)
功能:使能或禁止 RTC 时钟
参数:NewState
ENABLE
DISABLE
5.20 void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
功能: 返回不同片上时钟的频率
参数: RCC_Clocks
指向将保存时钟频率的 RCC 时钟结构的指针
5.21 void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
功能:使能或禁止 AHB 时钟
参数1:RCC_AHBPeriph
RCC_AHBPeriph_DMA1
RCC_AHBPeriph_DMA2
RCC_AHBPeriph_SRAM
RCC_AHBPeriph_FLITF
RCC_AHBPeriph_CRC
RCC_AHBPeriph_FSMC
RCC_AHBPeriph_SDIO
参数2:NewState
ENABLE
DISABLE
5.22 void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
功能:使能或禁止 APB2 高速外设时钟
参数1:RCC_APB2Periph
RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11
参数2:NewState
ENABLE
DISABLE
5.23 void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
功能:使能或禁止 APB1 低速外设时钟
参数1:RCC_APB1Periph
RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4,
RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
参数2:NewState
ENABLE
DISABLE
5.24 void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
功能:强制或释放高速 APB2 外围设备重置
参数1:RCC_APB2Periph
RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11
参数2:NewState
ENABLE
DISABLE
5.25 void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
功能:强制或释放高速 APB1 外围设备重置
参数1:RCC_APB1Periph
RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4,
RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
参数2:NewState
ENABLE
DISABLE
5.26 void RCC_BackupResetCmd(FunctionalState NewState)
功能:强制或释放备份域重置
参数:NewState
ENABLE
DISABLE
5.27 void RCC_ClockSecuritySystemCmd(FunctionalState NewState)
功能:启用或禁用时钟安全系统
参数:NewState
ENABLE
DISABLE
5.28 void RCC_MCOConfig(uint8_t RCC_MCO)
功能:选择要在 MCO 引脚上输出的时钟源
参数:RCC_MCO
RCC_MCO_NoClock: 无输出
RCC_MCO_SYSCLK: 系统时钟输出
RCC_MCO_HSI: HSI 时钟输出
RCC_MCO_HSE: HSE 时钟输出
RCC_MCO_PLLCLK_Div2: PLL/2 输出
5.29 FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)
功能:检查是否设置了指定的RCC标志
参数:RCC_FLAG
RCC_FLAG_HSIRDY: HSI 时钟准备
RCC_FLAG_HSERDY: HSE 时钟准备
RCC_FLAG_PLLRDY: PLL 时钟准备
RCC_FLAG_LSERDY: LSE 时钟准备
RCC_FLAG_LSIRDY: LSI 时钟准备
RCC_FLAG_PINRST: 引脚复位
RCC_FLAG_PORRST: POR/PDR 复位
RCC_FLAG_SFTRST: 软件复位
RCC_FLAG_IWDGRST: 独立看门狗复位
RCC_FLAG_WWDGRST: 窗口看门狗复位
RCC_FLAG_LPWRRST: 低电压复位
返回值:
SET
RESET
5.30 void RCC_ClearFlag(void)
功能:清 RCC 复位标志位
RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST,
RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST
5.31 ITStatus RCC_GetITStatus(uint8_t RCC_IT)
功能:检查是否发生了指定的RCC中断
参数:RCC_IT
RCC_IT_LSIRDY: LSI 就绪中断
RCC_IT_LSERDY: LSE 就绪中断
RCC_IT_HSIRDY: HSI 就绪中断
RCC_IT_HSERDY: HSE 就绪中断
RCC_IT_PLLRDY: PLL 就绪中断
RCC_IT_CSS: 检查系统安全中断
5.32 void RCC_ClearITPendingBit(uint8_t RCC_IT)
功能:清除 RCC 的中断挂起标志位
参数:RCC_IT
RCC_IT_LSIRDY: LSI 就绪中断
RCC_IT_LSERDY: LSE 就绪中断
RCC_IT_HSIRDY: HSI 就绪中断
RCC_IT_HSERDY: HSE 就绪中断
RCC_IT_PLLRDY: PLL 就绪中断
6.启用外部时钟的一般步骤
INT8U RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
INT8U Count, Result = 0;
RCC_DeInit(); // 1、将RCC时钟配置重置为默认重置状态
RCC_HSEConfig(RCC_HSE_ON); // 2、Enable HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); // 3、等待HSE就绪
if(HSEStartUpStatus == SUCCESS)
{
// 基础应用1,FLASH时序延迟几个周期,等待总线同步操作。
// 推荐按照单片机系统运行频率:0―24MHz时,取Latency=0;
// 24―48MHz时,取Latency=1;48~72MHz时,取Latency=2。
// 位置:RCC初始化子函数里面,时钟起振之后。
FLASH_SetLatency(FLASH_Latency_1);
// 基础应用2,开启FLASH预读缓冲功能,加速FLASH的读取。
// 位置:RCC初始化子函数里面,时钟起振之后。 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
// 4、AHB时钟:HCLK = SYSCLK / 1
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// 5、高速AHB时钟:PCLK2 = HCLK / 8
RCC_PCLK2Config(RCC_HCLK_Div8);
// 6、低速AHB时钟:PCLK1 = HCLK / 8
RCC_PCLK1Config(RCC_HCLK_Div8);
// 7、设置PLL PLLCLK = 7.3728 MHz * 4 = 29.4912 MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
// 8、Enable PLL
RCC_PLLCmd(ENABLE);
// 9、等待PLL 就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
// 10、选择PLL作系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// 或选择外部时钟作系统时钟源
// RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
// 11、等待 PLL 作系统时钟源
while(RCC_GetSYSCLKSource() != 0x08);
}
else
{
Result = 1;
}
// 12、打开要使用的外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1
| RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3
| RCC_APB1Periph_CAN1 , ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//SysTick_Config(f(SYSCLK) / 1000) (ms)
Count = 5;
do{
if(0 == SysTick_Config(29491)) // 1ms
{
break;
}
} while(Count--);
if(0 == Count)
{
Result |= 2;
}
return Result;
}