DSP

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

2019-07-13 17:06发布

一、下面我们介绍PLL(锁相环)模块的初始化过程。        一个系统最基础的模块就是时钟电路,而系统中各个模块的时钟又是不同的,TI公司为TMS320C6748提供了PLL0PLL1两个锁相环模块,为DSPDDRuPPSPII2CUART等模块提供时钟。详细见下图:        在写程序的时候经常用到这张表,查看相应模块对应的输出时钟,其中PLL0_SYSCLK1PLL0_SYSCLK2PLL0_SYSCLK4PLL0_SYSCLK6这几个时钟输出分频系数不可调,也就是说他们的时钟只取决于PLL1PREDIV[预分频]PLLM[倍频]POSTDIV[后分频]三个寄存器。        下面我们通过PLL的结构图来具体说明PLL0_SYSCLK1~7PLL1_SYSCLK1~3频率是如何配置的。        1PLL0模块        在创龙的核心板上搭载的是24MHz的晶体振荡器,这时我们需要配置PLLCTL寄存器中的CLKMODE=0来选择输入时钟;当然,6748也支持直接输入方波作为时钟,这时相应的配置CLKMODE=1即可。        紧接着,我们开始配置PREDIVPLLMPOSTDIV这三个寄存器来选择系统工作的最高频率,计算公式为:输出时钟频率=OSCIN24MHz)÷(PREDIV+1)×(PLLM+1)÷(POSTDIV+1),注意以上三个寄存器中有一位是使能位,需要使能才能更改频率。然后在PLLCTL寄存器中设置PLLEN位即可将时钟送入7个时钟模块,在经过相应的分频(PLLDIV1~7)得到子系统时钟作为各个模块的输入时钟。至此配置完成。        另外,在系统工作过程中如果我们需要更改系统频率该如何操作呢,显然,肯定不可以暂时关闭PLL0,更改相应倍频、分频寄存器再打开。这时我们可以通过设置PLLCTL中的EXTCLKSRC位,将PLL1_SYSCLK3的时钟输入到PLL07个时钟模块前,同时清除PLLCTL中的PLLEN位,至此完成时钟切换为PLL1后就可以更改PLL0的倍频、分频比,配置完成后重新切换为PLL0即可。        最后还需要说明的是在倍频器后有一路时钟[不经过后分配]直接经过DIV4.5[4.5倍分频]作为EMIFA的时钟,也可以通过清除CFGCHIP3寄存器中的EMA_CLKSRC位配置PLL0_SYSCLK3作为EMIFA的时钟。        2PLL1模块        PLL1模块与PLL0模块类似,不过没有了PREDIV寄存器,PLL1_SYSCLK1时钟作为DDR模块的时钟输入。        PLL1模块中多了PLLC1 OBSCLK时钟,在6748上有OBSCLK这个引脚可以方便用户外接其他需要时钟的模块,时钟源可以通过OCSEL中的OCSRC位选择。 接下来我们给出各个子系统时钟支持的最高频率。        3PLL模块的初始化配置过程        a. 为了解锁PLL控制寄存器,在KICK0RKICK1R两个寄存器中分别写入KICK0R:83E70B13hKICK1R:95A4F1E0hKICK0RKICK1RSYSCFG0模块中。        b. 如果配置PLL0模块,清除CFGCHIP0寄存器中的PLL_MASTER_LOCK位,如果配置PLL1模块,清除CFGCHIP3寄存器中的PLL1_MASTER_LOCK位。CFGCHIP0CFGCHIP3SYSCFG0模块中。        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. 配置PREDIVPLLMPOSTDIV三个寄存器。等待,直至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位。CFGCHIP0CFGCHIP3SYSCFG0模块中。        u. 锁定PLL控制寄存器,在KICK0RKICK1R两个寄存器中分别写入KICK0R:0hKICK1R: 0hKICK0RKICK1RSYSCFG0模块中。        下面介绍个偷懒的方法,可以直接移植创龙电子给的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     /* 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     /*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     /*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     /*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软件进行配置。如图所示:        1step3中勾选需要用的模块。        2Details中双击选择对应引脚需要用到的功能,一般完成(1)后此步骤只需勾选相应的GPIO即可。