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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:  experiment_m_5A.c
  4. //
  5. // TITLE: DSP28 T1PWM - output to generate a sine wave ,
  6. //        GP Timer 1 Compare Interrupt every 20 mS
  7. //        Watchdog active , served in ISR and main-loop
  8. //
  9. //###########################################################################
  10. #include "DSP281x_Device.h"
  11. #include "IQmathLib.h"
  12. #pragma DATA_SECTION(sine_table,"IQmathTables");
  13. _iq30 sine_table[512];
  14. // Prototype statements for functions found within this file.
  15. void Gpio_select(void);
  16. //void SpeedUpRevA(void);
  17. void InitSystem(void);
  18. void CfgFlash(void);
  19. interrupt void T1_Compare_isr(void);   // Prototype for GP Timer1 Compare ISR
  20. // Global symbols defined in the linker command file
  21. extern Uint16 RamfuncsLoadStart;
  22. extern Uint16 RamfuncsLoadEnd;
  23. extern Uint16 RamfuncsRunStart;
  24. void main(void)
  25. {
  26.   InitSystem();                   // Initialize the DSP's core Registers
  27. //SpeedUpRevA();                  // Speed_up the silicon A Revision.
  28.   Gpio_select();                  // Setup the GPIO Multiplex Registers
  29. // Copy all FLASH sections that need to run from RAM (use memcpy() from RTS library)
  30. // Section ramfuncs contains user defined code that runs from CSM secured RAM
  31.   memcpy( &RamfuncsRunStart,
  32.       &RamfuncsLoadStart,
  33.       &RamfuncsLoadEnd - &RamfuncsLoadStart);
  34. // Initialize the FLASH
  35.   CfgFlash();        // Initialize the FLASH
  36.   InitPieCtrl();                  // Function Call to init PIE-unit ( code : DSP281x_PieCtrl.c)
  37.   InitPieVectTable();             // Function call to init PIE vector table ( code : DSP281x_PieVect.c )
  38. // re-map PIE - entry for GP Timer 1 Compare Interrupt
  39.   EALLOW;                         // This is needed to write to EALLOW protected registers
  40.   PieVectTable.T1CINT = &T1_Compare_isr;
  41.   EDIS;                           // This is needed to disable write to EALLOW protected registers
  42. // Enable T1 Compare interrupt: PIE-Group2 , interrupt 5
  43.   PieCtrlRegs.PIEIER2.bit.INTx5=1;
  44. // Enable CPU INT2 which is connected to GP -Timer1 Compare:
  45.   IER = 2;
  46. // Enable global Interrupts and higher priority real-time debug events:
  47.   EINT;                           // Enable Global interrupt INTM
  48.   ERTM;                           // Enable Global realtime interrupt DBGM
  49. // Configure EVA
  50. // Assumes EVA Clock is already enabled in InitSysCtrl();
  51. // Drive T1PWM / T2PWM by T1/T2 - logic
  52.   EvaRegs.GPTCONA.bit.TCMPOE = 1;
  53. // Polarity of GP Timer 1 Compare = Active low
  54.   EvaRegs.GPTCONA.bit.T1PIN = 1;
  55.   EvaRegs.T1CON.bit.FREE = 0;     // Stop on emulation suspend
  56.   EvaRegs.T1CON.bit.SOFT = 0;     // Stop on emulation suspend
  57.   EvaRegs.T1CON.bit.TMODE = 2;    // Continuous up count mode
  58.   EvaRegs.T1CON.bit.TPS = 0;      // prescaler = 1 : 75 MHz
  59.   EvaRegs.T1CON.bit.TENABLE = 0;  // disable GP Timer 1 now
  60.   EvaRegs.T1CON.bit.TCLKS10 = 0;  // internal clock
  61.   EvaRegs.T1CON.bit.TCLD10 = 0;   // Compare Reload when zero
  62.   EvaRegs.T1CON.bit.TECMPR = 1;   // Enable Compare operation
  63.   EvaRegs.T1PR = 1500;
  64.   EvaRegs.T1CMPR = EvaRegs.T1PR/2;
  65.   EvaRegs.EVAIMRA.bit.T1CINT = 1;
  66.   EvaRegs.T1CON.bit.TENABLE = 1;  // enable GP Timer 1 now
  67.   while(1)
  68.   {
  69.     EALLOW;
  70.     SysCtrlRegs.WDKEY = 0xAA;     // and serve watchdog #2
  71.     EDIS;
  72.   }
  73. }
  74. void Gpio_select(void)
  75. {
  76.   EALLOW;
  77.   GpioMuxRegs.GPAMUX.all = 0x0;   // all GPIO port Pin's to I/O
  78.   GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6 = 1;  // T1PWM active
  79.   GpioMuxRegs.GPBMUX.all = 0x0;
  80.   GpioMuxRegs.GPDMUX.all = 0x0;
  81.   GpioMuxRegs.GPFMUX.all = 0x0;
  82.   GpioMuxRegs.GPEMUX.all = 0x0;
  83.   GpioMuxRegs.GPGMUX.all = 0x0;
  84.   GpioMuxRegs.GPADIR.all = 0x0;   // GPIO PORT  as input
  85.   GpioMuxRegs.GPBDIR.all = 0x00FF;// GPIO Port B15-B8 input , B7-B0 output
  86.   GpioMuxRegs.GPDDIR.all = 0x0;   // GPIO PORT  as input
  87.   GpioMuxRegs.GPEDIR.all = 0x0;   // GPIO PORT  as input
  88.   GpioMuxRegs.GPFDIR.all = 0x0;   // GPIO PORT  as input
  89.   GpioMuxRegs.GPGDIR.all = 0x0;   // GPIO PORT  as input
  90.   GpioMuxRegs.GPAQUAL.all = 0x0;  // Set GPIO input qualifier values to zero
  91.   GpioMuxRegs.GPBQUAL.all = 0x0;
  92.   GpioMuxRegs.GPDQUAL.all = 0x0;
  93.   GpioMuxRegs.GPEQUAL.all = 0x0;
  94.   EDIS;
  95. }
  96. /*
  97. void SpeedUpRevA(void)
  98. {
  99. // On TMX samples, to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 internal
  100. // control registers bit have to be enabled. The bits are in Device emulation registers.
  101.   EALLOW;
  102.   DevEmuRegs.M0RAMDFT = 0x0300;
  103.   DevEmuRegs.M1RAMDFT = 0x0300;
  104.   DevEmuRegs.L0RAMDFT = 0x0300;
  105.   DevEmuRegs.L1RAMDFT = 0x0300;
  106.   DevEmuRegs.H0RAMDFT = 0x0300;
  107.   EDIS;
  108. }
  109. */
  110. void InitSystem(void)
  111. {
  112.   volatile int16 dummy;           // General purpose volatile int16
  113.   EALLOW;                         // Enable EALLOW protected register access
  114. // Memory Protection Configuration
  115.   DevEmuRegs.PROTSTART = 0x0100;  // Write default value to protection start register
  116.   DevEmuRegs.PROTRANGE = 0x00FF;  // Write default value to protection range register
  117. // Unlock the Code Security Module if CSM not in use
  118. /* Unlocking the CSM will allow code running from non-secure memory
  119.    to access code and data in secure memory.  One would only want to
  120.    unsecure the CSM if code security were not desired, and therefore
  121.    the CSM is not in use (otherwise, unlocking the CSM will compromise
  122.    the security of user code).  If the CSM is not in use, the best
  123.    thing to do is leave the password locations programmed to 0xFFFF,
  124.    which is the flash ERASED state.  When all passwords are 0xFFFF,
  125.    all that is required to unlock the CSM are dummy reads of the
  126.    PWL locations.
  127. */
  128.   dummy = CsmPwl.PSWD0;           // Dummy read of PWL locations
  129.   dummy = CsmPwl.PSWD1;           // Dummy read of PWL locations
  130.   dummy = CsmPwl.PSWD2;           // Dummy read of PWL locations
  131.   dummy = CsmPwl.PSWD3;           // Dummy read of PWL locations
  132.   dummy = CsmPwl.PSWD4;           // Dummy read of PWL locations
  133.   dummy = CsmPwl.PSWD5;           // Dummy read of PWL locations
  134.   dummy = CsmPwl.PSWD6;           // Dummy read of PWL locations
  135.   dummy = CsmPwl.PSWD7;           // Dummy read of PWL locations
  136.   asm(" RPT #6 || NOP");
  137.   
  138.   SysCtrlRegs.WDCR= 0x00AF;       // Setup the watchdog
  139.                                   // 0x00E8  to disable the Watchdog , Prescaler = 1
  140.                                   // 0x00AF  to NOT disable the Watchdog, Prescaler = 64
  141.   SysCtrlRegs.SCSR = 0;           // Watchdog generates a RESET
  142.   SysCtrlRegs.PLLCR.bit.DIV = 10; // Setup the Clock PLL to multiply by 5
  143.   SysCtrlRegs.HISPCP.all = 0x1;   // Setup Highspeed Clock Prescaler to divide by 2
  144.   SysCtrlRegs.LOSPCP.all = 0x2;   // Setup Lowspeed CLock Prescaler to divide by 4
  145. // Peripheral clock enables set for the selected peripherals.
  146.   SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
  147.   SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
  148.   SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;
  149.   SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
  150.   SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
  151.   SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
  152.   SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
  153.   SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
  154.   EDIS;
  155. }
  156. /**********************************************************************
  157. * Function: CfgFlash()
  158. * Description: Initializes the F281x flash timing registers.
  159. * Notes:
  160. *  1) This function MUST be executed out of RAM.  Executing it out of
  161. *     OTP/FLASH will produce unpredictable results.
  162. *  2) The flash registers are code security module protected.  Therefore,
  163. *     you must either run this function from L0/L1 RAM, or you must
  164. *     first unlock the CSM.  Note that unlocking the CSM as part of
  165. *     the program flow can compromise the code security.
  166. *  3) The latest datasheet for the particular device of interest should
  167. *     be consulted to confirm the flash timing specifications.
  168. **********************************************************************/
  169. #pragma CODE_SECTION(CfgFlash, "ramfuncs")
  170. void CfgFlash(void)
  171. {
  172.   asm(" EALLOW");                      // Enable EALLOW protected register access
  173.   FlashRegs.FPWR.bit.PWR = 3;          // Pump and bank set to active mode
  174.   FlashRegs.FSTATUS.bit.V3STAT = 1;    // Clear the 3VSTAT bit
  175.   FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;   // Sleep to standby transition cycles
  176.   FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; // Standby to active transition cycles
  177.   FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;// Random access waitstates
  178.   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;// Paged access waitstates
  179.   FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;  // OTP waitstates
  180.   FlashRegs.FOPT.bit.ENPIPE = 1;       // Enable the flash pipeline
  181.   asm(" EDIS");                        // Disable EALLOW protected register access
  182. // Force a complete pipeline flush to ensure that the write to the last register
  183. // configured occurs before returning.  Safest thing is to wait 8 full cycles.
  184.   asm(" RPT #6 || NOP");
  185. }  //end of CfgFlash()
  186. interrupt void T1_Compare_isr(void)
  187. {
  188.   static int index=0;
  189. // Serve the watchdog every Timer 0 interrupt
  190.   EALLOW;
  191.   SysCtrlRegs.WDKEY = 0x55;       // Serve watchdog #1
  192.   EDIS;
  193.   EvaRegs.T1CMPR =  EvaRegs.T1PR - _IQsat(_IQ30mpy(sine_table[index]+_IQ30(0.9999),EvaRegs.T1PR/2),EvaRegs.T1PR,0);
  194.   index +=4;                      // use every 4th element out of lookup table
  195.   if (index >511) 
  196.    index = 0;
  197. // Reset T1 Compare Interrupt Flag
  198.   EvaRegs.EVAIFRA.bit.T1CINT = 1;
  199. // Acknowledge this interrupt to receive more interrupts from group 2
  200.   PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
  201. }
  202. //===========================================================================
  203. // End
  204. //===========================================================================