CoX Peripheral Interface(M051 Implement) V2.1.1.0
API Reference
xsysctl.c
Go to the documentation of this file.
00001 //*****************************************************************************
00002 //
00037 //
00038 //*****************************************************************************
00039 #include "xhw_types.h"
00040 #include "xhw_ints.h"
00041 #include "xhw_memmap.h"
00042 #include "xhw_nvic.h"
00043 #include "xhw_sysctl.h"
00044 #include "xdebug.h"
00045 #include "xsysctl.h"
00046 #include "xcore.h"
00047 
00048 
00049 
00050 static unsigned long s_ulExtClockMHz = 12;
00051 
00052 //*****************************************************************************
00053 //
00054 // This macro extracts the array index out of the peripheral clock source.
00055 //
00056 //*****************************************************************************
00057 #define SYSCTL_PERIPH_INDEX_CLK(a)                                            \
00058                                 (((a) >> 28) & 0xf)
00059 
00060 //*****************************************************************************
00061 //
00062 // This macro constructs the peripheral bit mask from the peripheral clock source.
00063 //
00064 //*****************************************************************************
00065 #define SYSCTL_PERIPH_MASK_CLK(a)                                             \
00066                                 ((((((a) & 0x1f0000) >> 16) <= 20) &&         \
00067                                 ((((a) & 0x1f0000) >> 16) >= 8))  ?           \
00068                                 ((0x7) << ((((a) & 0x1f0000) >> 16))) :       \
00069                                 ((0x3) << ((((a) & 0x1f0000) >> 16))))
00070 //*****************************************************************************
00071 //
00072 // This macro constructs the peripheral bit mask from the clock divder.
00073 //
00074 //*****************************************************************************
00075 #define SYSCTL_PERIPH_MASK_DIV(a)                                             \
00076                                 (((((a) & 0x1f00) >> 8) == 16)?               \
00077                                 ((0xFF) << ((((a) & 0x1f00) >> 8))) :         \
00078                                 ((0xF) << ((((a) & 0x1f00) >> 8))))
00079 
00080 //*****************************************************************************
00081 //
00082 // This macro constructs the peripheral enum of the peripheral clock source.
00083 //
00084 //*****************************************************************************
00085 #define SYSCTL_PERIPH_ENUM_CLK(a)                                             \
00086                                 (((a) & 0xff) << (((a) & 0x1f0000) >> 16))
00087                                 
00088 //*****************************************************************************
00089 //
00090 // This macro extracts the array index out of the peripheral number for reset.
00091 //
00092 //*****************************************************************************
00093 #define SYSCTL_PERIPH_INDEX_R(a)(((a) >> 30) & 0x3)
00094 
00095 //*****************************************************************************
00096 //
00097 // This macro constructs the peripheral bit mask from the peripheral number for 
00098 // reset.
00099 //
00100 //*****************************************************************************
00101 #define SYSCTL_PERIPH_MASK_R(a) ((a) & 0x20000000) ?                          \
00102                              (((a) & 0xff0000) >> (((a) & 0x1f000000) >> 24)):\
00103                              (((a) & 0xff0000) << (((a) & 0x1f000000) >> 24))
00104 
00105 //*****************************************************************************
00106 //
00107 // This macro extracts the array index out of the peripheral number for enable.
00108 //
00109 //*****************************************************************************
00110 #define SYSCTL_PERIPH_INDEX_E(a)(((a) >> 14) & 0x3)
00111 
00112 //*****************************************************************************
00113 //
00114 // This macro constructs the peripheral bit mask from the peripheral number for 
00115 // enable.
00116 //
00117 //*****************************************************************************
00118 #define SYSCTL_PERIPH_MASK_E(a) ((a) & 0x00002000) ?                          \
00119                                 (((a) & 0xff) >> (((a) & 0x1f00) >> 8)) :     \
00120                                 (((a) & 0xff) << (((a) & 0x1f00) >> 8))
00121 
00122 //*****************************************************************************
00123 //
00124 // An array that maps the "peripheral set" number (which is stored in the upper
00125 // nibble of the SYSCTL_PERIPH_* defines) to the GCR_IPRSTC? register that
00126 // controls the software reset for that peripheral.
00127 //
00128 //*****************************************************************************
00129 static const unsigned long g_pulIPRSTRegs[] =
00130 {
00131     GCR_IPRSTC1,
00132     GCR_IPRSTC2
00133 };
00134 
00135 //*****************************************************************************
00136 //
00137 // An array that maps the "peripheral set" number (which is stored in the upper
00138 // nibble of the SYSCTL_PERIPH_* defines) to the SYSCLK_AHBCLK register that
00139 // controls the run-mode enable for that peripheral.
00140 //
00141 //*****************************************************************************
00142 static const unsigned long g_pulAXBCLKRegs[] =
00143 {
00144     SYSCLK_AHBCLK,
00145     SYSCLK_APBCLK
00146 };
00147 
00148 //*****************************************************************************
00149 //
00150 // An array that maps the "peripheral clock source set" number (which is stored
00151 // in the upper nibble of the SYSCTL_PERIPH_* defines) to the SYSCLK_CLKSEL? 
00152 // register that set the Clock source for that peripheral.
00153 //
00154 //*****************************************************************************
00155 static const unsigned long g_pulCLKSELRegs[] =
00156 {
00157     SYSCLK_CLKSEL1,
00158     SYSCLK_CLKSEL2
00159 };
00160 
00161 //*****************************************************************************
00162 //
00164 //
00165 //*****************************************************************************
00166 typedef struct 
00167 {
00168     unsigned long ulPeripheralBase;
00169     unsigned long ulPeripheralID;
00170     unsigned long ulPeripheralIntNum;
00171 }
00172 tPeripheralTable;
00173 
00174 //*****************************************************************************
00175 //
00178 //
00179 //*****************************************************************************
00180 static const tPeripheralTable g_pPeripherals[] =
00181 {
00182     {xGPIO_PORTA_BASE, xSYSCTL_PERIPH_GPIOA, INT_GPAB},
00183     {xGPIO_PORTB_BASE, xSYSCTL_PERIPH_GPIOB, INT_GPAB},
00184     {xGPIO_PORTC_BASE, xSYSCTL_PERIPH_GPIOC, INT_GPCDE},
00185     {xGPIO_PORTD_BASE, xSYSCTL_PERIPH_GPIOD, INT_GPCDE},
00186     {xGPIO_PORTE_BASE, xSYSCTL_PERIPH_GPIOE, INT_GPCDE},
00187     {xWDT_BASE,        xSYSCTL_PERIPH_WDOG,  INT_WDT},
00188     {xUART0_BASE,      xSYSCTL_PERIPH_UART0, INT_UART0},
00189     {xUART1_BASE,      xSYSCTL_PERIPH_UART1, INT_UART1},
00190     {xTIMER0_BASE,     xSYSCTL_PERIPH_TIMER0, INT_TIMER0},
00191     {xTIMER1_BASE,     xSYSCTL_PERIPH_TIMER1, INT_TIMER1},
00192     {xTIMER2_BASE,     xSYSCTL_PERIPH_TIMER2, INT_TIMER2},
00193     {xTIMER3_BASE,     xSYSCTL_PERIPH_TIMER3, INT_TIMER3},
00194     {xSPI0_BASE,       xSYSCTL_PERIPH_SPI0, INT_SPI0},
00195     {xSPI1_BASE,       xSYSCTL_PERIPH_SPI1, INT_SPI1},
00196     {xI2C0_BASE,       xSYSCTL_PERIPH_I2C0, INT_I2C0},
00197     {xPWMA_BASE,       xSYSCTL_PERIPH_PWMA, INT_PWMA},
00198     {xPWMB_BASE,       xSYSCTL_PERIPH_PWMB, INT_PWMB},
00199     {xADC0_BASE,       xSYSCTL_PERIPH_ADC0, INT_ADC},
00200     {xACMP0_BASE,      xSYSCTL_PERIPH_ACMP0,INT_ACMP},
00201     {0,                0,                   0},
00202 };
00203     
00204                                 
00205 //*****************************************************************************
00206 //
00218 //
00219 //*****************************************************************************
00220 #if defined(gcc) || defined(__GNUC__)
00221 void __attribute__((naked))
00222 SysCtlDelay(unsigned long ulCount)
00223 {
00224     __asm("    sub     r0, #1\n"
00225           "    bne     SysCtlDelay\n"
00226           "    bx      lr");
00227 }
00228 #endif
00229 #if defined(ewarm) || defined(__ICCARM__)
00230 void
00231 SysCtlDelay(unsigned long ulCount)
00232 {
00233     __asm("    subs    r0, #1\n"
00234           "    bne.n   SysCtlDelay\n"
00235           "    bx      lr");
00236 }
00237 #endif
00238 #if defined(rvmdk) || defined(__CC_ARM)
00239 __asm void
00240 SysCtlDelay(unsigned long ulCount)
00241 {
00242     subs    r0, #1;
00243     bne     SysCtlDelay;
00244     bx      lr;
00245 }
00246 #endif
00247 
00248 //*****************************************************************************
00249 //
00259 //
00260 //*****************************************************************************
00261 #ifdef xDEBUG
00262 static xtBoolean
00263 SysCtlPeripheralValid(unsigned long ulPeripheral)
00264 {
00265     return((ulPeripheral == SYSCTL_PERIPH_ISP) ||
00266            (ulPeripheral == SYSCTL_PERIPH_WDT) ||
00267            (ulPeripheral == SYSCTL_PERIPH_GPIO)||
00268            (ulPeripheral == SYSCTL_PERIPH_TMR0)||
00269            (ulPeripheral == SYSCTL_PERIPH_TMR1)||
00270            (ulPeripheral == SYSCTL_PERIPH_TMR2)||
00271            (ulPeripheral == SYSCTL_PERIPH_TMR3)||
00272            (ulPeripheral == SYSCTL_PERIPH_I2C0)||
00273            (ulPeripheral == SYSCTL_PERIPH_SPI0)||
00274            (ulPeripheral == SYSCTL_PERIPH_SPI1)||
00275            (ulPeripheral == SYSCTL_PERIPH_UART0) ||
00276            (ulPeripheral == SYSCTL_PERIPH_UART1) ||
00277            (ulPeripheral == SYSCTL_PERIPH_PWM01) ||
00278            (ulPeripheral == SYSCTL_PERIPH_PWM23) ||
00279            (ulPeripheral == SYSCTL_PERIPH_PWM45) ||
00280            (ulPeripheral == SYSCTL_PERIPH_PWM67) ||
00281            (ulPeripheral == SYSCTL_PERIPH_ADC) ||
00282            (ulPeripheral == SYSCTL_PERIPH_ACMP));
00283 }
00284 #endif
00285 
00286 //*****************************************************************************
00287 //
00319 //
00320 //*****************************************************************************
00321 void
00322 xSysCtlClockSet(unsigned long ulSysClk, unsigned long ulConfig)
00323 {
00324     unsigned long ulOscFreq, ulSysDiv;
00325     unsigned long ulNF, ulNR, ulNO;
00326     xASSERT((ulSysClk > 0 && ulSysClk <= 50000000));
00327 
00328     //
00329     // Calc oscillator freq
00330     //
00331     s_ulExtClockMHz = ((ulConfig & SYSCTL_XTAL_MASK) >> 8);
00332     SysCtlKeyAddrUnlock();
00333     
00334     switch(ulConfig & SYSCTL_OSCSRC_M)
00335     {
00336         case xSYSCTL_OSC_MAIN:
00337         {
00338             xASSERT(!(ulConfig & xSYSCTL_MAIN_OSC_DIS));
00339             
00340             xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_XTL12M_EN;
00341             
00342             SysCtlHClockSourceSet(SYSCTL_HLCK_S_EXT12M);
00343             //
00344             // Wait for the External 4~24 MHz High Speed Crystal Clock Source is stable
00345             //
00346             while(!(xHWREG(SYSCLK_CLKSTATUS) & SYSCLK_CLKSTATUS_XTL12M_STB));
00347             ulOscFreq = s_ulExtClockMHz*1000000;      
00348             if((ulConfig & SYSCLK_PWRCON_OSC22M_EN)!=0)
00349             {
00350                 xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_OSC22M_EN;
00351             }
00352             if((ulConfig & SYSCLK_PLLCON_PD)!=0)
00353             {
00354                 xHWREG(SYSCLK_PLLCON) |= SYSCLK_PLLCON_PD;
00355             }
00356             break;
00357         }
00358 
00359         case xSYSCTL_OSC_INT:
00360         {
00361             xASSERT(!(ulConfig & xSYSCTL_INT_OSC_DIS));  
00362             xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_OSC22M_EN;
00363             SysCtlHClockSourceSet(SYSCTL_HLCK_S_INT22M);
00364             //
00365             // Wait for Internal 22.1184 MHz High Speed Oscillator Clock Source is stable
00366             //
00367             while(!(xHWREG(SYSCLK_CLKSTATUS) & SYSCLK_CLKSTATUS_OSC22M_STB));
00368             ulOscFreq = 22000000;
00369             if((ulConfig & SYSCLK_PWRCON_XTL12M_EN)!=0)
00370             {
00371                 xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_XTL12M_EN;
00372             }
00373             if((ulConfig & SYSCLK_PLLCON_PD)!=0)
00374             {
00375                 xHWREG(SYSCLK_PLLCON) |= SYSCLK_PLLCON_PD;
00376             }
00377             break;
00378         }
00379         case xSYSCTL_OSC_INTSL:
00380         {
00381             ulOscFreq = 10000;
00382             xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_OSC10K_EN;
00383             SysCtlHClockSourceSet(SYSCTL_HLCK_S_INT10K);
00384             //
00385             // Wait for Internal 10 kHz Low Speed Oscillator Clock Source is stable
00386             //
00387             while(!(xHWREG(SYSCLK_CLKSTATUS) & SYSCLK_CLKSTATUS_OSC10K_STB));
00388             if((ulConfig & SYSCLK_PWRCON_OSC22M_EN)!=0)
00389             {
00390                 xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_OSC22M_EN;
00391             }
00392             if((ulConfig & SYSCLK_PWRCON_XTL12M_EN)!=0)
00393             {
00394                 xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_XTL12M_EN;
00395             }
00396             if((ulConfig & SYSCLK_PLLCON_PD)!=0)
00397             {
00398                 xHWREG(SYSCLK_PLLCON) |= SYSCLK_PLLCON_PD;
00399             }
00400             break;
00401         }
00402         default:
00403         {
00404             xASSERT(0);
00405             break;
00406         }
00407                 
00408     }
00409     if(ulSysClk == ulOscFreq)
00410     {
00411         SysCtlIPClockDividerSet(SYSCTL_PERIPH_HCLK_D | (SYSCTL_SYSDIV_1 + 1));
00412     }
00413     else if (ulSysClk <= ulOscFreq)
00414     {
00415         //
00416         // Calc the SysDiv
00417         //    
00418         xASSERT(ulSysClk <= ulOscFreq);
00419             
00420         for(ulSysDiv = 1; ulSysDiv < 16; ulSysDiv++)
00421         {
00422             if((ulOscFreq / (ulSysDiv + 1)) <= ulSysClk)
00423             {
00424                 break;
00425             }
00426         }
00427         xASSERT(ulSysDiv < 16);
00428         SysCtlIPClockDividerSet(SYSCTL_PERIPH_HCLK_D | (ulSysDiv + 1));
00429     }
00430     else
00431     {
00432         xASSERT(!(ulConfig & xSYSCTL_PLL_PWRDN));
00433         xASSERT((ulSysClk >= 25000000 && ulSysClk <= 50000000));
00434         xASSERT(((ulConfig & SYSCTL_OSCSRC_M) == xSYSCTL_OSC_MAIN) ||
00435                 ((ulConfig & SYSCTL_OSCSRC_M) == xSYSCTL_OSC_INT));
00436         ulSysClk = ulSysClk << 2;
00437         ulNF = ulSysClk/1000000;
00438         ulNR = ulOscFreq/1000000;
00439         ulNO = 0x3;
00440         if((ulConfig & SYSCLK_PLLCON_PLL_SRC)==0)
00441         {
00442             //
00443             // Check the arguments .
00444             //
00445             xASSERT((ulConfig & SYSCLK_PWRCON_XTL12M_EN)==0); 
00446             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_PLL_SRC;
00447             if(ulNR%4 == 0)
00448             {
00449                 ulNF >>= 2;
00450                 ulNR >>= 2;
00451             }
00452             else if(ulNR%2 == 0)
00453             {
00454                 ulNF >>= 1;
00455                 ulNR >>= 1;
00456             }    
00457             else 
00458             {
00459                 if(ulSysClk % ulOscFreq == 0)
00460                 {
00461                     ulNR = ulOscFreq/1000000/2;
00462                     ulNF = ulSysClk*ulNR/ulOscFreq;
00463                 }
00464                 else
00465                 xASSERT(0);
00466             }
00467         }
00468         else 
00469         {
00470             //
00471             // Check the arguments .
00472             //
00473             xASSERT((ulConfig & SYSCLK_PWRCON_OSC22M_EN)==0);   
00474             xHWREG(SYSCLK_PLLCON) |= SYSCLK_PLLCON_PLL_SRC;
00475             ulNF >>= 1;
00476             ulNR >>= 1;
00477             if((ulConfig & SYSCLK_PWRCON_XTL12M_EN)!=0)
00478             {
00479                 xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_XTL12M_EN;
00480             }
00481         }
00482         xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_OSC22M_EN;
00483         SysCtlHClockSourceSet(SYSCTL_HLCK_S_INT22M);
00484         xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_FB_DV_M;
00485         xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_IN_DV_M;
00486         xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_OUT_DV_M;
00487         xHWREG(SYSCLK_PLLCON) |= ((ulNF-2) << SYSCLK_PLLCON_FB_DV_S);
00488         xHWREG(SYSCLK_PLLCON) |= ((ulNR-2) << SYSCLK_PLLCON_IN_DV_S);
00489         xHWREG(SYSCLK_PLLCON) |= (ulNO << SYSCLK_PLLCON_OUT_DV_S);
00490         xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_OE;
00491         xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_PD;
00492         SysCtlDelay(1000);
00493         SysCtlHClockSourceSet(SYSCTL_HLCK_S_PLL);
00494         //
00495         // Wait for Internal PLL Clock Source is stable
00496         //
00497         while(!(xHWREG(SYSCLK_CLKSTATUS) & 0x00000004));
00498         SysCtlIPClockDividerSet(SYSCTL_PERIPH_HCLK_D | (SYSCTL_SYSDIV_1 + 1));
00499         if((ulConfig & SYSCLK_PWRCON_OSC22M_EN)!=0)
00500                 {
00501                         xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_OSC22M_EN;
00502                 }
00503     }
00504     SysCtlKeyAddrLock();
00505 }
00506         
00507 //*****************************************************************************
00508 //
00522 //
00523 //*****************************************************************************
00524 void 
00525 xSysCtlPeripheralEnable2(unsigned long ulPeripheralBase)
00526 {
00527     unsigned long i;
00528     for(i=0; g_pPeripherals[i].ulPeripheralBase != 0; i++)
00529     {
00530         if(ulPeripheralBase == g_pPeripherals[i].ulPeripheralBase)
00531         {
00532             SysCtlPeripheralEnable(g_pPeripherals[i].ulPeripheralID);
00533             break;
00534         }
00535     }
00536 }
00537 
00538 //*****************************************************************************
00539 //
00551 //
00552 //*****************************************************************************
00553 void 
00554 xSysCtlPeripheralDisable2(unsigned long ulPeripheralBase)
00555 {
00556     unsigned long i;
00557     for(i=0; g_pPeripherals[i].ulPeripheralBase != 0; i++)
00558     {
00559         if(ulPeripheralBase == g_pPeripherals[i].ulPeripheralBase)
00560         {
00561             SysCtlPeripheralDisable(g_pPeripherals[i].ulPeripheralID);
00562             break;
00563         }
00564     }
00565 }
00566         
00567 //*****************************************************************************
00568 //
00578 //
00579 //*****************************************************************************
00580 void 
00581 xSysCtlPeripheralReset2(unsigned long ulPeripheralBase)
00582 {
00583     unsigned long i;
00584     for(i=0; g_pPeripherals[i].ulPeripheralBase != 0; i++)
00585     {
00586         if(ulPeripheralBase == g_pPeripherals[i].ulPeripheralBase)
00587         {
00588             SysCtlPeripheralReset(g_pPeripherals[i].ulPeripheralID);
00589             break;
00590         }
00591     }
00592 }
00593 
00594 //*****************************************************************************
00595 //
00606 //
00607 //*****************************************************************************
00608 unsigned long 
00609 xSysCtlPeripheralIntNumGet(unsigned long ulPeripheralBase)
00610 {
00611     unsigned long i;
00612     
00613     //
00614     // Check the arguments.
00615     //
00616     xASSERT((ulPeripheralBase == xGPIO_PORTA_BASE)||
00617             (ulPeripheralBase == xGPIO_PORTB_BASE)||
00618             (ulPeripheralBase == xGPIO_PORTC_BASE)||
00619             (ulPeripheralBase == xGPIO_PORTD_BASE)||
00620             (ulPeripheralBase == xGPIO_PORTE_BASE)||
00621             (ulPeripheralBase == xWDT_BASE)||   
00622             (ulPeripheralBase == xUART0_BASE)||   
00623             (ulPeripheralBase == xUART1_BASE)||   
00624             (ulPeripheralBase == xTIMER0_BASE)||    
00625             (ulPeripheralBase == xTIMER1_BASE)||          
00626             (ulPeripheralBase == xTIMER2_BASE)||    
00627             (ulPeripheralBase == xTIMER3_BASE)||        
00628             (ulPeripheralBase == xSPI0_BASE)||     
00629             (ulPeripheralBase == xSPI1_BASE)||
00630             (ulPeripheralBase == xI2C0_BASE)||   
00631             (ulPeripheralBase == xPWMA_BASE)||
00632             (ulPeripheralBase == xPWMB_BASE)||
00633             (ulPeripheralBase == xACMP0_BASE)||
00634             (ulPeripheralBase == xADC0_BASE)
00635             );
00636             
00637     for(i=0; g_pPeripherals[i].ulPeripheralBase != 0; i++)
00638     {
00639         if(ulPeripheralBase == g_pPeripherals[i].ulPeripheralBase)
00640         {
00641             break;
00642         }
00643     }
00644     return g_pPeripherals[i].ulPeripheralIntNum;
00645 }
00646 
00647 //*****************************************************************************
00648 //
00660 //
00661 //*****************************************************************************
00662 void
00663 xSysCtlPeripheralClockSourceSet(unsigned long ulPeripheralSrc,
00664                                 unsigned long ulDivide)
00665 {
00666     //
00667     // Check the arguments. 
00668     //
00669     xASSERT((ulPeripheralSrc==xSYSCTL_WDT0_HCLK_2048)||
00670             (ulPeripheralSrc==xSYSCTL_WDT0_EXTSL)||
00671             (ulPeripheralSrc==xSYSCTL_WDT0_INTSL)||
00672             (ulPeripheralSrc==xSYSCTL_ADC0_MAIN)||
00673             (ulPeripheralSrc==xSYSCTL_ADC0_PLL) ||
00674             (ulPeripheralSrc==xSYSCTL_ADC0_HCLK)||
00675             (ulPeripheralSrc==xSYSCTL_ADC0_INT) ||
00676             (ulPeripheralSrc==xSYSCTL_TIMER0_MAIN)||
00677             (ulPeripheralSrc==xSYSCTL_TIMER0_HCLK)||
00678             (ulPeripheralSrc==xSYSCTL_TIMER0_INT) ||
00679             (ulPeripheralSrc==xSYSCTL_TIMER1_MAIN)||
00680             (ulPeripheralSrc==xSYSCTL_TIMER1_HCLK)||
00681             (ulPeripheralSrc==xSYSCTL_TIMER1_INT) ||
00682             (ulPeripheralSrc==xSYSCTL_TIMER2_MAIN)||
00683             (ulPeripheralSrc==xSYSCTL_TIMER2_HCLK)||
00684             (ulPeripheralSrc==xSYSCTL_TIMER2_INT) ||
00685             (ulPeripheralSrc==xSYSCTL_TIMER3_MAIN)||
00686             (ulPeripheralSrc==xSYSCTL_TIMER3_HCLK)||
00687             (ulPeripheralSrc==xSYSCTL_TIMER3_INT)||
00688             (ulPeripheralSrc==xSYSCTL_UART0_MAIN)||
00689             (ulPeripheralSrc==xSYSCTL_UART0_PLL)||
00690             (ulPeripheralSrc==xSYSCTL_UART0_INT)||
00691             (ulPeripheralSrc==xSYSCTL_PWMA_MAIN)||
00692             (ulPeripheralSrc==xSYSCTL_PWMA_HCLK)||
00693             (ulPeripheralSrc==xSYSCTL_PWMA_INT) ||
00694             (ulPeripheralSrc==xSYSCTL_PWMB_MAIN)||
00695             (ulPeripheralSrc==xSYSCTL_PWMB_HCLK)||
00696             (ulPeripheralSrc==xSYSCTL_PWMB_INT) ||
00697             (ulPeripheralSrc==xSYSCTL_FRQDIV_MAIN)||
00698             (ulPeripheralSrc==xSYSCTL_FRQDIV_HCLK)||
00699             (ulPeripheralSrc==xSYSCTL_FRQDIV_INT) 
00700            );
00701     xASSERT((ulDivide <= 256) && (ulDivide >= 1));
00702 
00703     //
00704     // Set the peripheral clock source
00705     //
00706     SysCtlKeyAddrUnlock();
00707     
00708     xHWREG(g_pulCLKSELRegs[SYSCTL_PERIPH_INDEX_CLK(ulPeripheralSrc)]) &=
00709         ~(SYSCTL_PERIPH_MASK_CLK(ulPeripheralSrc));
00710     xHWREG(g_pulCLKSELRegs[SYSCTL_PERIPH_INDEX_CLK(ulPeripheralSrc)]) |=
00711         SYSCTL_PERIPH_ENUM_CLK(ulPeripheralSrc);
00712     
00713     if (ulPeripheralSrc & 0x01000000)
00714     {
00715         xHWREG(SYSCLK_CLKDIV) &= ~(SYSCTL_PERIPH_MASK_DIV(ulPeripheralSrc));
00716         xHWREG(SYSCLK_CLKDIV) |= ((ulDivide-1) << (((ulPeripheralSrc) & 
00717                                   0x1f00) >> 8));
00718     }
00719     SysCtlKeyAddrLock();
00720 }
00721 
00722 
00723 //*****************************************************************************
00724 //
00743 //
00744 //*****************************************************************************
00745 void
00746 SysCtlPeripheralReset(unsigned long ulPeripheral)
00747 {
00748     volatile unsigned long ulDelay;
00749 
00750     //
00751     // Check the arguments.
00752     //
00753     xASSERT(SysCtlPeripheralValid(ulPeripheral));
00754 
00755     //
00756     // Put the peripheral into the reset state.
00757     //
00758     xHWREG(g_pulIPRSTRegs[SYSCTL_PERIPH_INDEX_R(ulPeripheral)]) |=
00759         SYSCTL_PERIPH_MASK_R(ulPeripheral);
00760 
00761     //
00762     // Delay for a little bit.
00763     //
00764     for(ulDelay = 0; ulDelay < 16; ulDelay++)
00765     {
00766     }
00767 
00768     //
00769     // Take the peripheral out of the reset state.
00770     //
00771     xHWREG(g_pulIPRSTRegs[SYSCTL_PERIPH_INDEX_R(ulPeripheral)]) &=
00772         ~(SYSCTL_PERIPH_MASK_R(ulPeripheral));
00773 }
00774 
00775 //*****************************************************************************
00776 //
00794 //
00795 //*****************************************************************************
00796 void
00797 SysCtlPeripheralEnable(unsigned long ulPeripheral)
00798 {
00799     //
00800     // Check the arguments.
00801     //
00802     xASSERT(SysCtlPeripheralValid(ulPeripheral));
00803 
00804     //
00805     // Enable this peripheral.
00806     //
00807     SysCtlKeyAddrUnlock();
00808     xHWREG(g_pulAXBCLKRegs[SYSCTL_PERIPH_INDEX_E(ulPeripheral)]) |=
00809                                             SYSCTL_PERIPH_MASK_E(ulPeripheral);
00810     SysCtlKeyAddrLock();
00811 }
00812 
00813 //*****************************************************************************
00814 //
00831 //
00832 //*****************************************************************************
00833 void
00834 SysCtlPeripheralDisable(unsigned long ulPeripheral)
00835 {
00836     //
00837     // Check the arguments.
00838     //
00839     xASSERT(SysCtlPeripheralValid(ulPeripheral));
00840 
00841     //
00842     // Disable this peripheral.
00843     //
00844     SysCtlKeyAddrUnlock();
00845     xHWREG(g_pulAXBCLKRegs[SYSCTL_PERIPH_INDEX_E(ulPeripheral)]) &=
00846                                           ~(SYSCTL_PERIPH_MASK_E(ulPeripheral));
00847     SysCtlKeyAddrLock();
00848 }
00849 
00850 //*****************************************************************************
00851 //
00860 //
00861 //*****************************************************************************
00862 void
00863 SysCtlReset(void)
00864 {
00865     //
00866     // Perform a software reset request.  This will cause the device to reset,
00867     // no further code will be executed.
00868     //
00869     xHWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ;
00870 
00871     //
00872     // The device should have reset, so this should never be reached.  Just in
00873     // case, loop forever.
00874     //
00875     while(1)
00876     {
00877     }
00878 }
00879 
00880 //*****************************************************************************
00881 //
00888 //
00889 //*****************************************************************************
00890 void
00891 SysCtlSleep(void)
00892 {
00893     //
00894     // Wait for an interrupt to wake up.
00895     //
00896     SysCtlPowerDownEnable(1);
00897     SysCtlPowerDownWaitCPUSet(1);
00898     xCPUwfi();
00899     SysCtlPowerDownEnable(0);
00900     SysCtlPowerDownWaitCPUSet(0);
00901 
00902 }
00903 
00904 //*****************************************************************************
00905 //
00912 //
00913 //*****************************************************************************
00914 void
00915 SysCtlDeepSleep(void)
00916 {
00917     //
00918     // Enable deep-sleep.
00919     //
00920     xHWREG(NVIC_SYS_CTRL) |= NVIC_SYS_CTRL_SLEEPDEEP;
00921     SysCtlPowerDownEnable(1);
00922     SysCtlPowerDownWaitCPUSet(1);
00923 
00924     //
00925     // Wait for an interrupt.
00926     //
00927     xCPUwfi();
00928 
00929     //
00930     // Disable deep-sleep so that a future sleep will work correctly.
00931     //
00932     xHWREG(NVIC_SYS_CTRL) &= ~(NVIC_SYS_CTRL_SLEEPDEEP);
00933     SysCtlPowerDownEnable(0);
00934     SysCtlPowerDownWaitCPUSet(0);
00935 }
00936 
00937 //*****************************************************************************
00938 //
00947 //
00948 //*****************************************************************************
00949 void 
00950 SysCtlPowerDownWaitCPUSet(xtBoolean bEnable)
00951 {    
00952     //
00953     // Enable BOD reset function or interrupt function.
00954     //
00955     SysCtlKeyAddrUnlock();
00956     if(bEnable)
00957     {
00958         xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_PD_WAIT_CPU;
00959     }
00960     else
00961     {
00962         xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_PD_WAIT_CPU;
00963     }
00964     SysCtlKeyAddrLock();
00965 }
00966 
00967 //*****************************************************************************
00968 //
00995 //
00996 //*****************************************************************************
00997 void
00998 SysCtlPeripheralClockSourceSet(unsigned long ulPeripheralSrc)
00999 {
01000     //
01001     // Check the arguments.  
01002     //
01003     xASSERT((ulPeripheralSrc==SYSCTL_PERIPH_WDG_S_HCLK_2048) ||
01004             (ulPeripheralSrc==SYSCTL_PERIPH_WDG_EXTSL) ||
01005             (ulPeripheralSrc==SYSCTL_PERIPH_WDG_S_INT10K) ||
01006             (ulPeripheralSrc==SYSCTL_PERIPH_ADC_S_EXT12M) ||
01007             (ulPeripheralSrc==SYSCTL_PERIPH_ADC_S_PLL) ||
01008             (ulPeripheralSrc==SYSCTL_PERIPH_ADC_S_HCLK) ||
01009             (ulPeripheralSrc==SYSCTL_PERIPH_ADC_S_INT22M) ||
01010             (ulPeripheralSrc==SYSCTL_PERIPH_TMR0_S_EXT12M)||
01011             (ulPeripheralSrc==SYSCTL_PERIPH_TMR0_S_HCLK) ||
01012             (ulPeripheralSrc==SYSCTL_PERIPH_TMR0_S_INT22M) ||
01013             (ulPeripheralSrc==SYSCTL_PERIPH_TMR1_S_EXT12M) ||
01014             (ulPeripheralSrc==SYSCTL_PERIPH_TMR1_S_HCLK) ||
01015             (ulPeripheralSrc==SYSCTL_PERIPH_TMR1_S_INT22M) ||
01016             (ulPeripheralSrc==SYSCTL_PERIPH_TMR2_S_EXT12M) ||
01017             (ulPeripheralSrc==SYSCTL_PERIPH_TMR2_S_HCLK) ||
01018             (ulPeripheralSrc==SYSCTL_PERIPH_TMR2_S_INT22M) ||
01019             (ulPeripheralSrc==SYSCTL_PERIPH_TMR3_S_EXT12M) ||
01020             (ulPeripheralSrc==SYSCTL_PERIPH_TMR3_S_HCLK) ||
01021             (ulPeripheralSrc==SYSCTL_PERIPH_TMR3_S_INT22M) ||
01022             (ulPeripheralSrc==SYSCTL_PERIPH_UART_S_EXT12M) ||
01023             (ulPeripheralSrc==SYSCTL_PERIPH_UART_S_PLL) ||
01024             (ulPeripheralSrc==SYSCTL_PERIPH_UART_S_INT22M) ||
01025             (ulPeripheralSrc==SYSCTL_PERIPH_PWM01_S_EXT12M)||
01026             (ulPeripheralSrc==SYSCTL_PERIPH_PWM01_S_HCLK) ||
01027             (ulPeripheralSrc==SYSCTL_PERIPH_PWM01_S_INT22M) ||
01028             (ulPeripheralSrc==SYSCTL_PERIPH_PWM23_S_EXT12M) ||
01029             (ulPeripheralSrc==SYSCTL_PERIPH_PWM23_S_HCLK) ||
01030             (ulPeripheralSrc==SYSCTL_PERIPH_PWM23_S_INT22M) ||
01031             (ulPeripheralSrc==SYSCTL_PERIPH_PWM45_S_EXT12M) ||
01032             (ulPeripheralSrc==SYSCTL_PERIPH_PWM45_S_HCLK) ||
01033             (ulPeripheralSrc==SYSCTL_PERIPH_PWM45_S_INT22M) ||
01034             (ulPeripheralSrc==SYSCTL_PERIPH_PWM67_S_EXT12M) ||
01035             (ulPeripheralSrc==SYSCTL_PERIPH_PWM67_S_HCLK) ||
01036             (ulPeripheralSrc==SYSCTL_PERIPH_PWM67_S_INT22M) ||
01037             (ulPeripheralSrc==SYSCTL_PERIPH_FRQDIV_S_EXT12M) ||
01038             (ulPeripheralSrc==SYSCTL_PERIPH_FRQDIV_S_HCLK) ||
01039             (ulPeripheralSrc==SYSCTL_PERIPH_FRQDIV_S_INT22M)                   
01040            );
01041 
01042     //
01043     // Set  this peripheral clock source
01044     //
01045     SysCtlKeyAddrUnlock();
01046     xHWREG(g_pulCLKSELRegs[SYSCTL_PERIPH_INDEX_CLK(ulPeripheralSrc)]) &=
01047         ~(SYSCTL_PERIPH_MASK_CLK(ulPeripheralSrc));
01048     xHWREG(g_pulCLKSELRegs[SYSCTL_PERIPH_INDEX_CLK(ulPeripheralSrc)]) |=
01049         SYSCTL_PERIPH_ENUM_CLK(ulPeripheralSrc);
01050     SysCtlKeyAddrLock();
01051 }
01052 
01053 //*****************************************************************************
01054 //
01066 //
01067 //*****************************************************************************
01068 void
01069 SysCtlHClockSourceSet(unsigned long ulHclkSrcSel)
01070 {
01071     //
01072     // Check the arguments.
01073     //
01074     xASSERT(((ulHclkSrcSel==SYSCTL_HLCK_S_EXT12M)?
01075               (xHWREG(SYSCLK_PWRCON) & SYSCLK_PWRCON_XTL12M_EN)
01076               == SYSCLK_PWRCON_XTL12M_EN
01077           : 1)||
01078             ((ulHclkSrcSel==SYSCTL_HLCK_S_PLL)?
01079              (xHWREG(SYSCLK_PLLCON)&SYSCLK_PLLCON_OE)==0 &&
01080              (xHWREG(SYSCLK_PLLCON)&SYSCLK_PLLCON_PD)==0
01081           : 1)||
01082             ((ulHclkSrcSel==SYSCTL_HLCK_S_INT10K)?
01083              (xHWREG(SYSCLK_PWRCON) & SYSCLK_PWRCON_OSC10K_EN)
01084              == SYSCLK_PWRCON_OSC10K_EN
01085           : 1)||
01086             ((ulHclkSrcSel==SYSCTL_HLCK_S_INT22M)?
01087              (xHWREG(SYSCLK_PWRCON) & SYSCLK_PWRCON_OSC22M_EN)
01088              == SYSCLK_PWRCON_OSC22M_EN
01089           : 1)
01090            );
01091 
01092     //
01093     // Enable HCLK clock source.
01094     //
01095     SysCtlKeyAddrUnlock();
01096     xHWREG(SYSCLK_CLKSEL0) &=~SYSCLK_CLKSEL0_HCLK_M;
01097     xHWREG(SYSCLK_CLKSEL0) |=ulHclkSrcSel;
01098     SysCtlKeyAddrLock();
01099 }
01100 
01101 
01102 //*****************************************************************************
01103 //
01115 //
01116 //*****************************************************************************
01117 void
01118 SysCtlSysTickSourceSet(unsigned long ulHclkSrcSel)
01119 {
01120     //
01121     // Check the arguments.
01122     //
01123     xASSERT((ulHclkSrcSel==SYSCTL_STCLK_S_EXT12M)||
01124             (ulHclkSrcSel==SYSCTL_STCLK_S_EXT12M_2)||
01125             (ulHclkSrcSel==SYSCTL_STCLK_S_HCLK_2)||
01126             (ulHclkSrcSel==SYSCTL_STCLK_S_INT22M_2)
01127            );
01128 
01129     //
01130     // Enable SysTickclock source.
01131     //
01132     SysCtlKeyAddrUnlock();
01133     xHWREG(SYSCLK_CLKSEL0) &=~SYSCLK_CLKSEL0_STCLK_M;
01134     xHWREG(SYSCLK_CLKSEL0) |=ulHclkSrcSel;
01135     SysCtlKeyAddrLock();
01136 }
01137 
01138 //*****************************************************************************
01139 //
01147 //
01148 //*****************************************************************************
01149 void 
01150 SysCtlCPUReset(void)
01151 {
01152     SysCtlKeyAddrUnlock();
01153     xHWREG(GCR_IPRSTC1) |= GCR_IPRSTC1_CPU;
01154     SysCtlKeyAddrLock();
01155 }
01156 
01157 //*****************************************************************************
01158 //
01166 //
01167 //*****************************************************************************
01168 void 
01169 SysCtlChipReset(void)
01170 {
01171     SysCtlKeyAddrUnlock();
01172     xHWREG(GCR_IPRSTC1) |= GCR_IPRSTC1_CHIP;
01173     SysCtlKeyAddrLock();
01174 }
01175 
01176 //*****************************************************************************
01177 //
01186 //
01187 //*****************************************************************************
01188 xtBoolean 
01189 SysCtlKeyAddrUnlock(void)
01190 {
01191     //
01192     // Unlock the protected registers.
01193     //
01194     xHWREG(GCR_REGLOCK) = 0x59;
01195     xHWREG(GCR_REGLOCK) = 0x16;
01196     xHWREG(GCR_REGLOCK) = 0x88;
01197     
01198     return xHWREG(GCR_REGLOCK)&0x01;
01199 }
01200 
01201 //*****************************************************************************
01202 //
01211 //
01212 //*****************************************************************************
01213 xtBoolean 
01214 SysCtlKeyAddrLock(void)
01215 {
01216     //
01217     // Lock the protected registers.
01218     //
01219     xHWREG(GCR_REGLOCK) = 0x00;
01220     
01221     return xHWREG(GCR_REGLOCK)&0x01;
01222 }
01223 
01224 //*****************************************************************************
01225 //
01236 //
01237 //*****************************************************************************
01238 unsigned long 
01239 SysCtlResetSrcGet(void)
01240 {
01241     //
01242     // Get reset source from last operation.
01243     //
01244     
01245     return xHWREG(GCR_RSTSRC);
01246 }
01247 
01248 //*****************************************************************************
01249 //
01262 //
01263 //*****************************************************************************
01264 void 
01265 SysCtlResetSrcClear(unsigned long ulSrc)
01266 {
01267     //
01268     // Check the arguments.
01269     //
01270     xASSERT((ulSrc == SYSCTL_RSTSRC_POR) ||
01271             (ulSrc == SYSCTL_RSTSRC_PAD) ||
01272             (ulSrc == SYSCTL_RSTSRC_WDG) ||
01273             (ulSrc == SYSCTL_RSTSRC_LVR) ||
01274             (ulSrc == SYSCTL_RSTSRC_BOD) ||
01275             (ulSrc == SYSCTL_RSTSRC_SYS) ||
01276             (ulSrc == SYSCTL_RSTSRC_CPU));
01277     //
01278     // Clear reset source from last operation.
01279     //
01280     
01281     xHWREG(GCR_RSTSRC) |= ulSrc;
01282 }
01283 
01284 //*****************************************************************************
01285 //
01294 //
01295 //*****************************************************************************
01296 void 
01297 SysCtlBODEnable(xtBoolean bEnable)
01298 {
01299     //
01300     // Enable BOD function or not.
01301     //
01302     SysCtlKeyAddrUnlock();
01303     if(bEnable)
01304     {
01305         xHWREG(GCR_BODCR) |= GCR_BODCR_BOD_EN;
01306     }
01307     else
01308     {
01309         xHWREG(GCR_BODCR) &= ~GCR_BODCR_BOD_EN;
01310     }
01311     SysCtlKeyAddrLock();
01312 }
01313 
01314 //*****************************************************************************
01315 //
01326 //
01327 //*****************************************************************************
01328 void 
01329 SysCtlBODVoltSelect(unsigned char ulVoltage)
01330 {
01331     //
01332     // Check the arguments.
01333     //
01334     xASSERT((ulVoltage == SYSCTL_BOD_2_2) ||
01335             (ulVoltage == SYSCTL_BOD_2_7) ||
01336             (ulVoltage == SYSCTL_BOD_3_7) ||
01337             (ulVoltage == SYSCTL_BOD_4_3));
01338     //
01339     // Select BOD threshold voltage.
01340     //
01341     SysCtlKeyAddrUnlock();
01342     xHWREG(GCR_BODCR) &= ~GCR_BODCR_BOD_VL_M;
01343     xHWREG(GCR_BODCR) |= ulVoltage;
01344     SysCtlKeyAddrLock();
01345 }
01346 
01347 //*****************************************************************************
01348 //
01357 //
01358 //*****************************************************************************
01359 void 
01360 SysCtlBODLowPowerModeEnable(xtBoolean bEnable)
01361 {
01362     //
01363     // Enable BOD low power mode or not.
01364     //
01365     SysCtlKeyAddrUnlock();
01366     if(bEnable)
01367     {
01368         xHWREG(GCR_BODCR) |= GCR_BODCR_BOD_LPM;
01369     }
01370     else
01371     {
01372         xHWREG(GCR_BODCR) &= ~GCR_BODCR_BOD_LPM;
01373     }
01374     SysCtlKeyAddrLock();
01375 }
01376 
01377 //*****************************************************************************
01378 //
01387 //
01388 //*****************************************************************************
01389 void 
01390 SysCtlLowVoltRstEnable(xtBoolean bEnable)
01391 {
01392     //
01393     // Enable Enable low voltage reset or not.
01394     //
01395     SysCtlKeyAddrUnlock();
01396     if(bEnable)
01397     {
01398         xHWREG(GCR_BODCR) |= GCR_BODCR_LVR_EN;
01399     }
01400     else
01401     {
01402         xHWREG(GCR_BODCR) &= ~GCR_BODCR_LVR_EN;
01403     }
01404     SysCtlKeyAddrLock();
01405 }
01406 
01407 //*****************************************************************************
01408 //
01418 //
01419 //*****************************************************************************
01420 xtBoolean
01421 SysCtlBODStateGet(void)
01422 {
01423     //
01424     // Get BOD state.
01425     //
01426     
01427     return (xHWREG(GCR_BODCR) & GCR_BODCR_BOD_OUT)>>6;
01428 }
01429 
01430 //*****************************************************************************
01431 //
01440 //
01441 //*****************************************************************************
01442 void 
01443 SysCtlTempatureSensorEnable(xtBoolean bEnable)
01444 {
01445     //
01446     // Enable Enable Tempature Sensor or not.
01447     //
01448     if(bEnable)
01449     {
01450         xHWREG(GCR_TEMPCR) |= GCR_TEMPCR_VTEMP_EN;
01451     }
01452     else
01453     {
01454         xHWREG(GCR_TEMPCR) &= ~GCR_TEMPCR_VTEMP_EN;
01455     }
01456 }
01457 //*****************************************************************************
01458 //
01465 //
01466 //*****************************************************************************
01467 void 
01468 SysCtlBODRstEnable(xtBoolean bEnable)
01469 {
01470     //
01471     // Enable BOD reset function or interrupt function.
01472     //
01473     SysCtlKeyAddrUnlock();
01474     if(bEnable)
01475     {
01476         xHWREG(GCR_BODCR) |= GCR_BODCR_BOD_RSTEN;
01477     }
01478     else
01479     {
01480         xHWREG(GCR_BODCR) &= ~GCR_BODCR_BOD_RSTEN;
01481     }
01482     SysCtlKeyAddrLock();
01483 }
01484 
01485 //*****************************************************************************
01486 //
01502 //
01503 //*****************************************************************************
01504 void
01505 SysCtlIPClockDividerSet(unsigned long ulConfig)
01506 {
01507     //
01508     // Check the arguments.
01509     //
01510     xASSERT((ulConfig & 0xFF)<=256);
01511     
01512     //
01513     // Set  this peripheral clock source
01514     //
01515     xHWREG(SYSCLK_CLKDIV) &= ~(SYSCTL_PERIPH_MASK_DIV(ulConfig));
01516     xHWREG(SYSCLK_CLKDIV) |= (SYSCTL_PERIPH_ENUM_CLK(ulConfig)-1);
01517 }
01518 
01519 //*****************************************************************************
01520 //
01533 //
01534 //*****************************************************************************
01535 void 
01536 SysCtlFreqDividerOutputEnable(xtBoolean bEnable, unsigned char u8Divider)
01537 {
01538     //
01539     // Check the arguments.
01540     //
01541     xASSERT(u8Divider<=15);
01542     
01543     //
01544     // Enable BOD reset function or interrupt function.
01545     //
01546     if(bEnable)
01547     {
01548         xHWREG(SYSCLK_FRQDIV) &= ~SYSCLK_FRQDIV_FSEL_M;
01549         xHWREG(SYSCLK_FRQDIV) |= u8Divider;
01550         xHWREG(SYSCLK_FRQDIV) |= SYSCLK_FRQDIV_FDIV_EN;
01551         SysCtlPeripheralEnable(SYSCTL_PERIPH_FDIV);
01552         
01553     }
01554     else
01555     {
01556         xHWREG(SYSCLK_FRQDIV) &= ~SYSCLK_FRQDIV_FDIV_EN;
01557         SysCtlPeripheralDisable(SYSCTL_PERIPH_FDIV);
01558     }
01559 }
01560 //*****************************************************************************
01561 //
01574 //
01575 //*****************************************************************************
01576 void 
01577 SysCtlPWRWUIntEnable(xtBoolean bEnable, xtBoolean bDelay)
01578 {    
01579     //
01580     // Enable BOD reset function or interrupt function.
01581     //
01582     SysCtlKeyAddrUnlock();
01583     if(bEnable)
01584     {
01585         xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_PD_INT_EN;
01586         if(bDelay)
01587         {
01588             xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_WU_DLY;
01589         }
01590         else
01591         {
01592             xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_WU_DLY;
01593         }
01594     }
01595     else
01596     {
01597         xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_PD_INT_EN;
01598         xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_WU_DLY;
01599     }
01600     SysCtlKeyAddrLock();
01601 }
01602 
01603 //*****************************************************************************
01604 //
01613 //
01614 //*****************************************************************************
01615 void 
01616 SysCtlPowerDownEnable(xtBoolean bEnable)
01617 {    
01618     //
01619     // Enable or active power down function.
01620     //
01621     SysCtlKeyAddrUnlock();
01622     if(bEnable)
01623     {
01624         xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_PWR_DO_EN;
01625     }
01626     else
01627     {
01628         xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_PWR_DO_EN;
01629     }
01630     SysCtlKeyAddrLock();
01631 }
01632 
01633 //*****************************************************************************
01634 //
01642 //
01643 //*****************************************************************************
01644 unsigned long 
01645 SysCtlHClockGet(void)
01646 {
01647     unsigned long  ulFreqout = 0, ulAHBDivider, ulPLLSrc, ulNF, ulNR, ulNO;
01648     unsigned long ulMap[4] = {1, 2, 2, 4};
01649     //
01650     // external 12MHz crystal clock.
01651     //
01652     if ((xHWREG(SYSCLK_CLKSEL0) & SYSCLK_CLKSEL0_HCLK_M) ==                    \
01653                                  SYSCLK_CLKSEL0_HCLK12M)
01654     {
01655         ulFreqout = s_ulExtClockMHz*1000000;  
01656     }
01657     //
01658     // PLL clock.
01659     //
01660     else if((xHWREG(SYSCLK_CLKSEL0) & SYSCLK_CLKSEL0_HCLK_M) ==                \
01661                                      SYSCLK_CLKSEL0_HCLKPLL)    
01662     {
01663         if((xHWREG(SYSCLK_PLLCON) & SYSCLK_PLLCON_PLL_SRC))
01664         {
01665             ulPLLSrc = 22000000;
01666         }
01667         else
01668         {
01669             ulPLLSrc = s_ulExtClockMHz*1000000;
01670         }
01671         if ((xHWREG(SYSCLK_PLLCON) & SYSCLK_PLLCON_PD))
01672         {
01673             ulFreqout = 0;
01674         }
01675         else
01676         {
01677             ulNF = (xHWREG(SYSCLK_PLLCON) & SYSCLK_PLLCON_FB_DV_M);
01678             ulNR = (xHWREG(SYSCLK_PLLCON) & SYSCLK_PLLCON_IN_DV_M) >>          \
01679                                            SYSCLK_PLLCON_IN_DV_S;
01680             ulNO = (xHWREG(SYSCLK_PLLCON) & SYSCLK_PLLCON_OUT_DV_M) >>          \
01681                                            SYSCLK_PLLCON_OUT_DV_S;
01682             ulFreqout =  ulPLLSrc*(ulNF+2)/(ulNR+2)/(ulMap[ulNO]);
01683         }
01684     }
01685     //
01686     // internal 10KHz oscillator clock.
01687     //
01688     else if((xHWREG(SYSCLK_CLKSEL0) & SYSCLK_CLKSEL0_HCLK_M) ==                \
01689                                      SYSCLK_CLKSEL0_HCLK10K)   
01690     {
01691         ulFreqout = 10000;
01692     }
01693     //
01694     // internal 22MHz oscillator clock.
01695     //
01696     else                              
01697     {
01698         ulFreqout = 22000000;
01699     
01700     }
01701     ulAHBDivider = (xHWREG(SYSCLK_CLKDIV) & SYSCLK_CLKDIV_HCLK_M) + 1 ;
01702     return (ulFreqout/ulAHBDivider);
01703 }
01704 
01705 //*****************************************************************************
01706 //
01739 //
01740 //*****************************************************************************
01741 void
01742 SysCtlHClockSet(unsigned long ulConfig)
01743 {
01744 
01745     s_ulExtClockMHz = ((ulConfig & SYSCTL_XTAL_MASK) >> 8);
01746     SysCtlKeyAddrUnlock();
01747     
01748     //
01749     // HLCK clock source is SYSCLK_CLKSEL0_HCLK12M
01750     //
01751     if(((ulConfig & 0xF0) >> 4) == SYSCLK_CLKSEL0_HCLK12M)
01752     {
01753         //
01754         // Check the arguments .
01755         //
01756         xASSERT((ulConfig & SYSCLK_PWRCON_XTL12M_EN)==0);
01757         
01758         xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_XTL12M_EN;
01759         SysCtlHClockSourceSet(SYSCTL_HLCK_S_EXT12M);
01760         //
01761         // Wait for the External 4~24 MHz High Speed Crystal Clock Source is stable
01762         //
01763         while(!(xHWREG(SYSCLK_CLKSTATUS) & SYSCLK_CLKSTATUS_XTL12M_STB));  
01764         SysCtlIPClockDividerSet(SYSCTL_PERIPH_HCLK_D |                        \
01765                                (((ulConfig & 0x0F000000) >> 24)+1));
01766         if((ulConfig & SYSCLK_PWRCON_OSC22M_EN)!=0)
01767         {
01768             xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_OSC22M_EN;
01769         }
01770 
01771         if((ulConfig & SYSCLK_PLLCON_PD)!=0)
01772         {
01773             xHWREG(SYSCLK_PLLCON) |= SYSCLK_PLLCON_PD;
01774         }
01775         
01776     }
01777     //
01778     // HLCK clock source is SYSCLK_CLKSEL0_HCLKPLL
01779     //
01780     else if(((ulConfig & 0xF0) >> 4) == SYSCLK_CLKSEL0_HCLKPLL)
01781     {
01782         //
01783         // Check the arguments .
01784         //
01785         xASSERT((ulConfig & SYSCLK_PLLCON_PD)==0);
01786         
01787         if((ulConfig & SYSCLK_PLLCON_PLL_SRC)==0)
01788         {
01789             //
01790             // Check the arguments .
01791             //
01792             xASSERT((ulConfig & SYSCLK_PWRCON_XTL12M_EN)==0);
01793             
01794             xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_XTL12M_EN;
01795 
01796             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_PLL_SRC;
01797 
01798             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_OE;
01799 
01800             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_PD;
01801             
01802             SysCtlDelay(1000);
01803             
01804             if((ulConfig & SYSCLK_PWRCON_OSC22M_EN)!=0)
01805             {
01806                 xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_OSC22M_EN;
01807             }           
01808         }
01809         else 
01810         {
01811             //
01812             // Check the arguments .
01813             //
01814             xASSERT((ulConfig & SYSCLK_PWRCON_OSC22M_EN)==0);
01815 
01816             xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_OSC22M_EN;
01817 
01818             SysCtlHClockSourceSet(SYSCTL_HLCK_S_INT22M);
01819 
01820             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_FB_DV_M;
01821             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_IN_DV_M;
01822             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_OUT_DV_M;
01823             
01824             xHWREG(SYSCLK_PLLCON) |= (0x5E << SYSCLK_PLLCON_FB_DV_S);
01825             xHWREG(SYSCLK_PLLCON) |= (0x9 << SYSCLK_PLLCON_IN_DV_S);
01826             xHWREG(SYSCLK_PLLCON) |= (0x3 << SYSCLK_PLLCON_OUT_DV_S);
01827             
01828             xHWREG(SYSCLK_PLLCON) |= SYSCLK_PLLCON_PLL_SRC;
01829 
01830             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_OE;
01831             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_PD;
01832             xHWREG(SYSCLK_PLLCON) &= ~SYSCLK_PLLCON_BP;
01833             SysCtlDelay(1000);
01834             
01835             if((ulConfig & SYSCLK_PWRCON_XTL12M_EN)!=0)
01836             {
01837                 xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_XTL12M_EN;
01838             }
01839         }
01840         SysCtlHClockSourceSet(SYSCTL_HLCK_S_PLL);
01841         //
01842         // Wait for Internal PLL Clock Source is stable
01843         //
01844         while(!(xHWREG(SYSCLK_CLKSTATUS) & SYSCLK_CLKSTATUS_PLL_STB));
01845         SysCtlIPClockDividerSet(SYSCTL_PERIPH_HCLK_D |                        \
01846                                (((ulConfig & 0x0F000000) >> 24)+1));
01847     }
01848     //
01849     // HLCK clock source is SYSCLK_CLKSEL0_HCLK10K
01850     //
01851     else if(((ulConfig & 0xF0) >> 4) == SYSCLK_CLKSEL0_HCLK10K)
01852     {
01853         xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_OSC10K_EN;
01854         SysCtlHClockSourceSet(SYSCTL_HLCK_S_INT10K);
01855         //
01856         // Wait for Internal 10 kHz Low Speed Oscillator Clock Source is stable
01857         //
01858         while(!(xHWREG(SYSCLK_CLKSTATUS) & SYSCLK_CLKSTATUS_OSC10K_STB));
01859         SysCtlIPClockDividerSet(SYSCTL_PERIPH_HCLK_D |                        \
01860                                (((ulConfig & 0x0F000000) >> 24)+1));
01861         if((ulConfig & SYSCLK_PWRCON_OSC22M_EN)!=0)
01862         {
01863             xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_OSC22M_EN;
01864         }
01865         if((ulConfig & SYSCLK_PWRCON_XTL12M_EN)!=0)
01866         {
01867             xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_XTL12M_EN;
01868         }
01869         if((ulConfig & SYSCLK_PLLCON_PD)!=0)
01870         {
01871             xHWREG(SYSCLK_PLLCON) |= SYSCLK_PLLCON_PD;
01872         }
01873     }
01874     //
01875     // HLCK clock source is SYSCLK_PWRCON_OSC22M_EN
01876     //
01877     else 
01878     {
01879         //
01880         // Check the arguments .
01881         //
01882         xASSERT((ulConfig & SYSCLK_PWRCON_OSC22M_EN)==0);
01883         
01884         xHWREG(SYSCLK_PWRCON) |= SYSCLK_PWRCON_OSC22M_EN;
01885         SysCtlHClockSourceSet(SYSCTL_HLCK_S_INT22M);
01886         //
01887         // Wait for Internal 22.1184 MHz High Speed Oscillator Clock Source is stable
01888         //
01889         while(!(xHWREG(SYSCLK_CLKSTATUS) & SYSCLK_CLKSTATUS_OSC22M_STB));
01890         SysCtlIPClockDividerSet(SYSCTL_PERIPH_HCLK_D |                        \
01891                                (((ulConfig & 0x0F000000) >> 24)+1));
01892         if((ulConfig & SYSCLK_PWRCON_XTL12M_EN)!=0)
01893         {
01894             xHWREG(SYSCLK_PWRCON) &= ~SYSCLK_PWRCON_XTL12M_EN;
01895         }
01896         if((ulConfig & SYSCLK_PLLCON_PD)!=0)
01897         {
01898             xHWREG(SYSCLK_PLLCON) |= SYSCLK_PLLCON_PD;
01899         }
01900     }
01901     SysCtlKeyAddrLock();
01902 }