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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:  experiment_m_8C.c
  4. //
  5. // TITLE: DSP28 SCI - Communication to Windows - Hyperterminal
  6. //      DSP waits to receive "Texas" from the PC and answers by
  7. //      transmitting the string " Instruments" back to the PC
  8. //      Setup : 9600 Baud, 8 Bit , No Parity , 1 Stopbit
  9. //      SCI-TX INT to serve empty TX buffer
  10. //      SCI TX FIFO to fill in up to 16 characters
  11. //
  12. //###########################################################################
  13. #include "DSP281x_Device.h"
  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. void SCI_Init(void);
  20. interrupt void SCI_TX_isr(void);
  21. interrupt void SCI_RX_isr(void);
  22. // Global symbols defined in the linker command file
  23. extern Uint16 RamfuncsLoadStart;
  24. extern Uint16 RamfuncsLoadEnd;
  25. extern Uint16 RamfuncsRunStart;
  26. // Global Variables
  27. char message[]={" Instrumentsnr"};
  28. void main(void)
  29. {
  30.   InitSystem();    // Initialize the DSP's core Registers
  31. //SpeedUpRevA();   // Speed_up the silicon A Revision.
  32.   Gpio_select();   // Setup the GPIO Multiplex Registers
  33.   GpioDataRegs.GPBDAT.all = 0xFFFF;    // Switch LED's off
  34. // Copy all FLASH sections that need to run from RAM (use memcpy() from RTS library)
  35. // Section ramfuncs contains user defined code that runs from CSM secured RAM
  36.   memcpy( &RamfuncsRunStart,
  37.       &RamfuncsLoadStart,
  38.       &RamfuncsLoadEnd - &RamfuncsLoadStart);
  39. // Initialize the FLASH
  40.   CfgFlash();           // Initialize the FLASH
  41.   
  42.   InitPieCtrl();   // Function Call to init PIE-unit ( code : DSP281x_PieCtrl.c)
  43.   InitPieVectTable();   // Function call to init PIE vector table ( code : DSP281x_PieVect.c )
  44.   EALLOW;          // This is needed to write to EALLOW protected registers
  45.   PieVectTable.TXAINT = &SCI_TX_isr;
  46.   PieVectTable.RXAINT = &SCI_RX_isr;
  47.   EDIS;            // This is needed to disable write to EALLOW protected registers
  48. // Enable SCI_A_TX_INT in PIE
  49.   PieCtrlRegs.PIEIER9.bit.INTx2 = 1;
  50. // Enable SCI_A_RX_INT in PIE
  51.   PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
  52. // Enable CPU INT 9
  53.   IER |= 0x100;
  54. // Enable global Interrupts and higher priority real-time debug events:
  55.   EINT;            // Enable Global interrupt INTM
  56.   ERTM;            // Enable Global realtime interrupt DBGM
  57.   SCI_Init();
  58.   
  59.   while(1)
  60.   {
  61.     EALLOW;
  62.     SysCtrlRegs.WDKEY = 0x55;     // Serve watchdog #1
  63.     SysCtrlRegs.WDKEY = 0xAA;     // Serce watchdog #2
  64.     EDIS;
  65.   }
  66. }
  67. void Gpio_select(void)
  68. {
  69.   EALLOW;
  70.   GpioMuxRegs.GPAMUX.all = 0x0;   // all GPIO port Pin's to I/O
  71.   GpioMuxRegs.GPBMUX.all = 0x0;
  72.   GpioMuxRegs.GPDMUX.all = 0x0;
  73.   GpioMuxRegs.GPFMUX.all = 0x0;
  74.   GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;//SCI-RX
  75.   GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;//SCI-TX
  76.   GpioMuxRegs.GPEMUX.all = 0x0;
  77.   GpioMuxRegs.GPGMUX.all = 0x0;
  78.   GpioMuxRegs.GPADIR.all = 0x0;   // GPIO PORT  as input
  79.   GpioMuxRegs.GPBDIR.all = 0x00FF;// GPIO Port B15-B8 input , B7-B0 output
  80.   GpioMuxRegs.GPDDIR.all = 0x0;   // GPIO PORT  as input
  81.   GpioMuxRegs.GPEDIR.all = 0x0;   // GPIO PORT  as input
  82.   GpioMuxRegs.GPFDIR.all = 0x0;   // GPIO PORT  as input
  83.   GpioMuxRegs.GPGDIR.all = 0x0;   // GPIO PORT  as input
  84.   GpioMuxRegs.GPAQUAL.all = 0x0;  // Set GPIO input qualifier values to zero
  85.   GpioMuxRegs.GPBQUAL.all = 0x0;
  86.   GpioMuxRegs.GPDQUAL.all = 0x0;
  87.   GpioMuxRegs.GPEQUAL.all = 0x0;
  88.   EDIS;
  89. }
  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. */
  104. void InitSystem(void)
  105. {
  106.   volatile int16 dummy;           // General purpose volatile int16
  107.   EALLOW;                         // Enable EALLOW protected register access
  108. // Memory Protection Configuration
  109.   DevEmuRegs.PROTSTART = 0x0100;  // Write default value to protection start register
  110.   DevEmuRegs.PROTRANGE = 0x00FF;  // Write default value to protection range register
  111. // Unlock the Code Security Module if CSM not in use
  112. /* Unlocking the CSM will allow code running from non-secure memory
  113.    to access code and data in secure memory.  One would only want to
  114.    unsecure the CSM if code security were not desired, and therefore
  115.    the CSM is not in use (otherwise, unlocking the CSM will compromise
  116.    the security of user code).  If the CSM is not in use, the best
  117.    thing to do is leave the password locations programmed to 0xFFFF,
  118.    which is the flash ERASED state.  When all passwords are 0xFFFF,
  119.    all that is required to unlock the CSM are dummy reads of the
  120.    PWL locations.
  121. */
  122.   dummy = CsmPwl.PSWD0;           // Dummy read of PWL locations
  123.   dummy = CsmPwl.PSWD1;           // Dummy read of PWL locations
  124.   dummy = CsmPwl.PSWD2;           // Dummy read of PWL locations
  125.   dummy = CsmPwl.PSWD3;           // Dummy read of PWL locations
  126.   dummy = CsmPwl.PSWD4;           // Dummy read of PWL locations
  127.   dummy = CsmPwl.PSWD5;           // Dummy read of PWL locations
  128.   dummy = CsmPwl.PSWD6;           // Dummy read of PWL locations
  129.   dummy = CsmPwl.PSWD7;           // Dummy read of PWL locations
  130.   asm(" RPT #6 || NOP");
  131.   
  132.   SysCtrlRegs.WDCR= 0x00AF;  // Setup the watchdog
  133.                    // 0x00E8  to disable the Watchdog , Prescaler = 1
  134.                    // 0x00AF  to NOT disable the Watchdog, Prescaler = 64
  135.   SysCtrlRegs.SCSR = 0;      // Watchdog generates a RESET
  136.   SysCtrlRegs.PLLCR.bit.DIV = 10; // Setup the Clock PLL to multiply by 5
  137.   SysCtrlRegs.HISPCP.all = 0x1;   // Setup Highspeed Clock Prescaler to divide by 2
  138.   SysCtrlRegs.LOSPCP.all = 0x2;   // Setup Lowspeed CLock Prescaler to divide by 4
  139. // Peripheral clock enables set for the selected peripherals.
  140.   SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;
  141.   SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
  142.   SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
  143.   SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
  144.   SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
  145.   SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
  146.   SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
  147.   SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
  148.   EDIS;
  149. }
  150. /**********************************************************************
  151. * Function: CfgFlash()
  152. * Description: Initializes the F281x flash timing registers.
  153. * Notes:
  154. *  1) This function MUST be executed out of RAM.  Executing it out of
  155. *     OTP/FLASH will produce unpredictable results.
  156. *  2) The flash registers are code security module protected.  Therefore,
  157. *     you must either run this function from L0/L1 RAM, or you must
  158. *     first unlock the CSM.  Note that unlocking the CSM as part of
  159. *     the program flow can compromise the code security.
  160. *  3) The latest datasheet for the particular device of interest should
  161. *     be consulted to confirm the flash timing specifications.
  162. **********************************************************************/
  163. #pragma CODE_SECTION(CfgFlash, "ramfuncs")
  164. void CfgFlash(void)
  165. {
  166.   asm(" EALLOW");                      // Enable EALLOW protected register access
  167.   FlashRegs.FPWR.bit.PWR = 3;          // Pump and bank set to active mode
  168.   FlashRegs.FSTATUS.bit.V3STAT = 1;    // Clear the 3VSTAT bit
  169.   FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;   // Sleep to standby transition cycles
  170.   FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; // Standby to active transition cycles
  171.   FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;// Random access waitstates
  172.   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;// Paged access waitstates
  173.   FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;  // OTP waitstates
  174.   FlashRegs.FOPT.bit.ENPIPE = 1;       // Enable the flash pipeline
  175.   asm(" EDIS");                        // Disable EALLOW protected register access
  176. // Force a complete pipeline flush to ensure that the write to the last register
  177. // configured occurs before returning.  Safest thing is to wait 8 full cycles.
  178.   asm(" RPT #6 || NOP");
  179. }  //end of CfgFlash()
  180. void SCI_Init(void)
  181. {
  182.   SciaRegs.SCICCR.all =0x0007;    // 1 stop bit,  No loopback
  183.                                   // No parity,8 char bits,
  184.                                   // async mode, idle-line protocol
  185.   SciaRegs.SCICTL1.all =0x0003;   // enable TX, RX, internal SCICLK,
  186.                                   // Disable RX ERR, SLEEP, TXWAKE
  187.   SciaRegs.SCIHBAUD = 487 >> 8 ;  // 9600 Baud ; LSPCLK = 37.5MHz
  188.   SciaRegs.SCILBAUD = 487 & 0x00FF;
  189.   SciaRegs.SCICTL2.bit.TXINTENA = 1;   // Enable SCI-Transmit-interrupt
  190.   SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // Enable SCI-A-Receive-interrupt
  191.   SciaRegs.SCIFFTX.all = 0xC060;  // bit 15 = 1 : relinquish from Reset
  192.                    // bit 14 = 1 : Enable FIFO Enhancement
  193.                    // bit 6 = 1 :  CLR TXFFINT-Flag
  194.                    // bit 5 = 1 :  enable TX FIFO match
  195.                    // bit 4-0 :  TX-ISR, if TX FIFO is 0
  196.   SciaRegs.SCIFFRX.all = 0xE065;  // Rx interrupt level = 5
  197.   SciaRegs.SCICTL1.all = 0x0023;  // Relinquish SCI from Reset
  198. }
  199. //===========================================================================
  200. // SCI_A Transmit Interrupt Service
  201. // Transmit the characters 2..26 of the string message[]
  202. //===========================================================================
  203. interrupt void SCI_TX_isr(void)
  204. {
  205.   int i;
  206.   for(i=0;i<16;i++)SciaRegs.SCITXBUF=message[i]; // 16 load operations
  207. // Reinitialize the PIE for next SCI-A TX-Interrupt
  208.   PieCtrlRegs.PIEACK.all = 0x0100;     // Acknowledge interrupt to PIE
  209. }
  210. interrupt void SCI_RX_isr(void)
  211. {
  212.   int i;
  213.   char buffer[16];
  214.   for (i=0;i<16;i++) buffer[i]= SciaRegs.SCIRXBUF.all;
  215.   if (far_strncmp(buffer, "Texas", 5)==0)
  216.   {
  217.     SciaRegs.SCIFFTX.bit.TXFIFOXRESET =1;
  218.     SciaRegs.SCIFFTX.bit.TXINTCLR = 1 ;
  219.   }
  220.   SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;// reset FIFO pointer
  221.   SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;// enable operation
  222.   SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // clear FIFO INT Flag
  223.   PieCtrlRegs.PIEACK.all = 0x0100;     // Acknowledge interrupt to PIE
  224. }
  225. //===========================================================================
  226. // End
  227. //===========================================================================