YTM32的时钟系统及SCU、IPC外设模块详解

YTM32时钟系统及SCU、IPC外设模块详解

简介

本文以YTM32B1ME0为例,学习和介绍YTM32的时钟系统,主要涉及SCU(System Clock Unit)和IPC(IP Control)模块,其中SCU管理众多的时钟源发生器,IPC负责将向外设模块供应合适的时钟。

原理与机制

系统时钟模块SCU

系统时钟模块(System Clock Unit,SCU)内部设计了多种时钟源,可作为MCU内部电路系统各部分外设、总线,以及子系统的时钟源。其中包含的时钟源有:

  • 高速内部RC振荡器(Fast Internal RC Oscillator,FIRC),96MHz时钟信号源。上电后默认的系统时钟源。
  • 低速内部RC振荡器(Slow Internal RC Oscillator,SIRC),12MHZ时钟信号源。
  • 高速晶体振荡器(Fast Crystal Oscillator,FXOSC),外接Hz - 24MHz晶振。
  • 低速晶体振荡器(Slow Crystal Oscillator,SXOSC),外接32.768kHz晶振。
  • 锁相环倍频电路(Phase Locked Loop,PLL),倍频器。输出最高120MHz。
  • 时钟监控子系统(Clock Monitor Unit,CMU),用于检测指定4种时钟信号的频率超出预设范围、时钟输出或者时钟输入信号失效的情况。

其中:

  • 除了SXOSC之外,FIRC、SIRC、FXOSC和PLL的输出时钟信号可以作为系统时钟(System Clock)的时钟源。
  • SXOSC虽然不能作为系统时钟源,但可为看门狗(WDG)和RTC提供晶振时钟源。
  • FIRC或FXOSC可以作为PLL的参考输入信号源。
  • SIRC时钟源始终在工作(上电后默认使用的系统时钟源),除非人为在Standby或PowerDown模式下关停。
  • 基于对安全性的考虑,SCU外设模块内部还集成了一个时钟监控子系统(Clock Monitor Unit,CMU),用于检测时钟源的频率超出预设范围、时钟输出或者时钟输入信号失效的情况。
    • SCU包含4个CMU子模块,分别监控低速总线(Slow Bus Clock),FIRC、FXOSC和PLL的时钟
    • FXOSC或SIRC可以作为CMU的参考输入时钟源
  • 可以通过软件,从指定的芯片引脚导出内部的多种时钟源的时钟脉冲信号。
  • SCU包含系统时钟源的无毛刺切换复用器,可以平稳过渡系统时钟源
  • SCU中,可以通过分频器,对系统时钟源(System Clock)进行分频,分别得到高速总线时钟(Fast Bus Clock)、低速总线时钟(Slow Bus Clock),以及内核时钟(Core Clock)。

从YTM32B1ME0x微控制器的手册中可以找到SCU的系统框图,也就是YTM32B1ME0x微控制器的时钟树,如图x所示。
在这里插入图片描述

图x SCU外设模块系统框图

从图中来看,SCU系统的时钟树路径是非常清晰的:

  • FIRC、FXOSC、SIRC、SXOSC是整个时钟发生系统的“原始时钟源”,可以“无中生有”产生时钟信号,这些时钟信号可以直接作为芯片上各子系统的时钟源
  • 芯片系统中最主要的“再生信号源”,是系统时钟,系统时钟通过一个复用器从四个时钟中选一个,其中就包含PLL的输出。系统时钟还可以经过多级分频器,分别得到Core Clock、Fast Bus Clock、Slow Bus Clock。
  • PLL的内部以压控振荡器作为倍频器,配合内部的分频器,可以将输入的时钟源倍频,产生一个PLL输出的时钟,可以通过系统时钟复用器进入系统时钟的衍生时钟,也可以直接引出作为PLL Clock。

图x右侧的这些时钟源,就是微控制器芯片内部的各种时钟源,可以作为外设的功能时钟源,例如,可以通过IPC模块(IP Control)为外设模块指定时钟源,如图x所示。

外设控制模块IPC

外设控制模块(IP Control,IPC)管理向片内各外设模块供应的时钟源,包括总线访问外设的时钟、外设的功能时钟(和分频)等,另外,还可以向外设发送复位控制信号,请求复位对应的外设模块。IPC系统框图如图x所示。
在这里插入图片描述

图x IPC外设模块系统框图

从IPC的系统框图中可以看到,Bus Clock可以送入Bus Clock Gate,管控访问外设寄存器的存储空间,由硬连接固定为Fast Bus Clock或者Slow Bus Clock,甚至是Core Clock。如表x所示。

在这里插入图片描述
在这里插入图片描述

图x IP时钟选择表

从这张表中,根据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总线上的不同外设分别连接了各自不同的时钟信号源。

在这里插入图片描述

图x 系统内存映射空间

如此,判定各外设使用的总线时钟,就只能从IP Clock Control Table中查询了。 同时,关于选择外设的时钟源,由于不同的外设模块来自于不同的开发者(甚至不同的供应商),并未强制遵循统一的设计模式,这里还有不少特殊的“硬连线”,需要开发者仔细阅读IP Clock Control Table表后的NOTE,例如,在YTM32B1ME1x的手册中,有如下应用要点:

  • Bus Clock总线时钟用于访问IP的寄存器,只有当启用对应的访问时钟,才能正常访问外设的寄存器。如果在未启动访问系统时钟时访问外设寄存器,则会立即报HardFault。
  • Peripheral Functional Clock外设功能时钟一栏中,如果标记为YES,就意味着可以通过IPC模块配置该外设模块自己运行的时钟源以及分频。如果是-,就意味着它使用硬件固定的时钟源,大多数是使用同自己同时使用的总线时钟源。
  • 在Bus Clock Enable栏中,如果标记为ON,就表示这个外设在上电之后默认启用时钟,否则,就需要后续软件人为启用方可使用。
  • LINFlexD模块的波特率时钟是来自于Fast Bus Clock时钟。但从表中查询LINFlexD模块的系统总线时钟是Slow Bus Clock。
  • FlexCAN模块的波特率时钟可以来自于Fast Bus Clock或FXOSC Clock,但不能从IPC中选择,需要再FlexCAN的IP中的寄存器中选择。
  • eTMR模块的计数时钟默认来自于Fast Bus Clock,但可以在eTMR模块内部配置为计数模式,将计数器的时钟源切换到TCLK。
  • lpTMR模块的时钟源可以来自于IPC功能时钟的选择,但若MCU进入Powerdown模式,IPC模块的供电会停掉(Fast/Slow Bus Clock,PLL等时钟源也会停掉),需要提前在lpTMR的IP内部配置使用SIRC或SXOSC等不会掉线的时钟源。
  • RTC模块和WDG的时钟仅仅能能在本外设模块内部选择,IPC不介入。
  • RCU(复位控制单元)模块的毛刺滤波器(检测复位引脚上的电平)需要使用SIRC,不要轻易关掉SIRC。

应用要点

修改配置

通过配置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=2frefREFDIV+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模式下保持激活工作状态。

在低功耗模式下:

  • SCU在Active和Sleep模式下都是正常工作。
  • 在Deepsleep模式下,Core Clock、Platform Clock、Fast Bus Clock和Slow Bus Clock都被停用,但所有的时钟源仍可配置为继续保持激活状态
  • 在Standby模式下,只有SIRC和SXOSC可被配置为继续存活。
  • 在Powerdown模式下,只有SIRC和SXOSC可被配置为继续存活。

软件支持

YTMicro SDK中,提供了SCU和IPC的驱动程序源文件,可供用户编程使用。

  • END
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值