【学习笔记】STM32F407探索者HAL库开发(四)F407时钟系统配置

1 F407_CubeMX时钟树配置(传送门)
- 宏定义 HSE_VALUE;
- 调用HAL_RCC_OscConfig()函数,配置输入时钟源;
- 调用HAL_RCC_ClockConfig()函数,配置系统时钟源以及 SYSCLK、AHB、APB1 和 APB2 相关参数;
- 在main函数中调用sys_stm32_clock_init()函数并设置形参;
注意:第2点和第3点中的函数均在sys_stm32_clock_init()函数中调用,main函数中只调用sys_stm32_clock_init()函数,且sys_stm32_clock_init()函数的描述在sys.c中,main.c中只配置该函数的四个形参。
为便于查找,在后续新项目的时钟系统配置时可以直接按照下图参数进行配置。具体详解见后文。
2 STM32F407时钟树
STM32内部也是由多种多样的电路模块组合在一起实现的。当一个电路越复杂,在达到正确的输出结果前,它可能因为延时会有一些短暂的中间状态,而这些中间状态有时会导致输出结果会有一个短暂的错误,这叫做电路中的“毛刺现象”,如果电路需要运行得足够快,那么这些错误状态会被其它电路作为输入采样,最终形成一系列的系统错误。为了解决这个问题,在单片机系统中,设计时以时序电路控制替代纯粹的组合电路,在每一级输出结果前对各个信号进行采样,从而使得电路中某些信号即使出现延时也可以保证各个信号的同步,可以避免电路中发生的“毛刺现象”,达到精确控制输出的效果。
由于时序电路的重要性,因此在MCU设计时就设计了专门用于控制时序的电路,在芯片设计中称为时钟树设计。由此设计出来的时钟,可以精确控制我们的单片机系统,这也是我们这节要展开分析的时钟分析。为什么是时钟树而不是时钟呢?一个MCU越复杂,时钟系统也会相应地变得复杂,如STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。
对于STM32F4系列的芯片,正常工作的主频可以达到168Mhz,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十Khz的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般都是采取多时钟源的方法来解决这些问题。
2.1 STM32F407时钟系统图
STM32本身非常复杂,外设非常的多,为了保持低功耗工作,STM32的主控默认不开启这些外设功能。用户可以根据自己的需要决定STM32芯片要使用的功能,这个功能开关在STM32主控中也就是各个外设的时钟。
如下图为一个简化的STM32F4时钟系统。图中已经把我们主要关注几处标注出来。
A部分表示输入时钟源,可分为外部时钟源和内部时钟源;
B为锁相环“PLL”;
C为我们重点需要关注的系统时钟源选择器,此项决定了MCU的系统主时钟“SYSCLK”的大小;AHB预分频器将SYSCLK分频或不分频后分发给其它外设进行处理,包括到D部分的Cortex-M内核系统的时钟和使能单元。
E为定时器以及其它外设的时钟源APB1/APB2。F是STM32的MCO时钟输出功能。
2.2 STM32F103时钟树简图
2.2.1 高速部分
HSE 4~26 MHz,HIS 16 MHz,F407的SYSCLK最大168MHz,无法达到,所以要/M分频之后,通过PLL锁相环,F1系列的锁相环只有一个2-16倍频器,F4的PLL中首先会经过一个*N的倍频器,再经过一个/P分频,作为系