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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:   Example_281xAdc.c
  4. //
  5. // TITLE:  DSP281x ADC Example Program.
  6. //
  7. // ASSUMPTIONS:
  8. //
  9. //   This program requires the DSP281x V1.00 header files.  
  10. //   As supplied, this project is configured for "boot to H0" operation.
  11. //
  12. //   Make sure the CPU clock speed is properly defined in 
  13. //   DSP281x_Examples.h before compiling this example.
  14. //
  15. //   Connect signals to be converted to A2 and A3.
  16. //  
  17. //
  18. // DESCRIPTION:
  19. //
  20. //   This example sets up the PLL in x10/2 mode, divides SYSCLKOUT    
  21. //   by six to reach a 25Mhz HSPCLK (assuming a 30Mhz XCLKIN). The    
  22. //   clock divider in the ADC is not used so that the ADC will see    
  23. //   the 25Mhz on the HSPCLK. Interrupts are enabled and the EVA      
  24. //   is setup to generate a periodic ADC SOC on SEQ1. Two channels    
  25. //   are converted, ADCINA3 and ADCINA2.
  26. //
  27. //   Watch Variables:
  28. // 
  29. //         Voltage1[10]     Last 10 ADCRESULT0 values
  30. //         Voltage2[10]     Last 10 ADCRESULT1 values
  31. //         ConversionCount  Current result number 0-9
  32. //         LoopCount        Idle loop counter  
  33. //         
  34. //
  35. //###########################################################################
  36. //
  37. // Original Author: D.F.
  38. // 
  39. //  Ver | dd mmm yyyy | Who  | Description of changes
  40. // =====|=============|======|===============================================
  41. //  1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha)
  42. //      |             |      | Cleanup only.  Results are shifted >> 4
  43. //###########################################################################
  44. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  45. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  46. // Prototype statements for functions found within this file.
  47. interrupt void adc_isr(void);
  48. // Global variables used in this example:
  49. Uint16 LoopCount;
  50. Uint16 ConversionCount;
  51. Uint16 Voltage1[10];
  52. Uint16 Voltage2[10];
  53. main() 
  54. {
  55. // Step 1. Initialize System Control:
  56. // PLL, WatchDog, enable Peripheral Clocks
  57. // This example function is found in the DSP281x_SysCtrl.c file.
  58.    InitSysCtrl();
  59. // For this example, set HSPCLK to SYSCLKOUT / 6 (25Mhz assuming 150Mhz SYSCLKOUT)
  60.    EALLOW;
  61.    SysCtrlRegs.HISPCP.all = 0x3;  // HSPCLK = SYSCLKOUT/6
  62.    EDIS;
  63.    
  64. // Step 2. Initialize GPIO: 
  65. // This example function is found in the DSP281x_Gpio.c file and
  66. // illustrates how to set the GPIO to it's default state.
  67. // InitGpio();  // Skipped for this example  
  68. // Step 3. Clear all interrupts and initialize PIE vector table:
  69. // Disable CPU interrupts 
  70.    DINT;
  71. // Initialize the PIE control registers to their default state.
  72. // The default state is all PIE interrupts disabled and flags
  73. // are cleared.  
  74. // This function is found in the DSP281x_PieCtrl.c file.
  75.    InitPieCtrl();
  76. // Disable CPU interrupts and clear all CPU interrupt flags:
  77.    IER = 0x0000;
  78.    IFR = 0x0000;
  79. // Initialize the PIE vector table with pointers to the shell Interrupt 
  80. // Service Routines (ISR).  
  81. // This will populate the entire table, even if the interrupt
  82. // is not used in this example.  This is useful for debug purposes.
  83. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  84. // This function is found in DSP281x_PieVect.c.
  85.    InitPieVectTable();
  86.      
  87. // Interrupts that are used in this example are re-mapped to
  88. // ISR functions found within this file.       
  89.    EALLOW;  // This is needed to write to EALLOW protected register
  90.    PieVectTable.ADCINT = &adc_isr;
  91.    EDIS;    // This is needed to disable write to EALLOW protected registers
  92. // Step 4. Initialize all the Device Peripherals:
  93. // This function is found in DSP281x_InitPeripherals.c
  94. // InitPeripherals(); // Not required for this example
  95.    InitAdc();  // For this example, init the ADC
  96. // Step 5. User specific code, enable interrupts:
  97. // Enable ADCINT in PIE
  98.    PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
  99.    IER |= M_INT1; // Enable CPU Interrupt 1
  100.    EINT;          // Enable Global interrupt INTM
  101.    ERTM;          // Enable Global realtime interrupt DBGM
  102.    LoopCount = 0;
  103.    ConversionCount = 0;
  104.     
  105. // Configure ADC
  106.    AdcRegs.ADCMAXCONV.all = 0x0001;       // Setup 2 conv's on SEQ1
  107.    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // Setup ADCINA3 as 1st SEQ1 conv.
  108.    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv.
  109.    AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;  // Enable EVASOC to start SEQ1
  110.    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)
  111. // Configure EVA
  112. // Assumes EVA Clock is already enabled in InitSysCtrl();
  113.    EvaRegs.T1CMPR = 0x0080;               // Setup T1 compare value
  114.    EvaRegs.T1PR = 0xFFFF;                 // Setup period register
  115.    EvaRegs.GPTCONA.bit.T1TOADC = 1;       // Enable EVASOC in EVA
  116.    EvaRegs.T1CON.all = 0x1042;            // Enable timer 1 compare (upcount mode)
  117. // Wait for ADC interrupt
  118.    while(1)
  119.    {
  120.       LoopCount++;
  121.    }
  122. }
  123. interrupt void  adc_isr(void)
  124. {
  125.   Voltage1[ConversionCount] = AdcRegs.ADCRESULT0 >>4;
  126.   Voltage2[ConversionCount] = AdcRegs.ADCRESULT1 >>4;
  127.   // If 40 conversions have been logged, start over
  128.   if(ConversionCount == 9) 
  129.   {
  130.      ConversionCount = 0;
  131.   }
  132.   else ConversionCount++;
  133.   // Reinitialize for next ADC sequence
  134.   AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
  135.   AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
  136.   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
  137.   
  138.   return;
  139. }