DM36x UBL PLL配置

来源:互联网 发布:艾姆赫斯特学院知乎 编辑:程序博客网 时间:2024/05/16 04:09
DM365 and DM368 Major System Block Clocking Feature Differences
 DM365-216DM365-270DM365-300DM368ARM926 RISC216 MHz270 MHz300 MHz432 MHzCo-Processor(HDVICP)173 MHz216 MHz270 MHz340 MHzCo-Processor(MJCP)173 MHz216 MHz270 MHz340 MHzDDR2173 MHz216 MHz270 MHz340 MHzmDDR168 MHz168 MHz168 MHz168 MHzVPSS Logic Block173 MHz216 MHz270 MHz340 MHzPeripheral System Bus and EDMA86.5 MHz108 MHz135 MHz170 MHzVPBE-VENC27 MHz74.25 MHz74.25 MHz74.25 MHzVPFE120 MHz120 MHz120MHz120 MHz

在源码flash_utils/DM36x/Common/src/device.c中对不同的Soc时钟频率进行配置

配置为OSC(外部时钟)24MHz,ARM 432MHz,DDR 340MHz即DM368

PLL1配置

Uint32 DEVICE_PLL1Init_432ARM_340DDR2_OSC24(){unsigned int CLKSRC=0x0;   /*CLKSRC=1 =>External Oscilator             CLKSRC=0 => Onchip oscilator*//*Power up the PLL*/PLL1->PLLCTL &= 0xFFFFFFFD;PLL1->PLLCTL &= 0xFFFFFEFF;  PLL1->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL1->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL1->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(150);  // PLLRST=1(reset assert)PLL1->PLLCTL |= 0x00000008;     UTIL_waitLoop(300); /*Bring PLL out of Reset*/  PLL1->PLLCTL &= 0xFFFFFFF7;//Program the Multiper and Pre-Divider for PLL1PLL1->PLLM  =   85;  // M=85; VCO will 24*2M/N+1 = 680MhzPLL1->PREDIV  =   0x8000|0x5; // N = 5PLL1->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1     //for(j=0; j<0x100; j++) {}     PLL1->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 //for(j=0; j<0x100; j++) {}    PLL1->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 //for(j=0; j<0x100; j++) {}    PLL1->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1     //Program the PostDiv for PLL1    PLL1->POSTDIV = 0x8000;// Post divider setting for PLL1  PLL1->PLLDIV1 = 0x801B;   //POST DIV 680/28=24.3 Mhz->USB PHY PLL1->PLLDIV2 = 0x8001;   //POST DIV 680/2=340Mhz->ARM926/ARM968PLL1->PLLDIV3 = 0x8001;   // POST DIV 680/2 = 340Mhz  -> MJCP/HDVICPPLL1->PLLDIV4 = 0x8003;   // POST DIV 680/4 = 170Mhz  -> EDMA/Peripheral CFG0 (1/2 Kaleido clock)PLL1->PLLDIV5 = 0x8001;   // POST DIV 680/2 = 340Mhz -> VPSS (max 270)PLL1->PLLDIV6 = 0x8008;   // POST DIV 680/9 = 75.6Mhz -> VENCPLL1->PLLDIV7 = 0x8000;   // POST DIV 680/1 = 680Mhz -> DDRx2PLL1->PLLDIV8 = 0x800D;   // POST DIV 680/14= 48.6Mhz-> MMC0/SD0PLL1->PLLDIV9 = 0x801B;   // POST DIV 680/28 = 24.3Mhz-> CLKOUT UTIL_waitLoop(300);/*Set the GOSET bit */    PLL1->PLLCMD = 0x00000001;  // Go  UTIL_waitLoop(300);  /*Wait for PLL to LOCK */    while(! (((SYSTEM->PLL0_CONFIG) & 0x07000000) == 0x07000000));     /*Enable the PLL Bit of PLLCTL*/ PLL1->PLLCTL |= 0x00000001;   // PLLEN=0return E_PASS;}

PLL2配置

Uint32 DEVICE_PLL2Init_432ARM_340DDR2_OSC24(){unsigned int CLKSRC=0x0; /*Power up the PLL*/PLL2->PLLCTL &= 0xFFFFFFFD;     /*Select the Clock Mode as Onchip Oscilator or External Clock on MXI pin*//*VDB has input on MXI pin */PLL2->PLLCTL &= 0xFFFFFEFF;  PLL2->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL2->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL2->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(50);  // PLLRST=1(reset assert)PLL2->PLLCTL |= 0x00000008;  UTIL_waitLoop(300);   /*Bring PLL out of Reset*/     PLL2->PLLCTL &= 0xFFFFFFF7; //Program the Multiper and Pre-Divider for PLL2     PLL2->PLLM=9;   // M=135; VCO will 24*2M/N+1 = 432Mhz     PLL2->PREDIV =0x8000| 0x0; // N = 0 PLL2->POSTDIV = 0x8000;     PLL2->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1      PLL2->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0      PLL2->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0      PLL2->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1 // Post divider setting for PLL2      PLL2->PLLDIV1 = 0x8011;   // POST DIV 432/18=24 Mhz  ->USB PHY PLL2->PLLDIV2 = 0x8000;   // POST DIV 432/1=432 Mhz  -> ARM926/HDVICP Cont  PLL2->PLLDIV3 = 0x8001;   // POST DIV 432/2=216 Mhz  -> DDRx2 PLL2->PLLDIV4 = 0x8014;   // POST DIV 432/21= 20.5714 Mhz->VOICE PLL2->PLLDIV5 = 0x800F;   // POST DIV 432/16=27 Mhz  -> VENC      PLL2->PLLCMD = 0x00000001;            UTIL_waitLoop(150);                    /*Wait for PLL to LOCK */      while(! (((SYSTEM->PLL1_CONFIG) & 0x07000000) == 0x07000000));           UTIL_waitLoop(4100);                   //Enable the PLL2      PLL2->PLLCTL |= 0x00000001;   // PLLEN=0  //do this after PLL's have been set up  SYSTEM->PERI_CLKCTRL = 0x36ED027C; return E_PASS;}

DDR2配置

Uint32 DEVICE_DDR2Init_432ARM_340DDR2_OSC24(){ DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);    SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) & 0xFFFF9F3F;     // Set bit CLRZ (bit 13)   SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) | 0x00002000;     // Check VTP READY Status   while( !(SYSTEM->VTPIOCR & 0x8000));          // Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)   //SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004000;              // Set bit LOCK(bit7) and PWRSAVE (bit8)   SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00000080;            // Powerdown VTP as it is locked (bit 6)   // Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)   SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004040;    // Wait for calibration to complete   UTIL_waitLoop( 150 );    // Set the DDR2 to synreset, then enable it again  DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);  DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE); DDR->DDRPHYCR = 0x000000C6; DDR->SDBCR = 0x00D34A32;//Program SDRAM Bank Config RegisterDDR->SDBCR = 0x0053CA32;DDR->SDTIMR  =0x57257CD2; //Program SDRAM Timing Control Register1DDR->SDTIMR2 =0x422EC742; //Program SDRAM Timing Control Register2DDR->PBBPR = 0x000000F0;DDR->SDBCR = 0x00534A32; //Program SDRAM Bank Config RegisterDDR->SDRCR = 0xA5C;        //Program SDRAM Refresh Control Register   DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);  DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);  while(!(DDR->SDRSTAT&0x04));  return E_PASS;}



配置为OSC 24MHz,ARM 297MHz,DDR 270Mhz即DM365-300

PLL1配置

Uint32 DEVICE_PLL1Init_297ARM_270DDR2_OSC24(){unsigned int CLKSRC=0x0;   /*CLKSRC=1 =>External Oscilator             CLKSRC=0 => Onchip oscilator*//*Power up the PLL*/PLL1->PLLCTL &= 0xFFFFFFFD;PLL1->PLLCTL &= 0xFFFFFEFF;  PLL1->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL1->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL1->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(150);  // PLLRST=1(reset assert)PLL1->PLLCTL |= 0x00000008;     UTIL_waitLoop(300); /*Bring PLL out of Reset*/  PLL1->PLLCTL &= 0xFFFFFFF7;//Program the Multiper and Pre-Divider for PLL1PLL1->PLLM    =   0x2D;     // M=45 ; VCO will 24*2M/N+1 = 540MhzPLL1->PREDIV  =   0x8000|0x3; // N=3 PLL1->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1     //for(j=0; j<0x100; j++) {}     PLL1->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 //for(j=0; j<0x100; j++) {}    PLL1->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 //for(j=0; j<0x100; j++) {}    PLL1->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1     //Program the PostDiv for PLL1    PLL1->POSTDIV = 0x8000;         // Post divider setting for PLL1  PLL1->PLLDIV1 = 0x8015;   // POST DIV 540/22=24.54 Mhz->USB PHY PLL1->PLLDIV2 = 0x8001;   //not usePLL1->PLLDIV3 = 0x8001;   // POST DIV 540/2 = 270Mhz  -> MJCP/HDVICPPLL1->PLLDIV4 = 0x8003;   // POST DIV 540/4 = 135Mhz  -> EDMA/Peripheral CFG0 (1/2 Kaleido clock)PLL1->PLLDIV5 = 0x8001;   // POST DIV 540/2 = 270Mhz -> VPSS (max 270)PLL1->PLLDIV6 = 0x8013;   // POST DIV 540/20 = 27Mhz -> VENC alternate for SDPLL1->PLLDIV7 = 0x8000;   // POST DIV 540/2 = 270Mhz -> DDRPLL1->PLLDIV8 = 0x800A;   // POST DIV 540/11 = 49.1Mhz-> MMC0/SD0PLL1->PLLDIV9 = 0x8013;   // POST DIV 540/20 = 27Mhz-> CLKOUTUTIL_waitLoop(300);/*Set the GOSET bit */    PLL1->PLLCMD = 0x00000001;  // Go  UTIL_waitLoop(300);  /*Wait for PLL to LOCK */    while(! (((SYSTEM->PLL0_CONFIG) & 0x07000000) == 0x07000000));     /*Enable the PLL Bit of PLLCTL*/ PLL1->PLLCTL |= 0x00000001;   // PLLEN=0return E_PASS;}

PLL2配置

Uint32 DEVICE_PLL2Init_297ARM_270DDR2_OSC24(){unsigned int CLKSRC=0x0; /*Power up the PLL*/PLL2->PLLCTL &= 0xFFFFFFFD;     /*Select the Clock Mode as Onchip Oscilator or External Clock on MXI pin*//*VDB has input on MXI pin */PLL2->PLLCTL &= 0xFFFFFEFF;  PLL2->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL2->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL2->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(50);  // PLLRST=1(reset assert)PLL2->PLLCTL |= 0x00000008;  UTIL_waitLoop(300);   /*Bring PLL out of Reset*/     PLL2->PLLCTL &= 0xFFFFFFF7;     //Program the Multiper and Pre-Divider for PLL2 PLL2->PLLM   =   0x63;   // VCO will 24*2M/N+1 = 594Mhz     PLL2->PREDIV =   0x8000|0x7;  PLL2->POSTDIV = 0x8000;     PLL2->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1      PLL2->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0      PLL2->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0      PLL2->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1       // Post divider setting for PLL2      PLL2->PLLDIV1 = 0x801E;   // 594/31=19.16 Mhz  ->USB PHY     PLL2->PLLDIV2 = 0x8001;   // 594/2 =297 Mhz -> ARM  PLL2->PLLDIV3 = 0x8001;   // POST DIV 594/2=297 Mhz  -> DDRx2 PLL2->PLLDIV4 = 0x8004;   // POST DIV 594/5=118.8 Mhz -> VOICE PLL2->PLLDIV5 = 0x8007;   // POST DIV 594/8 = 74.25 Mhz ->VIDEO HD  //GoCmd for PostDivider to take effect                 PLL2->PLLCMD = 0x00000001;            UTIL_waitLoop(150);                    /*Wait for PLL to LOCK */      while(! (((SYSTEM->PLL1_CONFIG) & 0x07000000) == 0x07000000));           UTIL_waitLoop(4100);                   //Enable the PLL2      PLL2->PLLCTL |= 0x00000001;   // PLLEN=0//do this after PLL's have been set upSYSTEM->PERI_CLKCTRL = 0x36ED0E7C;  //sample rate 2.048Mhzreturn E_PASS;}

DDR2配置

Uint32 DEVICE_DDR2Init_297ARM_270DDR2_OSC24(){ DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);    SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) & 0xFFFF9F3F;     // Set bit CLRZ (bit 13)   SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) | 0x00002000;     // Check VTP READY Status   while( !(SYSTEM->VTPIOCR & 0x8000));          // Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)   //SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004000;              // Set bit LOCK(bit7) and PWRSAVE (bit8)   SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00000080;            // Powerdown VTP as it is locked (bit 6)   // Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)   SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004040;    // Wait for calibration to complete   UTIL_waitLoop( 150 );    // Set the DDR2 to synreset, then enable it again  DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);  DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE); DDR->DDRPHYCR = 0x000000C6; DDR->SDBCR = 0x00D34A32;//Program SDRAM Bank Config RegisterDDR->SDBCR = 0x0053CA32;    DDR->SDTIMR  =0x44DC63D2;//Program SDRAM Timing Control Register1DDR->SDTIMR2 =0x4225C742;//Program SDRAM Timing Control Register2DDR->PBBPR = 0x000000F0;DDR->SDBCR = 0x00534A32;//Program SDRAM Bank Config RegisterDDR->SDRCR = 0x83A;//Program SDRAM Refresh Control Register  DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);  DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);  while(!(DDR->SDRSTAT&0x04));  return E_PASS;}



配置为OSC 24MHz,ARM 270MHz,DDR 216MHz即DM365-270

PLL1配置

Uint32 DEVICE_PLL1Init_270ARM_216DDR2_OSC24( ){unsigned int CLKSRC=0x0;      unsigned int j;/*Power up the PLL*/PLL1->PLLCTL &= 0xFFFFFFFD;PLL1->PLLCTL &= 0xFFFFFEFF;  PLL1->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL1->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL1->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(150); // PLLRST=1(reset assert)PLL1->PLLCTL |= 0x00000008; UTIL_waitLoop(300); /*Bring PLL out of Reset*/ PLL1->PLLCTL &= 0xFFFFFFF7;//Program the Multiper and Pre-Divider for PLL1PLL1->PLLM   =   0x9;   // VCO will 24*2M/N+1 = 432 MhzPLL1->PREDIV =   0x8000|0x0; PLL1->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1 //for(j=0; j<0x100; j++) {} PLL1->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 //for(j=0; j<0x100; j++) {}PLL1->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 //for(j=0; j<0x100; j++) {}PLL1->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1//Program the PostDiv for PLL1PLL1->POSTDIV = 0x8000;// Post divider setting for PLL1 PLL1->PLLDIV2 = 0x8001;   PLL1->PLLDIV3 = 0x8001;   // POST DIV 432/2  -> MJCP/HDVICPPLL1->PLLDIV4 = 0x8003;   // POST DIV 432/4  -> EDMA/EDMA CFGPLL1->PLLDIV5 = 0x8001;   // POST DIV 432/2 -> VPSSPLL1->PLLDIV7 = 0x8000;   // POST DIV 432/2 -> DDRPLL1->PLLDIV8 = 0x8003;   // POST DIV 432/4 -> MMC0/SD0PLL1->PLLDIV9 = 0x8001;   // POST DIV 432/2 -> CLKOUTUTIL_waitLoop(300);/*Set the GOSET bit */   PLL1->PLLCMD = 0x00000001;  // GoUTIL_waitLoop(300);/*Wait for PLL to LOCK */while(! (((SYSTEM->PLL0_CONFIG) & 0x07000000) == 0x07000000));/*Enable the PLL Bit of PLLCTL*/PLL1->PLLCTL |= 0x00000001;   // PLLEN=0return E_PASS;}

PLL2配置

Uint32 DEVICE_PLL2Init_270ARM_216DDR2_OSC24(){unsigned int CLKSRC=0x0;/*Power up the PLL*/PLL2->PLLCTL &= 0xFFFFFFFD;/*Select the Clock Mode as Onchip Oscilator or External Clock on MXI pin*//*VDB has input on MXI pin */PLL2->PLLCTL &= 0xFFFFFEFF;  PLL2->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL2->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL2->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(50); // PLLRST=1(reset assert)PLL2->PLLCTL |= 0x00000008;  UTIL_waitLoop(300); /*Bring PLL out of Reset*/PLL2->PLLCTL &= 0xFFFFFFF7;//Program the Multiper and Pre-Divider for PLL2PLL2->PLLM   =   0x2D;   // VCO will 24*2M/N+1 = 540MhzPLL2->PREDIV =   0x8000|0x7; PLL2->POSTDIV = 0x8000;PLL2->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1 PLL2->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 PLL2->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 PLL2->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1// Post divider setting for PLL2 PLL2->PLLDIV2 = 0x8000;   // 270/1 =270 Mhz -> ARM PLL2->PLLDIV4 = 0x8005;   // POST DIV 270/6 VOICEPLL2->PLLDIV5 = 0x8009;   // POST DIV 270/10 = 27MHZ ->VIDEO SD//GoCmd for PostDivider to take effectPLL2->PLLCMD = 0x00000001;  UTIL_waitLoop(150);/*Wait for PLL to LOCK */while(! (((SYSTEM->PLL1_CONFIG) & 0x07000000) == 0x07000000)); UTIL_waitLoop(4100);//Enable the PLL2PLL2->PLLCTL |= 0x00000001;   // PLLEN=0//do this after PLL's have been set upSYSTEM->PERI_CLKCTRL = 0x243F04FC;return E_PASS;}

DDR2配置

Uint32 DEVICE_DDR2Init_270ARM_216DDR2_OSC24(){DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) & 0xFFFF9F3F;// Set bit CLRZ (bit 13)SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) | 0x00002000;// Check VTP READY Statuswhile( !(SYSTEM->VTPIOCR & 0x8000));     // Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)//SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004000;         // Set bit LOCK(bit7) and PWRSAVE (bit8)SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00000080;     // Powerdown VTP as it is locked (bit 6)// Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004040;// Wait for calibration to complete UTIL_waitLoop( 150 );// Set the DDR2 to synreset, then enable it againDEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);DDR->DDRPHYCR = 0x000000C5; DDR->SDBCR = 0x08D34832;//Program SDRAM Bank Config RegisterDDR->SDBCR = 0x0853C832;DDR->SDTIMR = 0x369342D1;//Program SDRAM Timing Control Register1DDR->SDTIMR2 = 0x421DC702;//Program SDRAM Timing Control Register2DDR->PBBPR = 0x000000FE;DDR->SDBCR = 0x08534832;//Program SDRAM Bank Config RegisterDDR->SDRCR = 0x00000695;//Program SDRAM Refresh Control RegisterDEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);return E_PASS;}



配置为OSC24MHz,ARM 216MHz,DDR 173MHz即DM365-216

PLL1配置

Uint32 DEVICE_PLL1Init_ARM216_DDR173_OSC24()  {  unsigned int CLKSRC=0x0; /*Power up the PLL*/PLL1->PLLCTL &= 0xFFFFFFFD;PLL1->PLLCTL &= 0xFFFFFEFF;  PLL1->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL1->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL1->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(150); // PLLRST=1(reset assert)PLL1->PLLCTL |= 0x00000008; UTIL_waitLoop(300); /*Bring PLL out of Reset*/ PLL1->PLLCTL &= 0xFFFFFFF7;//Program the Multiper and Pre-Divider for PLL1PLL1->PLLM   =   0x88;   // VCO will 24*2M/N+1 = 343.58 MhzPLL1->PREDIV =   0x8000|0x12; PLL1->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1 //for(j=0; j<0x100; j++) {} PLL1->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 //for(j=0; j<0x100; j++) {}PLL1->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 //for(j=0; j<0x100; j++) {}PLL1->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1//Program the PostDiv for PLL1PLL1->POSTDIV = 0x8000;// Post divider setting for PLL1 PLL1->PLLDIV2 = 0x8001;   PLL1->PLLDIV3 = 0x8001;   // POST DIV 343.58/2  -> MJCP/HDVICPPLL1->PLLDIV4 = 0x8003;   // POST DIV 343.58/4  -> EDMA/EDMA CFGPLL1->PLLDIV5 = 0x8001;   // POST DIV 343.58/2 -> VPSSPLL1->PLLDIV7 = 0x8000;   // POST DIV 343.58/2 -> DDRPLL1->PLLDIV8 = 0x8003;   // POST DIV 343.58/4 -> MMC0/SD0PLL1->PLLDIV9 = 0x8001;   // POST DIV 343.58/2 -> CLKOUTUTIL_waitLoop(300);/*Set the GOSET bit */   PLL1->PLLCMD = 0x00000001;  // GoUTIL_waitLoop(300);/*Wait for PLL to LOCK */while(! (((SYSTEM->PLL0_CONFIG) & 0x07000000) == 0x07000000));/*Enable the PLL Bit of PLLCTL*/PLL1->PLLCTL |= 0x00000001;   // PLLEN=0return E_PASS;} 

PLL2配置

Uint32 DEVICE_PLL2Init_ARM216_DDR173_OSC24()  {  unsigned int CLKSRC=0x0;/*Power up the PLL*/PLL2->PLLCTL &= 0xFFFFFFFD;/*Select the Clock Mode as Onchip Oscilator or External Clock on MXI pin*//*VDB has input on MXI pin */PLL2->PLLCTL &= 0xFFFFFEFF;  PLL2->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL2->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL2->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(50); // PLLRST=1(reset assert)PLL2->PLLCTL |= 0x00000008;  UTIL_waitLoop(300); /*Bring PLL out of Reset*/PLL2->PLLCTL &= 0xFFFFFFF7;//Program the Multiper and Pre-Divider for PLL2PLL2->PLLM   =   0x9;   // VCO will 24*2M/N+1 = 432MhzPLL2->PREDIV =   0x8000|0x0; PLL2->POSTDIV = 0x8000;PLL2->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1 PLL2->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 PLL2->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 PLL2->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1// Post divider setting for PLL2 PLL2->PLLDIV2 = 0x8001;   // 432/2 =216 Mhz -> ARM //PLL2->PLLDIV4 = 0x8068;   // POST DIV 432/106 VOICEPLL2->PLLDIV5 = 0x800F;   // POST DIV 432/16 = 27MHZ ->VIDEO SD//GoCmd for PostDivider to take effectPLL2->PLLCMD = 0x00000001;  UTIL_waitLoop(150);/*Wait for PLL to LOCK */while(! (((SYSTEM->PLL1_CONFIG) & 0x07000000) == 0x07000000)); UTIL_waitLoop(4100);//Enable the PLL2PLL2->PLLCTL |= 0x00000001;   // PLLEN=0//do this after PLL's have been set upSYSTEM->PERI_CLKCTRL = 0x243F04FC;return E_PASS;}  

DDR2配置

Uint32 DEVICE_DDR2Init_ARM216_DDR173_OSC24(){      DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) & 0xFFFF9F3F;// Set bit CLRZ (bit 13)SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) | 0x00002000;// Check VTP READY Statuswhile( !(SYSTEM->VTPIOCR & 0x8000));     // Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)//SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004000;         // Set bit LOCK(bit7) and PWRSAVE (bit8)SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00000080;     // Powerdown VTP as it is locked (bit 6)// Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004040;// Wait for calibration to complete UTIL_waitLoop( 150 );// Set the DDR2 to synreset, then enable it againDEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);DDR->DDRPHYCR = 0x000000C6; DDR->SDBCR = 0x08D34832;//Program SDRAM Bank Config RegisterDDR->SDBCR = 0x0853C832;DDR->SDTIMR = 0x369342D1;//Program SDRAM Timing Control Register1DDR->SDTIMR2 = 0x421DC702;//Program SDRAM Timing Control Register2DDR->PBBPR = 0x000000FE;DDR->SDBCR = 0x08534832;//Program SDRAM Bank Config RegisterDDR->SDRCR = 0x00000695;//Program SDRAM Refresh Control RegisterDEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);return E_PASS;  }  

配置为OSC19.2MHz,ARM 216MHz,DDR 173MHz即DM365-216

PLL1配置

Uint32 DEVICE_PLL1Init_216ARM_173DDR2_OSC19P2MHZ(){unsigned int CLKSRC=0x0;      unsigned int j;/*Power up the PLL*/PLL1->PLLCTL &= 0xFFFFFFFD;PLL1->PLLCTL &= 0xFFFFFEFF;  PLL1->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL1->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL1->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(150); // PLLRST=1(reset assert)PLL1->PLLCTL |= 0x00000008; UTIL_waitLoop(300); /*Bring PLL out of Reset*/ PLL1->PLLCTL &= 0xFFFFFFF7;//Program the Multiper and Pre-Divider for PLL1PLL1->PLLM   =   0x2d;   // VCO will 24*2M/N+1 = 432 MhzPLL1->PREDIV =   0x8000|0x3; PLL1->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1 //for(j=0; j<0x100; j++) {} PLL1->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 //for(j=0; j<0x100; j++) {}PLL1->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 //for(j=0; j<0x100; j++) {}PLL1->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1//Program the PostDiv for PLL1PLL1->POSTDIV = 0x8000;// Post divider setting for PLL1 PLL1->PLLDIV2 = 0x8001;   PLL1->PLLDIV3 = 0x8001;   // POST DIV 432/2  -> MJCP/HDVICPPLL1->PLLDIV4 = 0x8003;   // POST DIV 432/4  -> EDMA/EDMA CFGPLL1->PLLDIV5 = 0x8003;   // POST DIV 432/4 -> VPSSPLL1->PLLDIV6 = 0x800f;   // POST DIV 432/16 - 27 MHZ ->VENC SD PLL1->PLLDIV7 = 0x8000; PLL1->PLLDIV8 = 0x8003;   // POST DIV 432/4 -> MMC0/SD0PLL1->PLLDIV9 = 0x8001;   // POST DIV 432/2 -> CLKOUTUTIL_waitLoop(300);/*Set the GOSET bit */   PLL1->PLLCMD = 0x00000001;  // GoUTIL_waitLoop(300);/*Wait for PLL to LOCK */while(! (((SYSTEM->PLL0_CONFIG) & 0x07000000) == 0x07000000));/*Enable the PLL Bit of PLLCTL*/PLL1->PLLCTL |= 0x00000001;   // PLLEN=0return E_PASS;}

PLL2配置

Uint32 DEVICE_PLL2Init_216ARM_173DDR2_OSC19P2MHZ(){unsigned int CLKSRC=0x0;/*Power up the PLL*/PLL2->PLLCTL &= 0xFFFFFFFD;/*Select the Clock Mode as Onchip Oscilator or External Clock on MXI pin*//*VDB has input on MXI pin */PLL2->PLLCTL &= 0xFFFFFEFF;  PLL2->PLLCTL |= CLKSRC<<8;/*Set PLLENSRC '0', PLL Enable(PLLEN) selection is controlled through MMR*/PLL2->PLLCTL &= 0xFFFFFFDF;/*Set PLLEN=0 => PLL BYPASS MODE*/PLL2->PLLCTL &= 0xFFFFFFFE;UTIL_waitLoop(50); // PLLRST=1(reset assert)PLL2->PLLCTL |= 0x00000008;  UTIL_waitLoop(300); /*Bring PLL out of Reset*/PLL2->PLLCTL &= 0xFFFFFFF7;//Program the Multiper and Pre-Divider for PLL2PLL2->PLLM   =   0xE0;   // VCO will 24*2M/N+1 = 344.064MhzPLL2->PREDIV =   0x8000|0x18; PLL2->POSTDIV = 0x8000;PLL2->SECCTL = 0x00470000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 1 PLL2->SECCTL = 0x00460000;   // Assert TENABLE = 1, TENABLEDIV = 1, TINITZ = 0 PLL2->SECCTL = 0x00400000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 0 PLL2->SECCTL = 0x00410000;   // Assert TENABLE = 0, TENABLEDIV = 0, TINITZ = 1// Post divider setting for PLL2 PLL2->PLLDIV2 = 0x8000; PLL2->PLLDIV3 = 0x8001;   // POST DIV 344.064/2  -> DDRPLL2->PLLDIV4 = 0x8006;PLL2->PLLDIV5 = 0x8000;   //GoCmd for PostDivider to take effectPLL2->PLLCMD = 0x00000001;  UTIL_waitLoop(150);/*Wait for PLL to LOCK */while(! (((SYSTEM->PLL1_CONFIG) & 0x07000000) == 0x07000000)); UTIL_waitLoop(4100);//Enable the PLL2PLL2->PLLCTL |= 0x00000001;   // PLLEN=0//do this after PLL's have been set upSYSTEM->PERI_CLKCTRL = 0x0BFF05FC;return E_PASS;}

DDR2配置

Uint32 DEVICE_DDR2Init_216ARM_173DDR2_OSC19P2MHZ(){DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) & 0xFFFF9F3F;// Set bit CLRZ (bit 13)SYSTEM->VTPIOCR = (SYSTEM->VTPIOCR) | 0x00002000;// Check VTP READY Statuswhile( !(SYSTEM->VTPIOCR & 0x8000));     // Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)//SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004000;         // Set bit LOCK(bit7) and PWRSAVE (bit8)SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00000080;     // Powerdown VTP as it is locked (bit 6)// Set bit VTP_IOPWRDWN bit 14 for DDR input buffers)SYSTEM->VTPIOCR = SYSTEM->VTPIOCR | 0x00004040;// Wait for calibration to complete UTIL_waitLoop( 150 );// Set the DDR2 to synreset, then enable it againDEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);DDR->DDRPHYCR = 0x000000C5; DDR->SDBCR = 0x08D34832;//Program SDRAM Bank Config RegisterDDR->SDBCR = 0x0853C832;DDR->SDTIMR =  0x2C923251;//Program SDRAM Timing Control Register1DDR->SDTIMR2 = 0x4217C722;//Program SDRAM Timing Control Register2DDR->PBBPR = 0x000000FE;DDR->SDBCR =  0x0853483;//Program SDRAM Bank Config RegisterDDR->SDRCR = 0x00000546;//Program SDRAM Refresh Control RegisterDEVICE_LPSCTransition(LPSC_DDR2,0,PSC_SYNCRESET);DEVICE_LPSCTransition(LPSC_DDR2,0,PSC_ENABLE);return E_PASS;}

原创粉丝点击