简简单单学TI 多核DSP(2):TMS320C6678的时钟配置

做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的时钟如何继续进行配置直到 正常运行。

简简单单学TI 多核DSP(1):TMS320C6678的架构


欢迎微博@EEWORLD

(0)

相关推荐