时钟树
小树部分:
RTC的时钟信号是由LSE以及LSi这个小树构建的32.768KHz的时钟产生的时钟信号来得到的,因为这个可以得到刚好是1hz的时钟信号,这种频率信号可以实现每一秒钟就会产生一个脉冲,就可以实现计时时间了。
大树部分:这个产生的时钟信号一般是1M的整数倍,也就是2Mhz,12mhz这种。
一般就是由HSE以及HSI产生的信号,经过一个锁相环(对时钟信号进行一个倍频操作-做乘法操作),然后就会AHB分频器的位置,此时就会对输入的时钟信号进行一个除法。然后后面就是APB1或者APB2分频器了
AHB系统总线 72Mhz ;APB1外设总线36Mhz;APB2外设总线2 72MHz
树根部分的几个名词:大树的底部都是H开始,小树就是L开始
- HSI:高速,Speed Internal 固定8M
- HSE:External 是外部的一颗晶振 4-16MHz
- LSI:固定32.768kHZ
- LSE:
锁相环
作用:对输入的信号做一个乘法,最低就是2倍频,最高16倍频
输入的信号来源:根据时钟树里面的这个具体的连线得到的
总线和树枝:
在STM32通过陀螺仪控制二维云台的工程中,这个中RCC.h的源文件中的注释
配置时钟树–根据相应的函数就可以了
- 开启HSE
- 配置PLL锁相环
- 设置SYSCLK
- 产生HCLK,PCLK1和PCLK2。几个函数中确定分频参数
- 关闭HSI
头文件中的相应的注释
/*配合进阶版本中的markdown看*/
void RCC_DeInit(void);
void RCC_HSEConfig(uint32_t RCC_HSE); /*HSE 外部高速时钟的开关,开启的时候还需要进行一个判断是不是开启好了,因为这个是有一个时间的 */
ErrorStatus RCC_WaitForHSEStartUp(void);/**/
void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue);
void RCC_HSICmd(FunctionalState NewState);//内部高速时钟开关,在配置HSE的相关时钟之后就可以关闭HSI了
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);//确定锁相环的两个参数,也就是下面连接的子树,倍频系数,时钟树来源
void RCC_PLLCmd(FunctionalState NewState);//pll开关,PLL就是锁相环 enable /disable,此时开启也是需要一定时间的所以也就是要用下面的判断RCC状态的函数进行判断是不是SET了
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL)
void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div);
#endif
#ifdef STM32F10X_CL
void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div);
void RCC_PLL2Config(uint32_t RCC_PLL2Mul);
void RCC_PLL2Cmd(FunctionalState NewState);
void RCC_PLL3Config(uint32_t RCC_PLL3Mul);
void RCC_PLL3Cmd(FunctionalState NewState);
#endif /* STM32F10X_CL */
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); /*SYSCLK来源,也就是时钟树中的AHB,三个来源分别是HSI/HSE/中间的锁相环*/
uint8_t RCC_GetSYSCLKSource(void);
void RCC_HCLKConfig(uint32_t RCC_SYSCLK); //z这下面这三个函数都是控制下面这个总线上面的三个时钟 AHB,APB1,APB2,形参就是分频系数
void RCC_PCLK1Config(uint32_t RCC_HCLK);//最高只有36MHZ,所以这个就是让HCK经过2分频得到就可。/
void RCC_PCLK2Config(uint32_t RCC_HCLK);//这个最高可以由72MHZ
void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);
#ifndef STM32F10X_CL
void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);
#else
void RCC_OTGFSCLKConfig(uint32_t RCC_OTGFSCLKSource);
#endif /* STM32F10X_CL */
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
#ifdef STM32F10X_CL
void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource);
void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource);
#endif /* STM32F10X_CL */
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);
#ifdef STM32F10X_CL
void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
#endif /* STM32F10X_CL */
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); //获取RCC的状态,也即是查标志位。开始了就是SET不然就是ReSET
void RCC_ClearFlag(void);
ITStatus RCC_GetITStatus(uint8_t RCC_IT);
void RCC_ClearITPendingBit(uint8_t RCC_IT);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F10x_RCC_H */
C_ClearITPendingBit(uint8_t RCC_IT);
#ifdef __cplusplus
}
#endif
#endif /* __STM32F10x_RCC_H */