您的位置:首页 > 其它

创龙TMS320C6748开发板———PLL模块和PINMUX说明

2017-01-13 21:25 956 查看
一、下面我们介绍PLL(锁相环)模块的初始化过程。

一个系统最基础的模块就是时钟电路,而系统中各个模块的时钟又是不同的,TI公司为TMS320C6748提供了PLL0、PLL1两个锁相环模块,为DSP、DDR、uPP、SPI、I2C、UART等模块提供时钟。详细见下图:



在写程序的时候经常用到这张表,查看相应模块对应的输出时钟,其中PLL0_SYSCLK1、PLL0_SYSCLK2、PLL0_SYSCLK4、PLL0_SYSCLK6这几个时钟输出分频系数不可调,也就是说他们的时钟只取决于PLL1的PREDIV[预分频]、PLLM[倍频]、POSTDIV[后分频]三个寄存器。

下面我们通过PLL的结构图来具体说明PLL0_SYSCLK1~7,PLL1_SYSCLK1~3频率是如何配置的。



(1)PLL0模块

在创龙的核心板上搭载的是24MHz的晶体振荡器,这时我们需要配置PLLCTL寄存器中的CLKMODE=0来选择输入时钟;当然,6748也支持直接输入方波作为时钟,这时相应的配置CLKMODE=1即可。

紧接着,我们开始配置PREDIV、PLLM、POSTDIV这三个寄存器来选择系统工作的最高频率,计算公式为:输出时钟频率=OSCIN(24MHz)÷(PREDIV+1)×(PLLM+1)÷(POSTDIV+1),注意以上三个寄存器中有一位是使能位,需要使能才能更改频率。然后在PLLCTL寄存器中设置PLLEN位即可将时钟送入7个时钟模块,在经过相应的分频(PLLDIV1~7)得到子系统时钟作为各个模块的输入时钟。至此配置完成。

另外,在系统工作过程中如果我们需要更改系统频率该如何操作呢,显然,肯定不可以暂时关闭PLL0,更改相应倍频、分频寄存器再打开。这时我们可以通过设置PLLCTL中的EXTCLKSRC位,将PLL1_SYSCLK3的时钟输入到PLL0的7个时钟模块前,同时清除PLLCTL中的PLLEN位,至此完成时钟切换为PLL1后就可以更改PLL0的倍频、分频比,配置完成后重新切换为PLL0即可。

最后还需要说明的是在倍频器后有一路时钟[不经过后分配]直接经过DIV4.5[4.5倍分频]作为EMIFA的时钟,也可以通过清除CFGCHIP3寄存器中的EMA_CLKSRC位配置PLL0_SYSCLK3作为EMIFA的时钟。

(2)PLL1模块

PLL1模块与PLL0模块类似,不过没有了PREDIV寄存器,PLL1_SYSCLK1时钟作为DDR模块的时钟输入。

在PLL1模块中多了PLLC1
OBSCLK时钟,在6748上有OBSCLK这个引脚可以方便用户外接其他需要时钟的模块,时钟源可以通过OCSEL中的OCSRC位选择。

接下来我们给出各个子系统时钟支持的最高频率。



(3)PLL模块的初始化配置过程

a. 为了解锁PLL控制寄存器,在KICK0R、KICK1R两个寄存器中分别写入KICK0R:83E70B13h,KICK1R:95A4F1E0h。KICK0R、KICK1R在SYSCFG0模块中。

b. 如果配置PLL0模块,清除CFGCHIP0寄存器中的PLL_MASTER_LOCK位,如果配置PLL1模块,清除CFGCHIP3寄存器中的PLL1_MASTER_LOCK位。CFGCHIP0、CFGCHIP3在SYSCFG0模块中。

c. 清除PLLCTL中的PLLENSRC位。

d. 清除PLLCTL中的EXTCLKSRC位。

e. 清除PLLCTL中的PLLEN位。

f. 等待四个时钟周期。

g. 清除PLLCTL中的CLKMODE位,选择晶体振荡器作为输入时钟。

h. 清除PLLCTL中的PLLRST位,使PLL0复位。

i. 设置PLLCTL中的PLLDIS位。[PLLCTL的第四位]

j. 清除PLLCTL中的PLLPWRDN位。

k. 清除PLLCTL中的PLLDIS位。

l. 等待2000个时钟周期,使PLL工作稳定。PLL_STABILIZATION_TIME

m. 配置PREDIV、PLLM、POSTDIV三个寄存器。等待,直至PLLSTAT中的GOSTAT位为0。

n. 配置PLLDIV1~7。

o. 设置PLLCMD寄存器中的GOSET位。等待,直至PLLSTAT中的GOSTAT位为0。

p. 等待200个周期。PLL_RESET_TIME_CNT

1. 设置PLLCTL中的PLLRST位,使PLL0退出复位状态。

r. 等待2400个周期。PLL_LOCK_CYCLES

s. 设置PLLCTL中的PLLEN位。

t. 如果配置PLL0模块,设置CFGCHIP0寄存器中的PLL_MASTER_LOCK位,如果配置PLL1模块,设置CFGCHIP3寄存器中的PLL1_MASTER_LOCK位。CFGCHIP0、CFGCHIP3在SYSCFG0模块中。

u. 锁定PLL控制寄存器,在KICK0R、KICK1R两个寄存器中分别写入KICK0R:0hKICK1R:
0h。KICK0R、KICK1R在SYSCFG0模块中。

下面介绍个偷懒的方法,可以直接移植创龙电子给的gel文件中的部分代码:

#definePLLEN_MUX_SWITCH 4

#definePLL_LOCK_TIME_CNT 2400

#definePLL_STABILIZATION_TIME 2000

#definePLL_RESET_TIME_CNT 200

device_PLL0(unsignedint CLKMODE, unsigned int PLLM, unsigned int POSTDIV,unsigned int PLLDIV1,unsigned int PLLDIV2, unsigned int PLLDIV3, unsigned int PLLDIV7 ) {

unsigned int i=0;

/* Clear PLL lock bit */

CFGCHIP0 &= ~(0x00000010);

/* Set PLLENSRC '0',bit 5, PLLEnable(PLLEN) selection
is controlled through MMR */

PLL0_PLLCTL &= ~(0x00000020);

/* PLLCTL.EXTCLKSRC bit 9 should be left at0 for Freon */

PLL0_PLLCTL &= ~(0x00000200);

/* Set PLLEN=0 to put in bypass mode*/

PLL0_PLLCTL &= ~(0x00000001);

/*wait for 4 cycles to allow PLLEN muxswitches properly to bypass clock*/

for(i=0; i<PLLEN_MUX_SWITCH; i++) {;}

/* Select the Clock Mode bit 8 as ExternalClock or On Chip Oscilator*/

PLL0_PLLCTL &= 0xFFFFFEFF;

PLL0_PLLCTL |= (CLKMODE << 8);

/*Clear PLLRST bit to reset the PLL */

PLL0_PLLCTL &= ~(0x00000008);

/* Disable the PLL output*/

PLL0_PLLCTL |= (0x00000010);

/* PLL initialization sequence

Power up the PLL by setting PWRDN bit setto 0 */

PLL0_PLLCTL &= ~(0x00000002);

/* Enable the PLL output*/

PLL0_PLLCTL &= ~(0x00000010);

/*PLL stabilisation time- take out thisstep , not required here when PLL in bypassmode*/

for(i=0; i<PLL_STABILIZATION_TIME; i++){;}

/*Program the required multiplier value inPLLM*/

PLL0_PLLM = PLLM;

/*If desired to scale all the SYSCLKfrequencies of a given PLLC, program the POSTDIV ratio*/

PLL0_POSTDIV = 0x8000 | POSTDIV;

/*Check for the GOSTAT bit in PLLSTAT toclear to 0 to indicate that no GO operation is currently in progress*/

while(PLL0_PLLSTAT & 0x1==1){}

/*Program the RATIO field in PLLDIVx withthe desired divide factors. In addition, make sure in this step you leave thePLLDIVx.DxEN bits set so clocks are still enabled (default).*/

PLL0_PLLDIV1 = 0x8000 | PLLDIV1; // Fixed Ratio /1

PLL0_PLLDIV2 = 0x8000 | PLLDIV2; // Fixed Ratio /2

PLL0_PLLDIV4 = 0x8000 | (((PLLDIV1+1)*4)-1);// Fixed Ratio /4

PLL0_PLLDIV6 = 0x8000 | PLLDIV1; // Fixed Ratio /1

PLL0_PLLDIV3 = 0x8000 | PLLDIV3; // Variable Ratio (EMIF)

PLL0_PLLDIV7 = 0x8000 | PLLDIV7; // Variable Ratio (RMII)

/*Set the GOSET bit in PLLCMD to 1 toinitiate a new divider transition.*/

PLL0_PLLCMD |= 0x1;

/*Wait for the GOSTAT bit in PLLSTAT toclear to 0 (completion of phase alignment).*/

while(PLL0_PLLSTAT & 0x1==1) { }

/*Wait for PLL to reset properly.*/

for(i=0; i<PLL_RESET_TIME_CNT; i++) {;}

/*Set the PLLRST bit in PLLCTL to 1 tobring the PLL out of reset*/

PLL0_PLLCTL |= 0x8;

/*Wait for PLL to lock.*/

for(i=0; i<PLL_LOCK_TIME_CNT; i++) {;}

/*Set the PLLEN bit in PLLCTL to 1 toremove the PLL from bypass mode*/

PLL0_PLLCTL |= 0x1;

}

二、下面我们介绍PINMUX(管脚复用)模块的配置过程。

6748上有较多功能,有的引脚甚至有5个功能,通过配置PINMUX0~19完成引脚功能选择。这里我们使用Ti提供的TI
Pin Multiplex Utility软件进行配置。如图所示:



(1)step3中勾选需要用的模块。

(2)Details中双击选择对应引脚需要用到的功能,一般完成(1)后此步骤只需勾选相应的GPIO即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: