STM32单片机时钟配置库函数解析
- 文章目的
- 时钟图
- 库函数内容及作用
- void RCC_DeInit(void);
- void RCC_HSEConfig(uint32_t RCC_HSE);
- ErrorStatus RCC_WaitForHSEStartUp(void);
- void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);
- void RCC_HSICmd(FunctionalState NewState);
- void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
- void RCC_PLLCmd(FunctionalState NewState);
- void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
- uint8_t RCC_GetSYSCLKSource(void);
- void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
- void RCC_PCLK1Config(uint32_t RCC_HCLK);
- void RCC_PCLK2Config(uint32_t RCC_HCLK);
- void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);
- void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);
- void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
- void RCC_LSEConfig(uint8_t RCC_LSE);
- void RCC_LSICmd(FunctionalState NewState);
- void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
- void RCC_RTCCLKCmd(FunctionalState NewState);
- void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks);
- void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
- void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
- void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
- void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
- void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
- void RCC_BackupResetCmd(FunctionalState NewState);
- void RCC_ClockSecuritySystemCmd(FunctionalState NewState);
- void RCC_MCOConfig(uint8_t RCC_MCO);
- FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
- void RCC_ClearFlag(void);
- ITStatus RCC_GetITStatus(uint8_t RCC_IT);
- void RCC_ClearITPendingBit(uint8_t RCC_IT);
- 举例说明
文章目的
扫盲stm32单片机时钟配置函数作用,方便后续开发。
时钟图
图1:时钟树
)图2:系统结构图
库函数内容及作用
void RCC_DeInit(void);
复位RCC时钟配置为默认复位状态。一般在配置时钟之前使用。
void RCC_HSEConfig(uint32_t RCC_HSE);
配置外部高速振荡器(HSE),RCC_HSE =
RCC_HSE_OFF //关闭高速外部晶振
RCC_HSE_ON//打开高速外部晶振
RCC_HSE_Bypass //外部时钟旁路的HSE振荡器,这个模式一般是多CPU协作,直接引入其他主单片机的时钟输出。
ErrorStatus RCC_WaitForHSEStartUp(void);
等待高速外部晶振稳定,当返回值!=0时稳定。通常用来开启外部高速时钟后,判断稳定了再进行后续时钟配置。
void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);
调整内部高速振荡器(HSI)校准值。传入参数为微调整的数值
void RCC_HSICmd(FunctionalState NewState);
高速内部时钟使能。
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
PLL配置,选择PLL时钟源及乘法因子(倍频数)
void RCC_PLLCmd(FunctionalState NewState);
使能PLL
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
设置系统时钟来源,如下图,可选RCC_SYSCLKSource_HSI;RCC_SYSCLKSource_HSE;或RCC_SYSCLKSource_PLLCLK
uint8_t RCC_GetSYSCLKSource(void);
获取系统时钟源,如上图,返回0x00: HSI; 0x04: HSE; 0x08: PLL
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
配置AHB时钟,选择分频数。
void RCC_PCLK1Config(uint32_t RCC_HCLK);
配置低速APB1的分频数。
void RCC_PCLK2Config(uint32_t RCC_HCLK);
配置高速APB2的分频数。
)
void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);
配置RCC触发中断源,中断源可以任意组合。
void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);
配置USB时钟分频数,1或1.5
)
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
配置ADC的时钟分频数
))
void RCC_LSEConfig(uint8_t RCC_LSE);
配置外部低速晶振,打开、关闭或旁路模式。
)
void RCC_LSICmd(FunctionalState NewState);
外部低速晶振使能。
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
RTC时钟源选择,低速外部、低速内部 或 高速外部÷128
)
void RCC_RTCCLKCmd(FunctionalState NewState);
使能RTC时钟。
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks);
返回片上时钟的频率,当对HSE晶体使用分数值时,该函数的结果可能不正确。
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
使能挂在AHB时钟线上的外设时钟包括:RCC_AHBPeriph_DMA1、RCC_AHBPeriph_DMA2、RCC_AHBPeriph_SRAM、RCC_AHBPeriph_CRC等
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
使能挂在APB2上的外设时钟,包括:RCC_APB2Periph_AFIO、RCC_APB2Periph_GPIOA等
)
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
使能挂在APB1上的外设时钟,包括:RCC_APB1Periph_TIM2、RCC_APB1Periph_TIM3等
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
释放高速APB (APB2)外围时钟。
void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
释放低速APB (APB1)外围时钟。
void RCC_BackupResetCmd(FunctionalState NewState);
释放备份区域外围时钟。
void RCC_ClockSecuritySystemCmd(FunctionalState NewState);
启用或禁用时钟安全系统。
void RCC_MCOConfig(uint8_t RCC_MCO);
选择时钟源输出到MCO引脚。一般用来检查配置的时钟是否正确。
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
检查设置的RCC标志是否置位,如RCC_FLAG_HSERDY等。
void RCC_ClearFlag(void);
清除RCC标志位
ITStatus RCC_GetITStatus(uint8_t RCC_IT);
检查指定的RCC中断标志位是否置位;
void RCC_ClearITPendingBit(uint8_t RCC_IT);
清除中断标志位。
举例说明
void Clock_Init_Config(void)
{
RCC_DeInit(); //复位时钟配置
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速时钟
while(!RCC_WaitForHSEStartUp()); //等待外部高速时钟稳定
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//选择PLL时钟源为外部高速时钟,进行9倍频(共72Mhz)
RCC_PLLCmd(ENABLE); //使能PLL
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择系统时钟来源为PLL
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB总线时钟为1分频,即72MHz
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB2为72MHz
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB1为36Mhz
}
本文完。