开发板采用STM32F070RB,最大时钟速率为48MHZ,在STM32Cube MX中可以选择对应的芯片,得到它的时钟树如下所示:
分析时钟树,几种主要的时钟源分析如下
1、SYSCLK系统时钟的时钟源
—— 8MHZ HSI内部晶振
—— 8MHZ HSE外部晶振
—— PLLCLK(来源于倍频后的HSI或HSE)
2、RTC实时时钟的时钟源
—— HSE晶振32分频 250KHZ
—— LSE 外部低速晶振 32.768KHZ
—— LSI 内部低速晶振 40KHZ
3、USB时钟源
—— HSI内部晶振倍频
—— HSE外部晶振倍频(更准确)
4、ADC时钟源
—— HSI14RC 14MHZ
—— APB时钟2分频或4分频
5、 USART1时钟源
—— SYSCLK
—— HSI
—— LSE
—— PCLK1即APB1
6、MCO时钟输出引脚(PA8)
—— PLLCLK、HSI、HSI14、HSE、LSI、LSE、SYSCLK
7、挂靠AHB高速总线的设备
—— CPU、DMA、GPIO等
8、挂靠APB低速时钟线的设备
—— USART、TIM等
时钟配置中有一个Enable CSS,即允许Clock security system,如果使能宏变量 _HAL_RCC_CSS_ENABLE()或者在Cube MX中配置了Enable CSS,则当HSE时钟启用失败时,系统会自动切换到HSI作为时钟源,并产生一个NMI不可屏蔽中断。
STM32 RCC HAL库驱动主要在stm32f0xx_hal_rcc.c/h中
—— HAL_RCC_DeInit主要完成整个系统时钟的复位
—— HAL_RCC_OscConfig则根据RCC_OscInitStruct结构体的值对晶振进行初始化(HSE、HSI、LSI、LSE、HSI14、HSI48、PLL)
如果要通过这个函数实现HSI/HSE从打开到旁路(或旁路到打开)的转换,必须先关闭HSI/HSE
—— HAL_RCC_ClockConfig初始化CPU、AHB和APB时钟
—— HAL_RCC_MCOConfig选择MCO管脚输出的时钟源
—— HAL_RCC_GetSysClockFreq获取当前的SYSCLK时钟频率
—— HAL_RCC_EnableCSS/HAL_RCC_DisableCSS系统始终安全,选择HSE作为时钟源时可配置
—— HAL_RCC_NMI_IRQHandler处理RCC CSS中断,回调函数HAL_RCC_CSSCallback()可供用户重写
时钟的旁路模式,即不启用内部时钟驱动组件,直接引用外部时钟源,关于这点。这个博客上有很详细的说明:https://blog.csdn.net/wuyusheng314/article/details/78947096