DSP281x_SysCtrl.c
上传用户:qingfan3
上传日期:2014-10-27
资源大小:31439k
文件大小:8k
源码类别:

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:   DSP281x_SysCtrl.c
  4. //
  5. // TITLE:  DSP281x Device System Control Initialization & Support Functions.
  6. //
  7. // DESCRIPTION:
  8. //
  9. //         Example initialization of system resources.
  10. //
  11. //###########################################################################
  12. //
  13. //  Ver | dd mmm yyyy | Who  | Description of changes
  14. // =====|=============|======|===============================================
  15. //  1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha)
  16. //      |             |      | Additional comments added to explain the PLL
  17. //      |             |      |    initialization.
  18. //      |             |      | Changed the PLL initialization to take into
  19. //      |             |      |    account bit definitions for the PLLCR register
  20. //      |             |      | Removed DFT initialization - no longer needed 
  21. //      |             |      |    as of Rev C F2810/12 silicon
  22. //      |             |      | Split some operations into their own function
  23. //      |             |      |    for better modularity
  24. //      |             |      | Added pipeline flush after the Flash Init
  25. //###########################################################################
  26. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  27. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  28. // Functions that will be run from RAM need to be assigned to 
  29. // a different section.  This section will then be mapped to a load and 
  30. // run address using the linker cmd file.
  31. #pragma CODE_SECTION(InitFlash, "ramfuncs");
  32. //---------------------------------------------------------------------------
  33. // InitSysCtrl: 
  34. //---------------------------------------------------------------------------
  35. // This function initializes the System Control registers to a known state.
  36. // - Disables the watchdog
  37. // - Set the PLLCR for proper SYSCLKOUT frequency 
  38. // - Set the pre-scaler for the high and low frequency peripheral clocks
  39. // - Enable the clocks to the peripherals
  40. void InitSysCtrl(void)
  41. {
  42. // On F2812/F2810 TMX samples prior to rev C this initialization was 
  43. // required.  For Rev C and after this is no longer required
  44. /*
  45.    EALLOW;
  46.    DevEmuRegs.M0RAMDFT = 0x0300;
  47.    DevEmuRegs.M1RAMDFT = 0x0300;
  48.    DevEmuRegs.L0RAMDFT = 0x0300;
  49.    DevEmuRegs.L1RAMDFT = 0x0300;
  50.    DevEmuRegs.H0RAMDFT = 0x0300;
  51.    EDIS;
  52. */   
  53.    // Disable the watchdog        
  54.    DisableDog();
  55.    
  56.    // Initialize the PLLCR to 0xA
  57.    InitPll(0xA);
  58.    // Initialize the peripheral clocks
  59.    InitPeripheralClocks();
  60. }
  61. //---------------------------------------------------------------------------
  62. // Example: InitFlash: 
  63. //---------------------------------------------------------------------------
  64. // This function initializes the Flash Control registers
  65. //                   CAUTION 
  66. // This function MUST be executed out of RAM. Executing it
  67. // out of OTP/Flash will yield unpredictable results
  68. void InitFlash(void)
  69. {
  70.    EALLOW;
  71.    //Enable Flash Pipeline mode to improve performance
  72.    //of code executed from Flash.
  73.    FlashRegs.FOPT.bit.ENPIPE = 1;
  74.    
  75.    //                CAUTION
  76.    //Minimum waitstates required for the flash operating
  77.    //at a given CPU rate must be characterized by TI. 
  78.    //Refer to the datasheet for the latest information.  
  79.    //Set the Random Waitstate for the Flash
  80.    FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;
  81.    
  82.    //Set the Paged Waitstate for the Flash
  83.    FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;
  84.    
  85.    //                CAUTION
  86.    //Minimum cycles required to move between power states
  87.    //at a given CPU rate must be characterized by TI. 
  88.    //Refer to the datasheet for the latest information.
  89.      
  90.    //For now use the default count
  91.    //Set number of cycles to transition from sleep to standby
  92.    FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;       
  93.    
  94.    //Set number of cycles to transition from standby to active
  95.    FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;   
  96.    EDIS;
  97.    //Force a pipeline flush to ensure that the write to 
  98.    //the last register configured occurs before returning.  
  99.    asm(" RPT #7 || NOP");
  100. }
  101. //---------------------------------------------------------------------------
  102. // Example: KickDog: 
  103. //---------------------------------------------------------------------------
  104. // This function resets the watchdog timer.
  105. // Enable this function for using KickDog in the application 
  106. void KickDog(void)
  107. {
  108.     EALLOW;
  109.     SysCtrlRegs.WDKEY = 0x0055;
  110.     SysCtrlRegs.WDKEY = 0x00AA;
  111.     EDIS;
  112. }
  113. //---------------------------------------------------------------------------
  114. // Example: DisableDog: 
  115. //---------------------------------------------------------------------------
  116. // This function disables the watchdog timer.
  117. void DisableDog(void)
  118. {
  119.     EALLOW;
  120.     SysCtrlRegs.WDCR= 0x0068;
  121.     EDIS;
  122. }
  123. //---------------------------------------------------------------------------
  124. // Example: InitPll: 
  125. //---------------------------------------------------------------------------
  126. // This function initializes the PLLCR register.
  127. void InitPll(Uint16 val)
  128. {
  129.    volatile Uint16 iVol;   
  130.    
  131.    if (SysCtrlRegs.PLLCR.bit.DIV != val)
  132.    {
  133.    
  134.       EALLOW;
  135.       SysCtrlRegs.PLLCR.bit.DIV = val;
  136.       EDIS;
  137.    
  138.    // Optional: Wait for PLL to lock.
  139.    // During this time the CPU will switch to OSCCLK/2 until the PLL is 
  140.    // stable.  Once the PLL is stable the CPU will switch to the new PLL value. 
  141.    //
  142.    // This switch time is 131072 CLKIN cycles as of Rev C silicon.  
  143.    //   
  144.    // Code is not required to sit and wait for the PLL to lock.   
  145.    // However, if the code does anything that is timing critical, 
  146.    // and requires the correct clock be locked, then it is best to 
  147.    // wait until this switching has completed.  
  148.    
  149.    // If this function is run from waitstated memory, then the loop count can
  150.    // be reduced as long as the minimum switch time is still met. 
  151.    // iVol is volatile so the compiler will not optimize this loop out
  152.    //
  153.    // The watchdog should be disabled before this loop, or fed within 
  154.    // the loop.   
  155.    
  156.       DisableDog();
  157.    
  158.    // Wait lock cycles.  
  159.    // Note,  This loop is tuned to 0-waitstate RAM memory.  If this
  160.    // function is run from wait-stated memory such as Flash or XINTF,
  161.    // then the number of times through the loop can be reduced 
  162.    // accordingly. 
  163.       for(iVol= 0; iVol< ( (131072/2)/12 ); iVol++)
  164.       {
  165.    
  166.       }
  167.    }
  168. }
  169. //--------------------------------------------------------------------------
  170. // Example: InitPeripheralClocks: 
  171. //---------------------------------------------------------------------------
  172. // This function initializes the clocks to the peripheral modules.
  173. // First the high and low clock prescalers are set
  174. // Second the clocks are enabled to each peripheral.
  175. // To reduce power, leave clocks to unused peripherals disabled
  176. // Note: If a peripherals clock is not enabled then you cannot 
  177. // read or write to the registers for that peripheral 
  178. void InitPeripheralClocks(void)
  179. {
  180.    EALLOW;
  181. // HISPCP/LOSPCP prescale register settings, normally it will be set to default values
  182.    SysCtrlRegs.HISPCP.all = 0x0001;
  183.    SysCtrlRegs.LOSPCP.all = 0x0002;
  184.    
  185. // Peripheral clock enables set for the selected peripherals.   
  186.    SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
  187.    SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
  188.    SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
  189.    SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;
  190.    SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1;
  191.    SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;
  192.    SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;
  193.    SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
  194.    EDIS;
  195. }
  196. //===========================================================================
  197. // No more.
  198. //===========================================================================