一、下面我们介绍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*/ /* 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*/ /*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.*/ /*Set the PLLRST bit in PLLCTL to 1 tobring the PLL out of reset*/ PLL0_PLLCTL |= 0x8; /*Wait for PLL to lock.*/ /*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即可。
|