为什么需要时钟树
- stm32由多个数字电路组成的一个复杂的电路,当电路在输出正确结果之前,它可能由于延迟有一个短暂的中间状态,而这些中间状态会导致结果输出一个短暂错误,这种现象就是电路中的毛刺现象。(逻辑门电路输出结果有延迟,就有可能将中间态输入给下个门电路)如果电路运行的很快,那么这些毛刺会作为其它电路的输入采样,最终导致一个系统错误。
- 为了解决这种现象,在电路中加入时钟信号组成时序电路,电路都按照这个时钟信号节奏同步进行,那么就避免了门电路延迟导致的中间态问题了。
stm32 时钟系统
- 时钟源
HSI、HSE、LSE、LSI 分别是高速内部时钟信号、高速外部时钟信号、低速外部时钟信号、低速内部时钟信号;
内部时钟源:内部RC振荡器,HSI为8MHZ;LSI为40KHZ,可作为独立看门狗时钟源;
外部时钟源:外部振荡器,HSE为4MHZ~16MHZ;LSE为32.768KHZ,主要作为RTC时钟源;
系统上电默认由HSI时钟启动,如果用户进行了硬件和软件的配置,芯片才会尝试从内部时钟源切换到外部时钟源。 - PLL 锁相环
什么是锁相环:锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
为什么使用锁相环:锁相环是一个相位误差的控制系统,通过比较参考信号和输出信号之间的相位,产生相位误差来调整输出信号,来达到与参考信号同频的目的。
图中:
1 PLLXTPRE: HSE分频器作为PLL的输入
2 PLLSRC: PLL输入时钟源
3 PLLMUL: PLL倍频系数 - SYSCLK系统时钟
系统时钟为整个芯片提供时序信号;
图中可以看到,HSI、PLLCLK、HSE可以选择一个作为系统时钟;
系统时钟为 AHB、APB1、APB2等提供时钟。通过AHB预分频器提供时钟。
USBCLK:是一个通用串行接口时钟,时钟来源于 PLLCLK;
MCO:内部输出时钟,可以为外部提供时钟源。 - 系统时钟配置,寄存器设置请查看对应手册。
提一些hal库的api:
1 配置 HSE_VALUE(STM32F1xx_hal_conf.h)
2 调用 SystemInit 函数(system_stm32f1xx.c)1) 外部存储器配置2) 中断向量表地址配置
3 在 main 函数里调用用户编写的时钟设置函数
STM32F1xx_hal_rcc.h
1)配置时钟源相关参数HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);
2)配置系统时钟源,以及 SYSCLK、AHB、APB1 和 APB2 相关参数HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency);