做MCU及其他DSP的设计时,可能大家觉得时钟的设计其实是很简单的。没错,比如现在很热门的ARM系列的MCU,设计时没人单独提出来过什么时钟设计。为什么在提到TMS320C6678的时候要特别的提出时钟设计呢?
说实话,要想用好C6678,尤其是在多任务图像通信的场合,还真的得仔细研究其时钟系统。在这里,我将按照我个人在工作中的理解来写C6678的时钟系统。所以看起来会工程味道重一些,没有学术的味道。
C6678的时钟系统架构,设计得非常人性化,使用也比较方便。其系统架构如下图:
从架构图中可以清晰的看出,要理解C6678的时钟配置,就需要弄清楚图中各相关模块及其配置。尤其是对于多核配置,就显得更加重要了,后面将会告诉大家如何进行 配置。
C6678的时钟架构是由PLL来控制,所以需要首先理解PLL以及PLL控制器。
外部输入的时钟信号,经过PLL后输出时钟信号PLLOUT。
PLL控制器是用户软件可编程的,所以为系统提供灵活多变的时钟信号,在系统架构图中表示为PLLDIV1到PLLDIV16.另外PLL控制器不仅仅只是对PLLOUT进行软件可编程的分频或者倍频等操作,同时包含有PLLM和SECCTL控制寄存器,驱动PLLM,OUTPUT DIVIDE以及BYPASS。
整个C6678的时钟系统统一由PLL控制器来进行调度,经过PLL控制器后分配到8个C66X内核以及系统中的各个外设以及芯片内的各相关模块。
下面就给大家详细介绍PLL控制器的可编程指令的一些应用。PLL控制器中应用得比较多的几个概念,主要是分频(PLLD),倍频(PLLM)和无效(DISABLE)。
分频:就是将PLLOUT的频率分别除以(1到256可编程)得到得频率。
倍频:与分频相反,是乘以可编程系数。
无效:其实就是停止时钟得输出。
尽管说是可编程的,但是需要特别注意,有些时钟不是可以任意编程,必须遵循一定的规则。上图中已经标明。其中PLLDIV2,PLLDIV5,PLLDIV8各自的输出分频数分别为X、Y、Z。这是可以编程的,其余的就只能选定指定的数字。下面分别列出来:
PLLDIV1àSYSCLK1: 是全速时钟,专供COREPACK使用;
PLLDIV2àSYSCLK2: 可软件编程,其中X为1-32.但是必须确保时钟不能超过350M。
PLLDIV3àSYSCLK3: 是½速率时钟,驱动MSMC、Hyperlink、CPU /2 SCR、DDR EMIF、CPU/2 EDMA;
PLLDIV4àSYSCLK4: 驱动switch fabrics 和快速外设,例如Debug_SS和ETBs的1/3速率时钟;
PLLDIV5àSYSCLK5:仅供给system trace的1/y时钟(默认1/5),可编程输出时钟32~210MHz;
PLLDIV6àSYSCLK6: 1/64速率时钟,驱动DDR3 EMIF的PVT缓存模块;
PLLDIV7àSYSCLK7: 提供给慢速外设的1/6速率时钟 ,同时,1/6时钟还提供给SYSCLKOUT作为测试管脚使用;
PLLDIV8àSYSCLK8: 可编程慢速系统时钟,Z的取值范围为24~80;
PLLDIV9àSYSCLK9: ½速率时钟,驱动SmartReflex;
PLLDIV10àSYSCLK10: 1/3速率时钟,驱动SRIO;
PLLDIV11àSYSCLK11: 1/6速率时钟,驱动PSC。
参考TMS320C6678数据手册中的介绍,我分别介绍配置main PLL的几个关键寄存器
分频系数:上述PLL控制器的若干输出频率是可编程的,此时钟分频系数由寄存器PLLDIV2,PLLDIV5,PLLDIV8配置。
倍频系数: PLLM寄存器控制PLL控制器的倍频值。
PLL控制寄存器(PLLCTL)和二级PLL控制器(SECCTL)复位后,PLLCTL中的PLL使能位PLLEN可被修改,但是对PLL的功能没有影响,除非先将PLLENSRC控制位清零;非使能PLLEN后PLL进入旁路模式,此时可以对PLL进行配置,配置结束后PLLEN置位,PLL按照配置后的模式工作;SECCTL中的OUTPUT DIVIDE位给出PLL的次分频系数(1或2)。 对于系统的MAIN PLL的详细配置流程,请参考TI官方的文档www.ti.com/lit/ug/sprugv2f/sprugv2f.pdf中的3.1:
寄存器RSTYPE、RSTCTL及RSTCFG、RSISO给出了PLL复位控制逻辑配置单元。
全面理解时钟系统,还需要与BOOT相关联。需要掌握C6678的BOOT相关的配置等等。也就是说,PLL的初始配置与BOOT相关。
下表是从C6678的数据手册里面摘录下来的,便于理解前面说的那句话以及理解上面列出的PLLD和PLLM:
PLL在BOOT模式下被置于PLL的状态下,PLL的初始参数是由BOOTMODE【12:10】决定。
TMS320C6678 main PLL初始化配置在TI的Demo程序中main函数调用KeyStone_main_PLL_init (10, 1)函数里的参数配置过程。
例程对应硬件的输入时钟CORECLK为100MHz;PLLM设置为10*2-1=20-1(PLLM寄存器,20倍频);PLLD设置为1-1(MAINPLLCTN0中的PLLD字段,1分频);OUTPUT DIVIDE(SECCTN)设置为2-1(对应2分频),可以计算PLL输出时钟PLLOUT=CORECLK*(PLLM+1)/(PLLD+1)/(OUTPUT DIVIDE+) = 100MHz *20 / 1/2=1GHz。
例程所对应的DSP CorePac主频(SYSCLK1)为1GHz;相应外设控制器时钟SYSCLK2~11是在此基础上的分频。
上述寄存器设置参看TMS320C6678数据手册及用户手册.
下面给大家讲解的是DDR3的时钟配置:
DDR3 PLL为DDR3 存储控制器提供接口时钟;C6678上电复位后正常工作前需要为DDR3 PLL编程配置有效的时钟频率。DDR3 PLL的框图:
该PLL输入时钟DDRCLK为外部输入差分时钟; 输出时钟PLLOUT驱动DDR3接口,控制DDR3的数据读写速率。
DDR3 PLL配置不需要专用PLL 控制器,只需位于 BootCfg模块中的DDR3PLLCTN0和DDR3PLLCTN1,参考TMS320C6678数据手册7.7 DDR3PLL部分的说明。在对该寄存器写入配置前,需要先解锁(un-locking)KICK0/KICK1寄存器;同样修改配置寄存器后,需要锁定(locking)KICK0/KICK1寄存器。
DDR3 PLL配置寄存器各参数描述参考TMS320C6678数据手册;寄存器与Main PLL配置寄存器PLLCTN和SECCTN相似。
DDR3 PLL初始化流程如下:
写DDRP3LLCTN1寄存器ENSAT=1;
写DDRP3LLCTN0寄存器BYPASS=1,设置PLL工作于旁路模式;
写DDRP3LLCTN1寄存器PLLRST=1,PLL被置位;
在DDRP3LLCTN0寄存器中的PLLD和PLLM写入分频和倍频值;
写DDR3PLLCTN0寄存器BWADJ[7:0]=((PLLM+1)>>1)+1;
等待至少5us;
写DDR3PLLCTN1寄存器PLLRST=0,PLL复位;
等待至少500*REFCLK*(PLLD+1);
写DDR3PLLCTN0寄存器BYPASS=0,设置PLL工作于PLL模式;
到此为止,完成了对DDR3工作时钟频率的初始化,下一篇将会接着给大家讲解DDR3的时钟如何继续进行配置直到 正常运行。
欢迎大家跟帖与作者一起讨论。
联系客服