ARM芯片的时钟树配置概略
下面专栏基于本人的开发经验,如果有错误欢迎指出.简单介绍下部分ARM芯片的时钟
入门级别:ARM7TDMI核心的R710F
因为年代久远,那个时候的先进处理器放到现在其实并不算什么特别高级的东西.

这个时钟树是我搬的上课PPT.


这个东西甚至不能叫时钟树.具体的配置是这样
RTC是由外部32768晶振提供时钟.
CK是时钟源,16MHz有源晶振.因为PLL最大允许8M输入,需要先2分频.为了进PLL 在PLL处12倍频2分频(乘12除2)得到48MHz给到CLK3并作为RCLK,不分频(/1)直接给到MCLK,二分频(/2)给PCLK和FCLK.
各个时钟的频率计算
RCLK和MCLK:(16/2)*(12/2)=48M;PCLK和FCLK:48/2=24M
一个参考代码
USB必须工作在48M所以有一个专门的时钟配置.因为年代久远,且上课的时候这块简单带过了,也没有相关的实验,这里也是略说.

进阶级别:STM32的时钟树
所有的STM32都有4个时钟源
LSI(内部低速RC振荡器)
HSI(8M/16M内部RC振荡器)
LSE(32768晶振)
HSE(外部高速晶振,有多种型号)
1.Cortex-M3核心的STM32F103C8T6
这个是cbj入门stm32用的板子,时钟树是stm32里面最简单的之一.

40K的LSI时钟给到独立看门狗定时器(IWDG)
32768晶振的LSE时钟给RTC.
配置8M晶振作为时钟源,输入PLL处9倍频得72M输出
将PLL输出1.5分频得48M给USB.
SYSCLK直接是72M,可以直接给到AHB总线
APB1最高36M需要先对72M作2分频(除2),这里分频了,在定时器TIM2,3,4,5,6,7处有2倍频所以定时器TIM2,3,4,5,6,7可以工作在最高72M.
APB2最高72M可以不分频,直接给过去.
ADC处需要分频,工作在12M.
代码(HAL库)
2.Cortex-M4核心的STM32F411CEU6
先看图,这个时钟树相比于STM32F103C8T6要复杂一些.

32K的LSI时钟给到独立看门狗定时器(IWDG)
32768晶振的LSE时钟给RTC.
外部晶振25M,在PLL前先M分频,进PLL后N倍频,P分频后输出,Q分频给USB.
一定查手册确定好M,N,P,Q,R这些参数的取值范围,否则芯片不能正常工作.
取M=25,N=192,P=2,Q=4,这样PLL输出96M,USB处48M.
HCLK直接取用PLL输出(96M).
FCLK也是96M
APB2不分频还是96M,APB2作2分频就是48M.定时器输入时钟是96M.
I2S接口有单独的时钟源和单独的PLL2,接出来R分频(这里先不考虑)
代码(HAL库)
3.Cortex-M7核心的STM32H743VIT6
先上框架和总线结构,比前面涉及的所有芯片都要复杂.


自然的,STM32H743的时钟树相比前面的都要复杂,以至于一个图放不下.


简略的说下大概配置流程.
时钟源是HSE,25M高速晶振.在PLL处M取5,N取160,P取2,Q取4,R取2.
sys_ck就置成了25/5*160/2=400M
HPRE处二分频,这样HCLK=400/2=200M.AXI和AHB可以工作在200M.
APB1,APB2,APB3都取2分频,工作在100M,APB4取4分频,工作在100M
然后就可以满足基本使用了.
(USB等别的外设后面再更新)
代码(HAL库,要不就得直接配置寄存器)