STM32L4x系列芯片运行的主频最高可达80MHz,但芯片内部自带的振荡器或外部晶体均达不到这么高的频率,为了最大限度发挥芯片的性能,需要提供一种机制,将这些时钟源的频率倍频到接近或等于80MHz,以充分发挥芯片的性能。所以STM32L4x系列芯片内部提供了一种倍频电路,即PLL。
STM32L41x/42x/43x/44x/45x/46x系列芯片内部嵌入了2个PLL:PLL、PLLSAI1。每个PLL最多提供三个独立的输出,如下图:
STM32L47x/48x/49x/4ax系列芯片内部嵌入了3个PLL:PLL、PLLSAI1、PLLSAI2。每个PLL最多提供三个独立的输出,如下图:
可以用作PLL输入时钟的时钟源包括:
- MSI :内部多频率时钟,时钟频率可以设定,频率范围从100kHz到48MHz
- HSI16:内部高速16MHz
- HSE:外部高速晶体振荡器,频率范围是4MHz到48MHz
这三个时钟通过寄存器(RCC_PLLCFGR)的(PLLSRC[1:0])位(图1)来选择其中一个作为PLL的输入时钟。
图1
由于PLL输入频率必须在4MHz到16MHz之间,如果被选择的输入时钟频率大于16MHz,那么可以通过寄存器(RCC_PLLCFGR)的(PLLM[2:0])位(图1)将输入的时钟频率进行分频,其分频系数为:/1 /2 /3 /4 /5 /6 /7 /8,通过分频将输入时钟频率降低到4MHz到16MHz之间。
对以上的描述做个总结:PLL输入时钟的处理过程如下图所示:
这3个PLL、PLLSAI1、PLLSAI2模块里面,每个模块里面都有一个倍频器,可以将输入频率倍频到 Fvco。每个模块的倍频系数分别位于:
PLL模块:寄存器(RCC_PLLCFGR)的(PLLN[7:0])
PLLSAI1模块:寄存器(RCC_PLLSAI1CFGR)的(PLLSAI1N[7:0])
PLLSAI2模块:寄存器(RCC_PLLSAI2CFGR)的(PLLSAI2N[7:0])
这几个模块的倍频系数范围都是:8 到 86 之间的整数。
Fvco = PLLCLK_IN * 倍频系数。
Fvco的频率范围是:64MHz 到 344MHz。所以需要选择适当的倍频系数,确保得到的Fvco频率处于有效的区间内。
得到Fvco这个时钟频率后,但这个时钟频率不能直接输出供系统使用,因此在每个PLL模块中,Fvco分别通过三个独立的分频器,产生3个独立的输出,供系统的各个模块使用。
STM32L41x/42x/43x/44x/45x/46x: PLL
PLLP = Fvco / 寄存器(RCC_PLLCFGR)的(PLLPDIV[4:0]) 分频系数:2 到 31
PLL48M1CLK = Fvco / 寄存器(RCC_PLLCFGR)的(PLLQ[1:0]) 分频系数:2,4,6,8
PLLCLK = Fvco / 寄存器(RCC_PLLCFGR)的(PLLR[1:0]) 分频系数:2,4,6,8
STM32L41x/42x/43x/44x/45x/46x: PLLSAI1
PLLSP = Fvco / 寄存器(RCC_PLLSAI1CFGR)的(PLLSAI1PDIV[4:0]) 分频系数:2 到 31
PLL48M2CLK = Fvco / 寄存器(RCC_PLLSAI1CFGR)的(PLLSAI1Q[1:0]) 分频系数:2,4,6,8
PLLADC1CLK = Fvco / 寄存器(RCC_PLLSAI1CFGR)的(PLLSAI1R[1:0]) 分频系数:2,4,6,8
STM32L47x/48x/49x/4ax: PLL
PLLSAI3CLK = Fvco / 寄存器(RCC_PLLCFGR)的(PLLPDIV[4:0]) 分频系数:2 到 31
PLL48M1CLK = Fvco / 寄存器(RCC_PLLCFGR)的(PLLQ[1:0]) 分频系数:2,4,6,8
PLLCLK = Fvco / 寄存器(RCC_PLLCFGR)的(PLLR[1:0]) 分频系数:2,4,6,8
STM32L47x/48x/49x/4ax: PLLSAI1
PLLSAI1P = Fvco / 寄存器(RCC_PLLSAI1CFGR)的(PLLSAI1PDIV[4:0]) 分频系数:2 到 31
PLL48M2CLK = Fvco / 寄存器(RCC_PLLSAI1CFGR)的(PLLSAI1Q[1:0]) 分频系数:2,4,6,8
PLLADC1CLK = Fvco / 寄存器(RCC_PLLSAI1CFGR)的(PLLSAI1R[1:0]) 分频系数:2,4,6,8
STM32L47x/48x/49x/4ax: PLLSAI2
PLLSAI2P = Fvco / 寄存器(RCC_PLLSAI2CFGR)的(PLLSAI2PDIV[4:0]) 分频系数:2 到 31
PLLADC2CLK = Fvco / 寄存器(RCC_PLLSAI2CFGR)的(PLLSAI2R[1:0]) 分频系数:2,4,6,8
PLL的参数配置需要遵循一定顺序,以保证PLL能正常运行。
PLL配置(输入时钟和倍频因子的选择)必须在启用PLL之前完成。一旦启用PLL,这些参数就不能更改。
要修改PLL配置,请按以下步骤进行:
- 通过在时钟控制寄存器(RCC_CR)中将(PLLON)设置为0来禁用PLL。
- 等待(RCC_CR)中(PLLRDY=0),表示PLL现在完全停止。
- 更改所需的参数。
- 通过在时钟控制寄存器(RCC_CR)中将(PLLON)设置为1来启用PLL。
- 等待(RCC_CR)中(PLLRDY=1),表示PLL现在稳定运行。
- 通过在PLL配置寄存器(RCC_PLLCFGR)中配置(PLLPEN=1)(PLLQEN=1)(PLLREN=1)启用所需的PLL输出。
- 通过在PLLSAI1配置寄存器(RCC_PLLSAI1CFGR)中配置(PLLSAI1PEN=1)(PLLSAI1QEN=1)(PLLSAI1REN=1)启用所需的PLL输出。
- 通过在PLLSAI2配置寄存器(RCC_PLLSAI2CFGR)中配置(PLLSAI2PEN=1)(PLLSAI2REN=1)启用所需的PLL输出。