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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:  experiment_m_6.c
  4. //
  5. // TITLE: DSP28 ADC - measure two input voltages,
  6. //      triggered by GP Timer 1 Period every 0.1 sec
  7. //      Watchdog active , served in main-loop & ADC-ISR
  8. //
  9. //###########################################################################
  10. #include "DSP281x_Device.h"
  11. // Prototype statements for functions found within this file.
  12. void Gpio_select(void);
  13. //void SpeedUpRevA(void);
  14. void InitSystem(void);
  15. void show_ADC(int result);
  16. void CfgFlash(void);
  17. interrupt void adc_isr(void);     // Prototype for ADC result ISR
  18. // Global variables used in this example:
  19. int Voltage_A0;
  20. int Voltage_B0;
  21. // Global symbols defined in the linker command file
  22. extern Uint16 RamfuncsLoadStart;
  23. extern Uint16 RamfuncsLoadEnd;
  24. extern Uint16 RamfuncsRunStart;
  25. void main(void)
  26. {
  27.   unsigned long i;
  28.   InitSystem();                   // Initialize the DSP's core Registers
  29. //  SpeedUpRevA();                  // Speed_up the silicon A Revision.
  30.   Gpio_select();                  // Setup the GPIO Multiplex Registers
  31. // Copy all FLASH sections that need to run from RAM (use memcpy() from RTS library)
  32. // Section ramfuncs contains user defined code that runs from CSM secured RAM
  33.   memcpy( &RamfuncsRunStart,
  34.       &RamfuncsLoadStart,
  35.       &RamfuncsLoadEnd - &RamfuncsLoadStart);
  36. // Initialize the FLASH
  37.   CfgFlash();        // Initialize the FLASH
  38.   InitPieCtrl();                  // Function Call to init PIE-unit ( code : DSP281x_PieCtrl.c)
  39.   InitPieVectTable();             // Function call to init PIE vector table ( code : DSP281x_PieVect.c )
  40.   InitAdc();                      // Function call for basic ADC initialisation
  41. // re-map PIE - entry for GP Timer 1 Compare Interrupt
  42.   EALLOW;                         // This is needed to write to EALLOW protected registers
  43.   PieVectTable.ADCINT = &adc_isr;
  44.   EDIS;                           // This is needed to disable write to EALLOW protected registers
  45. // Enable ADC interrupt: PIE-Group1 , interrupt 6
  46.   PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
  47. // Enable CPU INT1 which is connected to ADC interrupt:
  48.   IER = 1;
  49. // Enable global Interrupts and higher priority real-time debug events:
  50.   EINT;                           // Enable Global interrupt INTM
  51.   ERTM;                           // Enable Global realtime interrupt DBGM
  52. // Configure ADC
  53.   AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;    // Dual Sequencer Mode
  54.   AdcRegs.ADCTRL1.bit.CONT_RUN = 0;    // No Continuous run
  55.   AdcRegs.ADCTRL1.bit.CPS = 0;         // prescaler = 1
  56.   AdcRegs.ADCMAXCONV.all = 0x0001;     // Setup 2 conv's on SEQ1
  57.   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;    // Setup ADCINA0 as 1st SEQ1 conv.// Assumes EVA Clock is already enabled in InitSysCtrl();
  58.   AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8;    // Setup ADCINB0 as 2nd SEQ1 conv.// Drive T1PWM / T2PWM by T1/T2 - logic
  59.   AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;// Enable EVASOC to start SEQ1// Polarity of GP Timer 1 Compare = Active low
  60.   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;// Enable SEQ1 interrupt (every EOEvaRegs.GPTCONA.bit.T1PIN = 1;
  61.   AdcRegs.ADCTRL3.bit.ADCCLKPS = 2;    // Divide HSPCLK by 4
  62. // Configure EVA
  63. // Assumes EVA Clock is already enabled in InitSysCtrl();
  64. // Disable T1PWM / T2PWM outputs
  65.   EvaRegs.GPTCONA.bit.TCMPOE = 0;
  66. // Polarity of GP Timer 1 Compare = forced low
  67.   EvaRegs.GPTCONA.bit.T1PIN = 0;
  68.   EvaRegs.GPTCONA.bit.T1TOADC = 2;// Enable EVASOC in EVA
  69.   EvaRegs.T1CON.bit.FREE = 0;     // Stop on emulation suspend
  70.   EvaRegs.T1CON.bit.SOFT = 0;     // Stop on emulation suspend
  71.   EvaRegs.T1CON.bit.TMODE = 2;    // Continuous up count mode
  72.   EvaRegs.T1CON.bit.TPS = 7;      // prescaler = 128
  73.   EvaRegs.T1CON.bit.TENABLE = 1;  // enable GP Timer 1
  74.   EvaRegs.T1CON.bit.TCLKS10 = 0;  // internal clock
  75.   EvaRegs.T1CON.bit.TCLD10 = 0;   // Compare Reload when zero
  76.   EvaRegs.T1CON.bit.TECMPR = 0;   // Disable Compare operation
  77.   EvaRegs.T1PR = 58594;
  78.   while(1)
  79.   {
  80.     for(i=0;i<1500000;i++)
  81.     {
  82.       EALLOW;
  83.       SysCtrlRegs.WDKEY = 0xAA;   // and serve watchdog #2
  84.       EDIS;
  85.       show_ADC(Voltage_A0>>8);    // displays the latest result on LED's
  86.     }
  87.     for(i=0;i<1500000;i++)
  88.     {
  89.       EALLOW;
  90.       SysCtrlRegs.WDKEY = 0xAA;   // and serve watchdog #2
  91.       EDIS;
  92.       show_ADC(Voltage_B0>>8);
  93.     }
  94.   }
  95. }
  96. void Gpio_select(void)
  97. {
  98.   EALLOW;
  99.   GpioMuxRegs.GPAMUX.all = 0x0;   // all GPIO port Pin's to I/O
  100.   GpioMuxRegs.GPBMUX.all = 0x0;
  101.   GpioMuxRegs.GPDMUX.all = 0x0;
  102.   GpioMuxRegs.GPFMUX.all = 0x0;
  103.   GpioMuxRegs.GPEMUX.all = 0x0;
  104.   GpioMuxRegs.GPGMUX.all = 0x0;
  105.   GpioMuxRegs.GPADIR.all = 0x0;   // GPIO PORT  as input
  106.   GpioMuxRegs.GPBDIR.all = 0x00FF;// GPIO Port B15-B8 input , B7-B0 output
  107.   GpioMuxRegs.GPDDIR.all = 0x0;   // GPIO PORT  as input
  108.   GpioMuxRegs.GPEDIR.all = 0x0;   // GPIO PORT  as input
  109.   GpioMuxRegs.GPFDIR.all = 0x0;   // GPIO PORT  as input
  110.   GpioMuxRegs.GPGDIR.all = 0x0;   // GPIO PORT  as input
  111.   GpioMuxRegs.GPAQUAL.all = 0x0;  // Set GPIO input qualifier values to zero
  112.   GpioMuxRegs.GPBQUAL.all = 0x0;
  113.   GpioMuxRegs.GPDQUAL.all = 0x0;
  114.   GpioMuxRegs.GPEQUAL.all = 0x0;
  115.   EDIS;
  116. }
  117. /*
  118. void SpeedUpRevA(void)
  119. {
  120. // On TMX samples, to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 internal
  121. // control registers bit have to be enabled. The bits are in Device emulation registers.
  122.   EALLOW;
  123.   DevEmuRegs.M0RAMDFT = 0x0300;
  124.   DevEmuRegs.M1RAMDFT = 0x0300;
  125.   DevEmuRegs.L0RAMDFT = 0x0300;
  126.   DevEmuRegs.L1RAMDFT = 0x0300;
  127.   DevEmuRegs.H0RAMDFT = 0x0300;
  128.   EDIS;
  129. }
  130. */
  131. void InitSystem(void)
  132. {
  133.   volatile int16 dummy;           // General purpose volatile int16
  134.   EALLOW;                         // Enable EALLOW protected register access
  135. // Memory Protection Configuration
  136.   DevEmuRegs.PROTSTART = 0x0100;  // Write default value to protection start register
  137.   DevEmuRegs.PROTRANGE = 0x00FF;  // Write default value to protection range register
  138. // Unlock the Code Security Module if CSM not in use
  139. /* Unlocking the CSM will allow code running from non-secure memory
  140.    to access code and data in secure memory.  One would only want to
  141.    unsecure the CSM if code security were not desired, and therefore
  142.    the CSM is not in use (otherwise, unlocking the CSM will compromise
  143.    the security of user code).  If the CSM is not in use, the best
  144.    thing to do is leave the password locations programmed to 0xFFFF,
  145.    which is the flash ERASED state.  When all passwords are 0xFFFF,
  146.    all that is required to unlock the CSM are dummy reads of the
  147.    PWL locations.
  148. */
  149.   dummy = CsmPwl.PSWD0;           // Dummy read of PWL locations
  150.   dummy = CsmPwl.PSWD1;           // Dummy read of PWL locations
  151.   dummy = CsmPwl.PSWD2;           // Dummy read of PWL locations
  152.   dummy = CsmPwl.PSWD3;           // Dummy read of PWL locations
  153.   dummy = CsmPwl.PSWD4;           // Dummy read of PWL locations
  154.   dummy = CsmPwl.PSWD5;           // Dummy read of PWL locations
  155.   dummy = CsmPwl.PSWD6;           // Dummy read of PWL locations
  156.   dummy = CsmPwl.PSWD7;           // Dummy read of PWL locations
  157.   asm(" RPT #6 || NOP");
  158.   
  159.   SysCtrlRegs.WDCR= 0x00AF;       // Setup the watchdog
  160.                                   // 0x00E8  to disable the Watchdog , Prescaler = 1
  161.                                   // 0x00AF  to NOT disable the Watchdog, Prescaler = 64
  162.   SysCtrlRegs.SCSR = 0;           // Watchdog generates a RESET
  163.   SysCtrlRegs.PLLCR.bit.DIV = 10; // Setup the Clock PLL to multiply by 5
  164.   SysCtrlRegs.HISPCP.all = 0x1;   // Setup Highspeed Clock Prescaler to divide by 2
  165.   SysCtrlRegs.LOSPCP.all = 0x2;   // Setup Lowspeed CLock Prescaler to divide by 4
  166. // Peripheral clock enables set for the selected peripherals.
  167.   SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
  168.   SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
  169.   SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;
  170.   SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
  171.   SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
  172.   SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
  173.   SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
  174.   SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
  175.   EDIS;
  176. }
  177. void show_ADC(int result)
  178. /* show the result of the AD-conversion on 8 LED's on GPIO B0-B7  */
  179. /* the result will be show as light-beam              */
  180. {
  181.   switch(result) 
  182.   {
  183.     case 0 : GpioDataRegs.GPBDAT.all=0xFFFF;break;
  184.     case 1 : GpioDataRegs.GPBDAT.all=0xFFFE;break;
  185.   }
  186.   result>>=1;
  187.   switch(result) 
  188.   {
  189.     case 1 : GpioDataRegs.GPBDAT.all=0xFFFC;break;
  190.     case 2 : GpioDataRegs.GPBDAT.all=0xFFF8;break;
  191.     case 3 : GpioDataRegs.GPBDAT.all=0xFFF0;break;
  192.     case 4 : GpioDataRegs.GPBDAT.all=0xFFE0;break;
  193.     case 5 : GpioDataRegs.GPBDAT.all=0xFFC0;break;
  194.     case 6 : GpioDataRegs.GPBDAT.all=0xFF80;break;
  195.     case 7 : GpioDataRegs.GPBDAT.all=0xFF00;break;
  196.   }
  197. }
  198. /**********************************************************************
  199. * Function: CfgFlash()
  200. * Description: Initializes the F281x flash timing registers.
  201. * Notes:
  202. *  1) This function MUST be executed out of RAM.  Executing it out of
  203. *     OTP/FLASH will produce unpredictable results.
  204. *  2) The flash registers are code security module protected.  Therefore,
  205. *     you must either run this function from L0/L1 RAM, or you must
  206. *     first unlock the CSM.  Note that unlocking the CSM as part of
  207. *     the program flow can compromise the code security.
  208. *  3) The latest datasheet for the particular device of interest should
  209. *     be consulted to confirm the flash timing specifications.
  210. **********************************************************************/
  211. #pragma CODE_SECTION(CfgFlash, "ramfuncs")
  212. void CfgFlash(void)
  213. {
  214.   asm(" EALLOW");                      // Enable EALLOW protected register access
  215.   FlashRegs.FPWR.bit.PWR = 3;          // Pump and bank set to active mode
  216.   FlashRegs.FSTATUS.bit.V3STAT = 1;    // Clear the 3VSTAT bit
  217.   FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;   // Sleep to standby transition cycles
  218.   FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; // Standby to active transition cycles
  219.   FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;// Random access waitstates
  220.   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;// Paged access waitstates
  221.   FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;  // OTP waitstates
  222.   FlashRegs.FOPT.bit.ENPIPE = 1;       // Enable the flash pipeline
  223.   asm(" EDIS");                        // Disable EALLOW protected register access
  224. // Force a complete pipeline flush to ensure that the write to the last register
  225. // configured occurs before returning.  Safest thing is to wait 8 full cycles.
  226.   asm(" RPT #6 || NOP");
  227. }  //end of CfgFlash()
  228. interrupt void adc_isr(void)
  229. {
  230. // Serve the watchdog every Timer 0 interrupt
  231.   EALLOW;
  232.   SysCtrlRegs.WDKEY = 0x55;       // Serve watchdog #1
  233.   EDIS;
  234.   Voltage_A0 = AdcRegs.ADCRESULT0>>4;
  235.   Voltage_B0 = AdcRegs.ADCRESULT1>>4;
  236. // Reinitialize for next ADC sequence
  237.   AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;    // Reset SEQ1
  238.   AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;  // Clear INT SEQ1 bit
  239.   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
  240. }
  241. //===========================================================================
  242. // End
  243. //===========================================================================