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
00055
00056
00057 #define SYSCTL_PERIPH_INDEX_CLK(a) \
00058 (((a) >> 28) & 0xf)
00059
00060
00061
00062
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
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
00083
00084
00085 #define SYSCTL_PERIPH_ENUM_CLK(a) \
00086 (((a) & 0xff) << (((a) & 0x1f0000) >> 16))
00087
00088
00089
00090
00091
00092
00093 #define SYSCTL_PERIPH_INDEX_R(a)(((a) >> 30) & 0x3)
00094
00095
00096
00097
00098
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
00108
00109
00110 #define SYSCTL_PERIPH_INDEX_E(a)(((a) >> 14) & 0x3)
00111
00112
00113
00114
00115
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
00125
00126
00127
00128
00129 static const unsigned long g_pulIPRSTRegs[] =
00130 {
00131 GCR_IPRSTC1,
00132 GCR_IPRSTC2
00133 };
00134
00135
00136
00137
00138
00139
00140
00141
00142 static const unsigned long g_pulAXBCLKRegs[] =
00143 {
00144 SYSCLK_AHBCLK,
00145 SYSCLK_APBCLK
00146 };
00147
00148
00149
00150
00151
00152
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
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
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
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
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
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
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
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
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
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
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
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
00752
00753 xASSERT(SysCtlPeripheralValid(ulPeripheral));
00754
00755
00756
00757
00758 xHWREG(g_pulIPRSTRegs[SYSCTL_PERIPH_INDEX_R(ulPeripheral)]) |=
00759 SYSCTL_PERIPH_MASK_R(ulPeripheral);
00760
00761
00762
00763
00764 for(ulDelay = 0; ulDelay < 16; ulDelay++)
00765 {
00766 }
00767
00768
00769
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
00801
00802 xASSERT(SysCtlPeripheralValid(ulPeripheral));
00803
00804
00805
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
00838
00839 xASSERT(SysCtlPeripheralValid(ulPeripheral));
00840
00841
00842
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
00867
00868
00869 xHWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ;
00870
00871
00872
00873
00874
00875 while(1)
00876 {
00877 }
00878 }
00879
00880
00881
00888
00889
00890 void
00891 SysCtlSleep(void)
00892 {
00893
00894
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
00919
00920 xHWREG(NVIC_SYS_CTRL) |= NVIC_SYS_CTRL_SLEEPDEEP;
00921 SysCtlPowerDownEnable(1);
00922 SysCtlPowerDownWaitCPUSet(1);
00923
00924
00925
00926
00927 xCPUwfi();
00928
00929
00930
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
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
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
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
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
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
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
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
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
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
01243
01244
01245 return xHWREG(GCR_RSTSRC);
01246 }
01247
01248
01249
01262
01263
01264 void
01265 SysCtlResetSrcClear(unsigned long ulSrc)
01266 {
01267
01268
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
01279
01280
01281 xHWREG(GCR_RSTSRC) |= ulSrc;
01282 }
01283
01284
01285
01294
01295
01296 void
01297 SysCtlBODEnable(xtBoolean bEnable)
01298 {
01299
01300
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
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
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
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
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
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
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
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
01509
01510 xASSERT((ulConfig & 0xFF)<=256);
01511
01512
01513
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
01540
01541 xASSERT(u8Divider<=15);
01542
01543
01544
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
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
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
01651
01652 if ((xHWREG(SYSCLK_CLKSEL0) & SYSCLK_CLKSEL0_HCLK_M) == \
01653 SYSCLK_CLKSEL0_HCLK12M)
01654 {
01655 ulFreqout = s_ulExtClockMHz*1000000;
01656 }
01657
01658
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
01687
01688 else if((xHWREG(SYSCLK_CLKSEL0) & SYSCLK_CLKSEL0_HCLK_M) == \
01689 SYSCLK_CLKSEL0_HCLK10K)
01690 {
01691 ulFreqout = 10000;
01692 }
01693
01694
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
01750
01751 if(((ulConfig & 0xF0) >> 4) == SYSCLK_CLKSEL0_HCLK12M)
01752 {
01753
01754
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
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
01779
01780 else if(((ulConfig & 0xF0) >> 4) == SYSCLK_CLKSEL0_HCLKPLL)
01781 {
01782
01783
01784
01785 xASSERT((ulConfig & SYSCLK_PLLCON_PD)==0);
01786
01787 if((ulConfig & SYSCLK_PLLCON_PLL_SRC)==0)
01788 {
01789
01790
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
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
01843
01844 while(!(xHWREG(SYSCLK_CLKSTATUS) & SYSCLK_CLKSTATUS_PLL_STB));
01845 SysCtlIPClockDividerSet(SYSCTL_PERIPH_HCLK_D | \
01846 (((ulConfig & 0x0F000000) >> 24)+1));
01847 }
01848
01849
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
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
01876
01877 else
01878 {
01879
01880
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
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 }