下面我们根据这张图说说有关STM32时钟系统的那些事
/** * @brief Reset and Clock Control */ typedef struct { __IO uint32_t CR; // HSI,HSE,CSS,PLL等的使能和就绪标志位 __IO uint32_t CFGR; // PLL等的时钟源选择,分频系数设定 __IO uint32_t CIR; // 清除/使能 时钟就绪中断 __IO uint32_t APB2RSTR; // APB2线上外设复位寄存器 __IO uint32_t APB1RSTR; // APB1线上外设复位寄存器 __IO uint32_t AHBENR; // DMA,SDIO等时钟使能 __IO uint32_t APB2ENR; // APB2线上外设时钟使能 __IO uint32_t APB1ENR; // APB1线上外设时钟使能 __IO uint32_t BDCR; // 备份域控制寄存器 __IO uint32_t CSR; // 控制状态寄存器 #ifdef STM32F10X_CL __IO uint32_t AHBRSTR; __IO uint32_t CFGR2; #endif /* STM32F10X_CL */ #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) uint32_t RESERVED0; __IO uint32_t CFGR2; #endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ } RCC_TypeDef;
__IO uint32_t CR; // HSI,HSE,CSS,PLL等的使能和就绪标志位 __IO uint32_t CFGR; // PLL等的时钟源选择,分频系数设定 __IO uint32_t AHBENR; // DMA,SDIO等时钟使能 __IO uint32_t APB2ENR; // APB2线上外设时钟使能 __IO uint32_t APB1ENR; // APB1线上外设时钟使能
外设时钟使能寄存器-控制AHB,APB1,APB2
例如:
AHB控制SDIO时钟,CRC时钟使能
APB1控制IO口时钟使能
APB1控制串口使能,I2
更多配置项参考数据手册
时钟源的使能和就绪标志位
使能时钟源(CR振荡器和外部晶振),使能后不能立刻稳定(有一个起振的过程),需要等待稳定
稳定后会在CR寄存器设置标志位
设置时钟源的选择和分频/倍频系数寄存器
RCC_CDGR寄存器:
所有选择器的最终选择结果都是有CFGR寄存器配置的
所有预分频器/倍频器的实际参数也是由CFGR寄存器配置的
库函数分类
//时钟源使能配置 RCC_LSEConfig(), RCC_HSEConfig(), RCC_HSICmd(), RCC_LSICmd(), RCC_PLLCmd()... //时钟源选择配置:(最终配置的是CFGR寄存器) RCC_PLLConfig(), RCC_SYSCLKConfig(), RCC_RTCCLKConfig()... //分频系数选择 RCC_HCLKConfig(); RCC_PCLK1Config(); RCC_PCLK2Config(); //外设时钟使能: RCC_APB1PeriphClockCmd(); //APB1线上外设使能 RCC_APB2PeriphClockCmd(); //APB2线上外设使能 RCC_AHBPeriphClockCmd(); //AHB线上外设使能 //其他外设时钟使能: RCC_ADCCLKConfig(); RCC_RTCCLKConfig() //状态参数获取参数: RCC_GetClocksFreq(); RCC_GetSYSCLKSource(); RCC_GetFlagStatus(); //RCC中断相关函数: RCC_ITConfig(); RCC_GetITStatus(); RCC_ClearITPendingBit();
联系客服