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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:    Example_281xCodeRunFromXintf.c
  4. //
  5. // TITLE:   Example Program That Executes From XINTF (assumes MPNMC = 1)
  6. //
  7. // ASSUMPTIONS:
  8. //
  9. //          This program requires the DSP281x V1.00 header files.  
  10. //          As supplied, this project is configured for "boot from XINTF Zone 7" 
  11. //          operation. 
  12. //
  13. //          XMP/MCn pin = 1
  14. //
  15. //          Map the region for XINTF Zone 7 as RAM in Code Composer
  16. //          (Refer to the F2812.gel file supplied with CCS Studio)  
  17. //
  18. // DESCRIPTION:
  19. //
  20. //          This example configures CPU Timer0 and increments
  21. //          a counter each time the timer asserts an interrupt.
  22. //
  23. //          Watch Variables:
  24. //                 CpuTimer0.InterruptCount
  25. //                 BackGroundCounter
  26. //###########################################################################
  27. //
  28. // Original Author: A.T.
  29. //
  30. //  Ver | dd mmm yyyy | Who  | Description of changes
  31. // =====|=============|======|===============================================
  32. //  1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha)
  33. //      |             |      | Changed the method for copying code from
  34. //      |             |      |    XINTF to internal RAM via the MemCopy
  35. //      |             |      |    function and symbols created by the 
  36. //      |             |      |    linker.
  37. //      |             |      | Added pipeline flush after the XINTF Init
  38. //###########################################################################
  39. // Step 0: Include required header files:
  40. //         DSP281x_Device.h: device specific definitions #include statements for
  41. //         all of the peripheral .h definition files.
  42. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  43. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  44. // Prototype statements for functions found within this file:
  45. // Assign this function to a section to be linked to internal RAM
  46. #pragma CODE_SECTION(xintf_zone6and7_timing,"ramfuncs");
  47. void xintf_zone6and7_timing(void);
  48. interrupt void ISR_CPUTimer0(void);
  49. void error(void);
  50. // Global variables found within this file:
  51. Uint32 BackgroundCount = 0;
  52. // RAM Count - This counter will be stored in RAM,  to compare with that stored
  53. // in XINTF.
  54. #pragma DATA_SECTION(RamInterruptCount,"ramdata");
  55. Uint32 RamInterruptCount = 0;
  56. void main(void)
  57. {
  58.     //-----------------------------------------------------------------------
  59.     // Step 1 to Step 5 should be followed in all designs:
  60.     //
  61.     // Step 1: Disable and clear all CPU interrupts:
  62.        DINT;
  63.        IER = 0x0000;
  64.        IFR = 0x0000;
  65.     // Step 2. Initialize System Control registers, PLL, WatchDog, Clocks to default state:
  66.     //         This function is found in the DSP281x_SysCtrl.c file.
  67.     InitSysCtrl();
  68.     // Step 3. Select GPIO for the device or for the specific application:
  69.     //         This function is found in the DSP281x_Gpio.c file.
  70.     // InitGpio();  // Not required for this example
  71.     // Step 4. Initialize PIE to known state (control registers and vector table):
  72.     //         The PIE vector table is initialized with pointers to shell Interrupt 
  73.     //         Service Routines (ISR). The shell routines are found in DSP281x_DefaultIsr.c.
  74.     //         Insert user specific ISR code in the appropriate shell ISR routine in 
  75.     //         the DSP281x_DefaultIsr.c file.
  76.     //
  77.     //         Initialize Pie Control Registers To Default State:
  78.     //         This function is found in the DSP281x_PieCtrl.c file.
  79.     InitPieCtrl();
  80.     //         Initialize the PIE Vector Table To a Known State:
  81.     //         This function is found in DSP281x_PieVect.c.
  82.     //         This function populates the PIE vector table with pointers
  83.     //         to the shell ISR functions found in DSP281x_DefaultIsr.c.
  84.     InitPieVectTable();
  85.     // Enable CPU and PIE interrupts
  86.     // This example function is found in the DSP281x_PieCtrl.c file.   
  87.     EnableInterrupts();
  88.     // Step 5. Initialize all the Device Peripherals to a known state:
  89.     //         This function is found in DSP281x_InitPeripherals.c
  90.     // InitPeripherals();  // For this example just init the CPU Timers
  91.     InitCpuTimers();
  92.     
  93.     //-----------------------------------------------------------------------
  94.     // User specific code:
  95.     // 
  96.     // Initalize XINTF Zone 6 and Zone 7 timing
  97.     // First copy the function to RAM, then call the function to
  98.     // change the zone timing
  99.     
  100.     // The  RamfuncsLoadStart, RamfuncsLoadEnd, and RamfuncsRunStart
  101.     // symbols are created by the linker.
  102.     // Refer to the CodeRunFromXintfonF2812EzDSP.cmd file. 
  103.     MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
  104. xintf_zone6and7_timing();
  105. EALLOW;     // This is needed to write to EALLOW protected registers
  106. PieVectTable.TINT0 = &ISR_CPUTimer0;
  107. EDIS;       // This is needed to disable write to EALLOW protected registers
  108.     
  109.     PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // Enable INT1.7 which is connected to CPU-Timer 0:
  110.     IER |= M_INT1;
  111.     
  112.     SetDBGIER(M_INT1);  // Enable INT1 for Real-Time mode
  113. EINT;    // Enable Global interrupt INTM
  114. ERTM; // Enable Global realtime debug DBGM
  115. // Configure and Initialize CPU Timer 0 for:
  116. //     > CPU Timer 0 Connect To INT1.7
  117. //    > Set Up For 1 Second Interrupt Period
  118. //    > Point To "ISR_CPUTimer0" function
  119. ConfigCpuTimer(&CpuTimer0, 150, 1000000); // 150MHz CPU Freq, 1 second Period (in uSeconds)
  120.   StartCpuTimer0();
  121. for(;;)
  122. BackgroundCount++;                      // IDLE loop. Just sit and loop forever....
  123. exit(0); // should never get here.
  124. interrupt void ISR_CPUTimer0(void)
  125. {
  126. PieCtrlRegs.PIEACK.all = 0xFFFF;
  127. ERTM;              // Enable Global realtime debug DBGM
  128. CpuTimer0.InterruptCount++; // Should increment every second.
  129.     RamInterruptCount++;
  130.     if(RamInterruptCount != CpuTimer0.InterruptCount) error();
  131. }
  132. // Configure the timing paramaters for Zone 6 and Zone 7.
  133. // Note: this function should not be executed from the same
  134. // zones as those being configured. 
  135. void xintf_zone6and7_timing()
  136. {
  137.     // All Zones---------------------------------
  138.     // Timing for all zones based on XTIMCLK = SYSCLKOUT 
  139.     XintfRegs.XINTCNF2.bit.XTIMCLK = 0;
  140.     // Buffer up to 3 writes
  141.     XintfRegs.XINTCNF2.bit.WRBUFF = 3;
  142.     // XCLKOUT is enabled
  143.     XintfRegs.XINTCNF2.bit.CLKOFF = 0;
  144.     // XCLKOUT = XTIMCLK 
  145.     XintfRegs.XINTCNF2.bit.CLKMODE = 0;
  146.     
  147.     
  148.     // Zone 6------------------------------------
  149.     // When using ready, ACTIVE must be 1 or greater
  150.     // Lead must always be 1 or greater
  151.     // Zone write timing
  152.     XintfRegs.XTIMING6.bit.XWRLEAD = 1;
  153.     XintfRegs.XTIMING6.bit.XWRACTIVE = 1;
  154.     XintfRegs.XTIMING6.bit.XWRTRAIL = 1;
  155.     // Zone read timing
  156.     XintfRegs.XTIMING6.bit.XRDLEAD = 1;
  157.     XintfRegs.XTIMING6.bit.XRDACTIVE = 2;
  158.     XintfRegs.XTIMING6.bit.XRDTRAIL = 0;
  159.     
  160.     // do not double all Zone read/write lead/active/trail timing 
  161.     XintfRegs.XTIMING6.bit.X2TIMING = 0;
  162.  
  163.     // Zone will not sample READY 
  164.     XintfRegs.XTIMING6.bit.USEREADY = 0;
  165.     XintfRegs.XTIMING6.bit.READYMODE = 0;  
  166.  
  167.     // Size must be 1,1 - other values are reserved
  168.     XintfRegs.XTIMING6.bit.XSIZE = 3;
  169.  
  170.     // Zone 7------------------------------------
  171.     // When using ready, ACTIVE must be 1 or greater
  172.     // Lead must always be 1 or greater
  173.     // Zone write timing
  174.     XintfRegs.XTIMING7.bit.XWRLEAD = 1;
  175.     XintfRegs.XTIMING7.bit.XWRACTIVE = 1;
  176.     XintfRegs.XTIMING7.bit.XWRTRAIL = 1;
  177.     // Zone read timing
  178.     XintfRegs.XTIMING7.bit.XRDLEAD = 1;
  179.     XintfRegs.XTIMING7.bit.XRDACTIVE = 2;
  180.     XintfRegs.XTIMING7.bit.XRDTRAIL = 0;
  181.     
  182.     // don't double all Zone read/write lead/active/trail timing 
  183.     XintfRegs.XTIMING7.bit.X2TIMING = 0;
  184.  
  185.     // Zone will not sample XREADY signal  
  186.     XintfRegs.XTIMING7.bit.USEREADY = 0;
  187.     XintfRegs.XTIMING7.bit.READYMODE = 0;
  188.  
  189.     // Size must be 1,1 - other values are reserved
  190.     XintfRegs.XTIMING7.bit.XSIZE = 3;
  191.     
  192.    //Force a pipeline flush to ensure that the write to 
  193.    //the last register configured occurs before returning.  
  194.    asm(" RPT #7 || NOP"); 
  195. }
  196. void error(void)
  197. {
  198.     asm("      ESTOP0");   // software breakpoint
  199. }
  200. //===========================================================================
  201. // No more.
  202. //===========================================================================