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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:  experiment_m_4.c
  4. //
  5. // TITLE: DSP28 GPIO - Port B7..B0  : 8-Bit "Knight - Rider" ,
  6. //        CPU Timer0 ISR every 50 ms
  7. //        Watchdog active , served in ISR and main-loop
  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 CfgFlash(void);
  16. interrupt void cpu_timer0_isr(void);   // Prototype for Timer 0 Interrupt Service Routine
  17. // Global symbols defined in the linker command file
  18. extern Uint16 RamfuncsLoadStart;
  19. extern Uint16 RamfuncsLoadEnd;
  20. extern Uint16 RamfuncsRunStart;
  21. void main(void)
  22. {
  23.   unsigned int i;
  24.   unsigned int LED[8]= {0xFFFE,0xFFFD,0xFFFB,0xFFF7,
  25.                         0xFFEF,0xFFDF,0xFFBF,0xFF7F};
  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.   InitPieCtrl();                  // Function Call to init PIE-unit ( code : DSP281x_PieCtrl.c)
  30.   InitPieVectTable();             // Function call to init PIE vector table ( code : DSP281x_PieVect.c )
  31. // re-map PIE - entry for Timer 0 Interrupt
  32.   EALLOW;                         // This is needed to write to EALLOW protected registers
  33.   PieVectTable.TINT0 = &cpu_timer0_isr;
  34.   EDIS;                           // This is needed to disable write to EALLOW protected registers
  35. // Copy all FLASH sections that need to run from RAM (use memcpy() from RTS library)
  36. // Section ramfuncs contains user defined code that runs from CSM secured RAM
  37.   memcpy( &RamfuncsRunStart,
  38.       &RamfuncsLoadStart,
  39.       &RamfuncsLoadEnd - &RamfuncsLoadStart);
  40. // Initialize the FLASH
  41.   CfgFlash();        // Initialize the FLASH
  42.   InitCpuTimers();
  43. // Configure CPU-Timer 0 to interrupt every 50 ms:
  44. // 150MHz CPU Freq, 50000 祍econds interrupt period
  45.   ConfigCpuTimer(&CpuTimer0, 150, 50000);
  46. // Enable TINT0 in the PIE: Group 1 interrupt 7
  47.   PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
  48. // Enable CPU INT1 which is connected to CPU-Timer 0:
  49.   IER = 1;
  50. // Enable global Interrupts and higher priority real-time debug events:
  51.   EINT;                           // Enable Global interrupt INTM
  52.   ERTM;                           // Enable Global realtime interrupt DBGM
  53.   CpuTimer0Regs.TCR.bit.TSS = 0;
  54.   while(1)
  55.   {
  56.     for(i=0;i<14;i++)
  57.     {
  58.       if(i<7) 
  59.        GpioDataRegs.GPBDAT.all = LED[i];
  60.       else   
  61.        GpioDataRegs.GPBDAT.all = LED[14-i];
  62.       while(CpuTimer0.InterruptCount < 3);  // wait for Timer 0
  63.       CpuTimer0.InterruptCount = 0;
  64.       EALLOW;
  65.       SysCtrlRegs.WDKEY = 0xAA;   // and serve watchdog #2
  66.       EDIS;
  67.     }
  68.   }
  69. }
  70. void Gpio_select(void)
  71. {
  72.   EALLOW;
  73.   GpioMuxRegs.GPAMUX.all = 0x0;   // all GPIO port Pin's to I/O
  74.   GpioMuxRegs.GPBMUX.all = 0x0;
  75.   GpioMuxRegs.GPDMUX.all = 0x0;
  76.   GpioMuxRegs.GPFMUX.all = 0x0;
  77.   GpioMuxRegs.GPEMUX.all = 0x0;
  78.   GpioMuxRegs.GPGMUX.all = 0x0;
  79.   GpioMuxRegs.GPADIR.all = 0x0;   // GPIO PORT  as input
  80.   GpioMuxRegs.GPBDIR.all = 0x00FF;// GPIO Port B15-B8 input , B7-B0 output
  81.   GpioMuxRegs.GPDDIR.all = 0x0;   // GPIO PORT  as input
  82.   GpioMuxRegs.GPEDIR.all = 0x0;   // GPIO PORT  as input
  83.   GpioMuxRegs.GPFDIR.all = 0x0;   // GPIO PORT  as input
  84.   GpioMuxRegs.GPGDIR.all = 0x0;   // GPIO PORT  as input
  85.   GpioMuxRegs.GPAQUAL.all = 0x0;  // Set GPIO input qualifier values to zero
  86.   GpioMuxRegs.GPBQUAL.all = 0x0;
  87.   GpioMuxRegs.GPDQUAL.all = 0x0;
  88.   GpioMuxRegs.GPEQUAL.all = 0x0;
  89.   EDIS;
  90. }
  91. /*void SpeedUpRevA(void)
  92. {
  93. // On TMX samples, to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 internal
  94. // control registers bit have to be enabled. The bits are in Device emulation registers.
  95.   EALLOW;
  96.   DevEmuRegs.M0RAMDFT = 0x0300;
  97.   DevEmuRegs.M1RAMDFT = 0x0300;
  98.   DevEmuRegs.L0RAMDFT = 0x0300;
  99.   DevEmuRegs.L1RAMDFT = 0x0300;
  100.   DevEmuRegs.H0RAMDFT = 0x0300;
  101.   EDIS;
  102. }*/
  103. void InitSystem(void)
  104. {
  105.   volatile int16 dummy;           // General purpose volatile int16
  106.   EALLOW;                         // Enable EALLOW protected register access
  107. // Memory Protection Configuration
  108.   DevEmuRegs.PROTSTART = 0x0100;  // Write default value to protection start register
  109.   DevEmuRegs.PROTRANGE = 0x00FF;  // Write default value to protection range register
  110. // Unlock the Code Security Module if CSM not in use
  111. /* Unlocking the CSM will allow code running from non-secure memory
  112.    to access code and data in secure memory.  One would only want to
  113.    unsecure the CSM if code security were not desired, and therefore
  114.    the CSM is not in use (otherwise, unlocking the CSM will compromise
  115.    the security of user code).  If the CSM is not in use, the best
  116.    thing to do is leave the password locations programmed to 0xFFFF,
  117.    which is the flash ERASED state.  When all passwords are 0xFFFF,
  118.    all that is required to unlock the CSM are dummy reads of the
  119.    PWL locations.
  120. */
  121.   dummy = CsmPwl.PSWD0;           // Dummy read of PWL locations
  122.   dummy = CsmPwl.PSWD1;           // Dummy read of PWL locations
  123.   dummy = CsmPwl.PSWD2;           // Dummy read of PWL locations
  124.   dummy = CsmPwl.PSWD3;           // Dummy read of PWL locations
  125.   dummy = CsmPwl.PSWD4;           // Dummy read of PWL locations
  126.   dummy = CsmPwl.PSWD5;           // Dummy read of PWL locations
  127.   dummy = CsmPwl.PSWD6;           // Dummy read of PWL locations
  128.   dummy = CsmPwl.PSWD7;           // Dummy read of PWL locations
  129.   asm(" RPT #6 || NOP");
  130.   
  131.   SysCtrlRegs.WDCR= 0x00AF;       // Setup the watchdog
  132.                                   // 0x00E8  to disable the Watchdog , Prescaler = 1
  133.                                   // 0x00AF  to NOT disable the Watchdog, Prescaler = 64
  134.   SysCtrlRegs.SCSR = 0;           // Watchdog generates a RESET
  135.   SysCtrlRegs.PLLCR.bit.DIV = 10; // Setup the Clock PLL to multiply by 5
  136.   SysCtrlRegs.HISPCP.all = 0x1;   // Setup Highspeed Clock Prescaler to divide by 2
  137.   SysCtrlRegs.LOSPCP.all = 0x2;   // Setup Lowspeed CLock Prescaler to divide by 4
  138. // Peripheral clock enables set for the selected peripherals.
  139.   SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;
  140.   SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
  141.   SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;
  142.   SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
  143.   SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
  144.   SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
  145.   SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
  146.   SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
  147.   EDIS;
  148. }
  149. interrupt void cpu_timer0_isr(void)
  150. {
  151.   CpuTimer0.InterruptCount++;
  152. // Serve the watchdog every Timer 0 interrupt
  153.   EALLOW;
  154.   SysCtrlRegs.WDKEY = 0x55;       // Serve watchdog #1
  155.   EDIS;
  156. // Acknowledge this interrupt to receive more interrupts from group 1
  157.   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
  158. }
  159. /**********************************************************************
  160. * Function: CfgFlash()
  161. * Description: Initializes the F281x flash timing registers.
  162. * Notes:
  163. *  1) This function MUST be executed out of RAM.  Executing it out of
  164. *     OTP/FLASH will produce unpredictable results.
  165. *  2) The flash registers are code security module protected.  Therefore,
  166. *     you must either run this function from L0/L1 RAM, or you must
  167. *     first unlock the CSM.  Note that unlocking the CSM as part of
  168. *     the program flow can compromise the code security.
  169. *  3) The latest datasheet for the particular device of interest should
  170. *     be consulted to confirm the flash timing specifications.
  171. **********************************************************************/
  172. #pragma CODE_SECTION(CfgFlash, "ramfuncs")
  173. void CfgFlash(void)
  174. {
  175.   asm(" EALLOW");                      // Enable EALLOW protected register access
  176.   FlashRegs.FPWR.bit.PWR = 3;          // Pump and bank set to active mode
  177.   FlashRegs.FSTATUS.bit.V3STAT = 1;    // Clear the 3VSTAT bit
  178.   FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;   // Sleep to standby transition cycles
  179.   FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; // Standby to active transition cycles
  180.   FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;// Random access waitstates
  181.   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;// Paged access waitstates
  182.   FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;  // OTP waitstates
  183.   FlashRegs.FOPT.bit.ENPIPE = 1;       // Enable the flash pipeline
  184.   asm(" EDIS");                        // Disable EALLOW protected register access
  185. // Force a complete pipeline flush to ensure that the write to the last register
  186. // configured occurs before returning.  Safest thing is to wait 8 full cycles.
  187.   asm(" RPT #6 || NOP");
  188. }  //end of CfgFlash()
  189. //===========================================================================
  190. // End
  191. //===========================================================================