本文以YTM32B1ME0为例,学习和介绍YTM32的时钟系统,主要涉及SCU(System Clock Unit)和IPC(IP Control)模块,其中SCU管理众多的时钟源发生器,IPC负责将向外设模块供应合适的时钟。
系统时钟模块(System Clock Unit,SCU)内部设计了多种时钟源,可作为MCU内部电路系统各部分外设、总线,以及子系统的时钟源。其中包含的时钟源有:
其中:
从YTM32B1ME0x微控制器的手册中可以找到SCU的系统框图,也就是YTM32B1ME0x微控制器的时钟树,如图x所示。
从图中来看,SCU系统的时钟树路径是非常清晰的:
图x右侧的这些时钟源,就是微控制器芯片内部的各种时钟源,可以作为外设的功能时钟源,例如,可以通过IPC模块(IP Control)为外设模块指定时钟源,如图x所示。
外设控制模块(IP Control,IPC)管理向片内各外设模块供应的时钟源,包括总线访问外设的时钟、外设的功能时钟(和分频)等,另外,还可以向外设发送复位控制信号,请求复位对应的外设模块。IPC系统框图如图x所示。
从IPC的系统框图中可以看到,Bus Clock可以送入Bus Clock Gate,管控访问外设寄存器的存储空间,由硬连接固定为Fast Bus Clock或者Slow Bus Clock,甚至是Core Clock。如表x所示。
从这张表中,根据Bus Clock的来源,大体猜测一下YTM32系统总线的架构:使用Core Clock的DMA和GPIO,以及没有列出的Arm核心,约摸对等AHB总线,例如Arm核心和DMA对应AHB Master,GPIO对应AHB Slave;使用Fast Bus Clock的部分外设,可能接到了APB0上(因为Core Clock到Fast Bus Clock还有一个时钟分频,不是同一个时钟),AHB到APB0有个外设桥,对应着Core Clock到Fast Bus Clock的时钟分频;使用Slow Bus Clock的部分外设,可能接到了APB1上,AHB到APB1也有个外设桥(如果是从APB0到APB1设计外设桥就有点复杂了,没必要)。
然而,根据常规的架构设计,使用同一条总线的外设,对应寄存器的映射空间大多是聚集分布,不同总线对应不同的存储空间区块。但从手册中描述内存地址空间的表格中,如图x所示,可以看到,只有一个APB0,没有AHB(访问寄存器不需要AHB)和APB1,不得不感叹,这里可能设计了比较细腻的时钟连线,为同挂在一根APB0总线上的不同外设分别连接了各自不同的时钟信号源。
如此,判定各外设使用的总线时钟,就只能从IP Clock Control Table
中查询了。 同时,关于选择外设的时钟源,由于不同的外设模块来自于不同的开发者(甚至不同的供应商),并未强制遵循统一的设计模式,这里还有不少特殊的“硬连线”,需要开发者仔细阅读IP Clock Control Table
表后的NOTE
,例如,在YTM32B1ME1x的手册中,有如下应用要点:
YES
,就意味着可以通过IPC模块配置该外设模块自己运行的时钟源以及分频。如果是-
,就意味着它使用硬件固定的时钟源,大多数是使用同自己同时使用的总线时钟源。ON
,就表示这个外设在上电之后默认启用时钟,否则,就需要后续软件人为启用方可使用。通过配置SCU_CLKS[CLKSRCSEL]
可以选择System Clock的时钟源,但实际上,并不是说软件向这个寄存器中写入配置,新的时钟就立刻生效。硬件电路系统切换System Clock要经历一个不稳定的切换过程,此时软件需要查询SCU_STS[CLKST]
,等到电路系统确实检测到新的时钟已经生效,再进行后续的操作。
当使用锁相环PLL对信号源进行倍频时,设定SCU_PLL_CTRL[PLL_EN]=1
后,PLL在预分频系数SCU_PLL_CTRL[REFDIV]
和反馈分频(倍频)系数SCU_PLL_CTRL[FBDIV]
的作用下,产生倍频后的时钟信号。但注意,PLL的产生稳定的倍频输出信号也需要一个过程,在这个过程中,用户需要轮询标志位SCU_STS[PLL_LOCK]
标志位,以判定PLL是否已经稳定可用。
此处有计算PLL输出时钟信号的公式,如下:
f
p
l
l
o
u
t
=
f
r
e
f
2
∗
F
B
D
I
V
+
1
R
E
F
D
I
V
+
1
f_{pllout}=\frac{f_{ref}}{2} * \frac{FBDIV+1}{REFDIV+1}
fpllout=2fref∗REFDIV+1FBDIV+1
切记,只有在停用PLL时才能修改PLL的预分频系数SCU_PLL_CTRL[REFDIV]
和反馈分频(倍频)系数`SCU_PLL_CTRL[FBDIV
通过SCU_DIV
寄存器配置系统时钟分频至衍生时钟时,要确保Core Clock和Fast Bus Clock不要超过120MHz上限,Slow Bus Clok不要超过40MHz。
关于CMU,SCU中内部集成的4个CMU,分别对应:Slow Bus Clock、FIRC、PLL、FXOSC。
使用IPC的CTRL寄存器配置分频IPC_CTRL[DIV]
时,需要先停用任何时钟源(IPC_CTRL[SRCSEL]=0
)。设定分频值后,再选定时钟源。这样做的意义在于,可以减少一次变频的风险。
芯片复位后(包括上电复位和从Powerdown模式下唤醒),FIRC和SIRC都是激活可用的,PLL和FXOSC是停用的。关于SXOSC,它在上电复位之后会被停用,在进入Powerdown模式下及唤醒后,默认是被停用了,但可以配置在Powerdown模式下保持激活工作状态。
在低功耗模式下:
YTMicro SDK中,提供了SCU和IPC的驱动程序源文件,可供用户编程使用。