打印
[其他ST产品]

英飞凌Aurix2G TC3XX 时钟系统详解

[复制链接]
793|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
模块简介
对任何一个计算机系统来说,时钟都是不可或缺的,它就像人的心跳一样,驱动着系统的运转。我们常说的Intel某款芯片,主频多少,也就是CPU内核的时钟源的频率。



CPU时钟频率越高,与之对应的,芯片的计算频率也就越高,但是相应的功耗和发热也就越严重。现如今桌面端设备的主频基本已经饱和,基本都是GHz量级的,要想提升算力,就不得不增加内核数量,也就是我们常说的多核计算机系统。而嵌入式领域的MCU主芯片,当前的主频基本都在百MHz量级。Aurix2G TC3XX系列的主频最高支持300MHz,其他有些厂家的芯片已经达到了600MHz。同一系列的芯片毫无疑问算力和主频成正比的,但是不同芯片的算力比较不能只看主频,还要看指令集性能和厂商硬件优化。
除了CPU需要使用时钟外,其他模块例如ADC等外设、RAM、FLASH、总线都是需要时钟的。对于外设也是一样,时钟频率越高,速度越快,定时器精度越高,相应的功耗和发热也会升高,因此在系统设计时要根据实际需求进行斟酌。
今天我们就来介绍Aurix2G TC3XX系列芯片的时钟系统,以及如何在MCAL中进行配置。

使用特权

评论回复
沙发
yellow555|  楼主 | 2024-6-30 22:56 | 只看该作者
功能介绍
TC3XX系列时钟系统主要包括时钟源、锁相环、时钟分配器组成。

2.1 时钟源
要使用时钟的话,物理上必须有一个时钟源,TC3XX系列时钟电路允许两种外部时钟源,第一种是外部直接时钟源,也就是通过其他芯片或电路直接进行时钟Tick输入,这种情况下XTAL1连接时钟信号,XTAL2悬空。

使用特权

评论回复
板凳
yellow555|  楼主 | 2024-6-30 22:56 | 只看该作者
第二种是采用石英或陶瓷(一般为石英)晶振,通过电路连接实现时钟源输入。

时钟源电路一般由电子电器部门进行设计,作为软件方,我们只需要关注外部时钟频率,也就是上图中的fOSC0,它是我们所有模块的物理时钟源,一般为20MHz。还有就是时钟的精度,对于有些功能例如控制器之间进行对时就对精度有一定的要求。
另外TC3XX系列芯片还提供了一个内置的备用时钟,稳定可靠但是精度相对较低,可以在主时钟异常时使用。

使用特权

评论回复
地板
yellow555|  楼主 | 2024-6-30 22:56 | 只看该作者
时钟倍频(PLL)
细心的朋友可能已经发现,前文提到嵌入式MCU的主频一般为百MHz量级,而外部时钟源一般为20MHz,20MHz的时钟如何能提供300MHz的Tick呢?这里就得用到时钟的锁相环电路系统,它是通过时钟的相位捕捉,利用内部的比较器、控制环、振荡器、反馈电路等模块,通过相位切分的原理,将一个输入Tick,切分为多个时钟Tick,从而达到倍频的目的。关于锁相环,这里就不多做介绍了,感兴趣的朋友可以自行查阅资料。
TC3XX系列芯片时钟系统中一共有两个锁相环模块,一个是系统锁相环模块,其产生的时钟主要供CPU、存储等模块使用;一个是外设锁相环模块,顾名思义,其产生的时钟主要供外设模块使用。

使用特权

评论回复
5
yellow555|  楼主 | 2024-6-30 22:57 | 只看该作者
系统锁相环(System PLL)
系统锁相环能够将低频的外部时钟源进行倍频,以给CPU等模块提供稳定高频的时钟源。同时还提供安全监控功能,当外部时钟源频率超出范围时执行紧急动作。

如上图为系统锁相环模块示意图,从图上我们可以看出,外部时钟源fOSC会首先经过一个P-DIV进行预分频,随后经过锁相环相关模块进行倍频得到fDCO,最后再经过K2-DIV进行一个最终分频,然后输出fPLL0,也就是系统时钟源。

使用特权

评论回复
6
yellow555|  楼主 | 2024-6-30 22:57 | 只看该作者
这里我们主要关注三个参数,也就是预分频值P-DIV、反馈分频值NDIV和输出分频值K2-DIV。系统时钟的计算主要依赖这三个参数。其运算公式如下:


P:预分频值P-DIV+1,P-DIV对应寄存器SYSPLLCON0.PDIV
N:反馈分频值NDIV+1,NDIV对应寄存器SYSPLLCON0.NDIV
K2:输出分频值K2-DIV+1,K2-DIV对应寄存器SYSPLLCON1.K2DIV

使用特权

评论回复
7
yellow555|  楼主 | 2024-6-30 22:57 | 只看该作者
这里P参数和N参数的设定需要参考DataSheet中的fDCO时钟范围,如下图中fDCO的输入范围是10~40 MHz,也就是说在20MHz的fOSC下,P的范围为0~1 ,一般P-DIV设置为0,也就是fDCO输入为20MHz;然后fDCO时钟的输出范围为400~800MHz,如果要输出PLL0为主频最大300MHz,最合适的fDCO输出频率为600MHz,即NDIV设置为29;然后将K2-DIV设置为1,进行二倍分频,最终得到fPLL0=300MHz。

使用特权

评论回复
8
yellow555|  楼主 | 2024-6-30 22:57 | 只看该作者
因为锁相环是一个反馈电路设计,因此在设置完之后需要进行等待锁相环稳定,在初始化设置完时钟后,可通过while循环SYSPLLSTAT.LOCK==0来等待锁相环稳定。
如果在运行时设置锁相环,注意关掉SMU中的PLL监控(默认关闭),否则会产生误报Tick丢失故障。

使用特权

评论回复
9
yellow555|  楼主 | 2024-6-30 22:58 | 只看该作者
外设锁相环(Peripheral PLL)
与系统锁相环功能相同,外设锁相环的目的也是将外部时钟信号通过锁相环模块进行倍频得到外设时钟源。

使用特权

评论回复
10
yellow555|  楼主 | 2024-6-30 22:58 | 只看该作者
从上图外设时钟锁相环模块示意图中可以看出,外部时钟源fOSC进入后同样进行一次预分频,锁相环倍频,然后进行输出分频输出fPLL1、fPLL2和fHSCT,其中fHSCT是供HSSL模块使用的一路特殊时钟。这里我们同样也主要关注这几个参数:预分频值P-DIV、反馈分频值NDIV、pll1输出分频值K2-DIV、pll2输出分频值K3-IDV、除数分频值DIVBY。fPLL1的计算公式为:

使用特权

评论回复
11
yellow555|  楼主 | 2024-6-30 22:58 | 只看该作者
P:预分频值P-DIV+1,P-DIV对应寄存器PERPLLCON0.PDIV
N:反馈分频值NDIV+1,NDIV对应寄存器PERPLLCON0.NDIV
K2:输出分频值K2-DIV+1,K2-DIV对应寄存器PERPLLCON1.K2DIV
fPLL1的计算方法是和fPLL0基本相同,然后PLL2的公式存在一点差异即引入了一个被除数变量:



K3:输出分频值K3-DIV+1,K3-DIV对应寄存器PERPLLCON1.K3DIV
DIVBY:被除数变量,当寄存器PERPLLCON0.DIVBY为0时,DIVBY=1.6,当PERPLLCON0.DIVBY为1时,DIVBY=2

使用特权

评论回复
12
yellow555|  楼主 | 2024-6-30 22:59 | 只看该作者
fHSCT的分频值较为固定,计算公式为:

使用特权

评论回复
13
yellow555|  楼主 | 2024-6-30 22:59 | 只看该作者
同样我们也能够在DataSheet中查询到外设锁相环模块的参数限制:



这里类比也是将P-DIV设置为0,然后外设时钟的设置则需要考虑外设一般的使用情况,且要与CPU尽量避开倍数关系,防止硬件EMC问题。然后考虑外设如CAN等模块的使用情况,一般PLL1输出320MHz(PLL1到外设之间还有一层二分频,所以作用到外设上的一般是160MHz),PLL2输出200MHz,配置NDIV=31,K2-DIV=3,K3-DIV=1,DIVBY=0。如果有特殊需求可根据实际情况配置分频,需要注意的是外设模块时钟源的连接由时钟分配单元CCU控制,具有耦合性,例如为了某个外设需要调整PLL1,则要考虑其他同样使用PLL1的外设。

使用特权

评论回复
14
yellow555|  楼主 | 2024-6-30 22:59 | 只看该作者
时钟分配单元(CCU)
至此我们得到了系统时钟PLL0,两个外设时钟PLL1和PLL2和一个特殊外设时钟HSCT。除了HSCT专供HSSL使用外,其他几个主要的时钟源需要和CPU及外设模块进行连接,并设置对应的时钟分频,时钟分配单元CCU就是负责该功能的。
CCU模块和PLL时钟源之间存在选择转换关系,如下图所示,每个时钟源可选PLL时钟或备用时钟。这里需要注意的是,PLL1到fSOURCE1之间存在一个可配置2倍分频器,仅当fSOURCE1选择PLL1且CCUCON1.PLL1DIVDIS=0时,fSOURCE1=fPLL1/2,其余情况不分频。

使用特权

评论回复
15
yellow555|  楼主 | 2024-6-30 22:59 | 只看该作者
各个模块所使用的时钟源如下表所示。



使用特权

评论回复
16
yellow555|  楼主 | 2024-6-30 23:00 | 只看该作者
每个外设模块都有指定的时钟源,有些模块具有多个可选时钟源;有些模块的输入时钟是固定分频比,比如ADC,而有些模块可以配置时钟分频比。下面我们就来介绍各个模块的时钟连接及分频机制。

fSRI:SRI总线时钟,决定SRI总线数据交互的频率,通过CCUCON0.SRIDIV进行设置分频参数
fCPUx:CPUx的主频,通过CCUCONi.CPUxDIV来进行设置,具体参考芯片核数量
fSPB:系统外设总线时钟,决定外设总线数据交互的频率,通过CCUCON0.SPBDIV来进行设置
fFSI2:PFlash时钟,决定PFlash读取速度,通过CCUCON0.FSI2DIV来设置
fFSI:除PFlash以外的其他Flash时钟,通过CCUCON0.FSIDIV来设置
fREFCLK1/2:调试参考时钟,分别为PLL0/1的24倍分频值
fBBB:BBB总线时钟,决定BBB总线访问速度,通过CCUCON0.BBBDIV来进行设置
fERAY:ERAY模块时钟,固定分频比,fERAY=fSOURCE1/2
fGTM:GTM模块主时钟,可变时钟源,当CCUCON0.GTMDIV=1时fGTM=fSPB*2;否则fGTM=fSOURCE0/GTMDIV
fSTM:STM模块主时钟,决定STM工作频率,通过CCUCON0.STMDIV来进行设置
fMSC:MSC模块主时钟,决定MSC工作频率,通过CCUCON1.MSCDIV来进行设置
fGETH:GETH以太网模块主时钟,通过CCUCON5.GETHDIV来进行配置
fADAS:SPU与RIF内核时钟,不可访问
fMCANH:CAN模块主时钟,决定CAN模块工作及CANRAM访问速度,通过CCUCON5.MCANHDIV来进行配置
fMCAN:CAN模块时钟,用来配置CAN的波特率,必须小于fMCANH,通过CCUCON1.MCANDIV来进行配置
fASCLINF/S:ASCLIN模块快/慢时钟源,用来配置ASCLIN模块波特率,fASCLINF通过CCUCON2.ASCLINFDIV配置,fASCLINS可选时钟源,通过CCUCON2.CLKSELASCLINS选择时钟源,通过CCUCON2.ASCLINSDIV配置
fQSPI:QSPI模块主时钟,可变时钟源,通过CCUCON1.CLKSELQSPI选择时钟源,通过CCUCON1.QSPIDIV配置
fADC:ADC模块主时钟,不可配置分频,fADC=fSOURCE1
fI2C:I2C模块主时钟,通过CCUCON1.I2CDIV配置
fEBU:EBU模块主时钟,不可配置分频,fEBU=fSOURCE1
fHSPDMx:HSPDM主时钟,不可配置分频,fHSPDMx=fSOURCE1、

使用特权

评论回复
17
yellow555|  楼主 | 2024-6-30 23:00 | 只看该作者
另外还有一些外设例如GPT12、SMU模块,使用的时钟为fSPB时钟源,后续在模块介绍中会进行说明。
除此之外,时钟的设置还存在一些关系限制,
参见下表:

使用特权

评论回复
18
yellow555|  楼主 | 2024-6-30 23:00 | 只看该作者
MCAL配置实例
TC3XX时钟的配置在MCU模块中,首先我们可以看到系统锁相环的配置:

使用特权

评论回复
19
yellow555|  楼主 | 2024-6-30 23:01 | 只看该作者
然后是外设锁相环的配置:

使用特权

评论回复
20
yellow555|  楼主 | 2024-6-30 23:01 | 只看该作者
然后是各个模块的时钟分配设置,这里可以直接设置目标频率,然后工具会自动计算分频比,不合理的值会报错提示:




使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

463

帖子

3

粉丝