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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:  experiment_m_8.c
  4. //
  5. // TITLE: DSP28 SCI - Communication to Windows - Hyperterminal
  6. //      DSP sends the string "The F2812-UART is fine ! Thankyou !" approx. every 2 seconds
  7. //      Setup : 9600 Baud, 8 Bit , No Parity , 1 Stopbit
  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. void SCI_Init(void);
  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.   char message[]={"The F2812-UART is fine ! Thankyou !nr"};
  24.   int index =0;              // pointer into string
  25.   long i;
  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.   
  30.   GpioDataRegs.GPBDAT.all = 0xFFFE;     
  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.   SCI_Init();
  39.   
  40.   while(1)
  41.   {
  42.     SciaRegs.SCITXBUF=message[index++];
  43.     while ( SciaRegs.SCICTL2.bit.TXEMPTY == 0);  //wait for TX -empty
  44.     EALLOW;
  45.     SysCtrlRegs.WDKEY = 0x55;     // Serve watchdog #1
  46.     SysCtrlRegs.WDKEY = 0xAA;     // Serve watchdog #1
  47.     EDIS;
  48.     if (index > 36)
  49.       {
  50.         index =0;
  51.         for(i=0;i<15000000;i++)   // Software - delay approx. 2 sec.
  52.         {
  53.           EALLOW;
  54.           SysCtrlRegs.WDKEY = 0x55;    // Serve watchdog #1
  55.           SysCtrlRegs.WDKEY = 0xAA;    // Serve watchdog #1
  56.           EDIS;
  57.         }
  58.       }
  59.   }
  60. }
  61. void Gpio_select(void)
  62. {
  63.   EALLOW;
  64.   GpioMuxRegs.GPAMUX.all = 0x0;   // all GPIO port Pin's to I/O
  65.   GpioMuxRegs.GPBMUX.all = 0x0;
  66.   GpioMuxRegs.GPDMUX.all = 0x0;
  67.   GpioMuxRegs.GPFMUX.all = 0x0;
  68.   GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;     //SCI-RX
  69.   GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;     //SCI-TX
  70.   GpioMuxRegs.GPEMUX.all = 0x0;
  71.   GpioMuxRegs.GPGMUX.all = 0x0;
  72.   GpioMuxRegs.GPADIR.all = 0x0;   // GPIO PORT  as input
  73.   GpioMuxRegs.GPBDIR.all = 0x00FF;// GPIO Port B15-B8 input , B7-B0 output
  74.   GpioMuxRegs.GPDDIR.all = 0x0;   // GPIO PORT  as input
  75.   GpioMuxRegs.GPEDIR.all = 0x0;   // GPIO PORT  as input
  76.   GpioMuxRegs.GPFDIR.all = 0x0;   // GPIO PORT  as input
  77.   GpioMuxRegs.GPGDIR.all = 0x0;   // GPIO PORT  as input
  78.   GpioMuxRegs.GPAQUAL.all = 0x0;  // Set GPIO input qualifier values to zero
  79.   GpioMuxRegs.GPBQUAL.all = 0x0;
  80.   GpioMuxRegs.GPDQUAL.all = 0x0;
  81.   GpioMuxRegs.GPEQUAL.all = 0x0;
  82.   EDIS;
  83. }
  84. /*
  85. void SpeedUpRevA(void)
  86. {
  87. // On TMX samples, to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 internal
  88. // control registers bit have to be enabled. The bits are in Device emulation registers.
  89.   EALLOW;
  90.   DevEmuRegs.M0RAMDFT = 0x0300;
  91.   DevEmuRegs.M1RAMDFT = 0x0300;
  92.   DevEmuRegs.L0RAMDFT = 0x0300;
  93.   DevEmuRegs.L1RAMDFT = 0x0300;
  94.   DevEmuRegs.H0RAMDFT = 0x0300;
  95.   EDIS;
  96. }
  97. */
  98. void InitSystem(void)
  99. {
  100.   volatile int16 dummy;           // General purpose volatile int16
  101.   EALLOW;                         // Enable EALLOW protected register access
  102. // Memory Protection Configuration
  103.   DevEmuRegs.PROTSTART = 0x0100;  // Write default value to protection start register
  104.   DevEmuRegs.PROTRANGE = 0x00FF;  // Write default value to protection range register
  105. // Unlock the Code Security Module if CSM not in use
  106. /* Unlocking the CSM will allow code running from non-secure memory
  107.    to access code and data in secure memory.  One would only want to
  108.    unsecure the CSM if code security were not desired, and therefore
  109.    the CSM is not in use (otherwise, unlocking the CSM will compromise
  110.    the security of user code).  If the CSM is not in use, the best
  111.    thing to do is leave the password locations programmed to 0xFFFF,
  112.    which is the flash ERASED state.  When all passwords are 0xFFFF,
  113.    all that is required to unlock the CSM are dummy reads of the
  114.    PWL locations.
  115. */
  116.   dummy = CsmPwl.PSWD0;           // Dummy read of PWL locations
  117.   dummy = CsmPwl.PSWD1;           // Dummy read of PWL locations
  118.   dummy = CsmPwl.PSWD2;           // Dummy read of PWL locations
  119.   dummy = CsmPwl.PSWD3;           // Dummy read of PWL locations
  120.   dummy = CsmPwl.PSWD4;           // Dummy read of PWL locations
  121.   dummy = CsmPwl.PSWD5;           // Dummy read of PWL locations
  122.   dummy = CsmPwl.PSWD6;           // Dummy read of PWL locations
  123.   dummy = CsmPwl.PSWD7;           // Dummy read of PWL locations
  124.   asm(" RPT #6 || NOP");
  125.   
  126.   SysCtrlRegs.WDCR= 0x00AF;  // Setup the watchdog
  127.                    // 0x00E8  to disable the Watchdog , Prescaler = 1
  128.                    // 0x00AF  to NOT disable the Watchdog, Prescaler = 64
  129.   SysCtrlRegs.SCSR = 0;      // Watchdog generates a RESET
  130.   SysCtrlRegs.PLLCR.bit.DIV = 10; // Setup the Clock PLL to multiply by 5
  131.   SysCtrlRegs.HISPCP.all = 0x1;   // Setup Highspeed Clock Prescaler to divide by 2
  132.   SysCtrlRegs.LOSPCP.all = 0x2;   // Setup Lowspeed CLock Prescaler to divide by 4
  133. // Peripheral clock enables set for the selected peripherals.
  134.   SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;
  135.   SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
  136.   SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
  137.   SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
  138.   SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
  139.   SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
  140.   SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
  141.   SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
  142.   EDIS;
  143. }
  144. /**********************************************************************
  145. * Function: CfgFlash()
  146. * Description: Initializes the F281x flash timing registers.
  147. * Notes:
  148. *  1) This function MUST be executed out of RAM.  Executing it out of
  149. *     OTP/FLASH will produce unpredictable results.
  150. *  2) The flash registers are code security module protected.  Therefore,
  151. *     you must either run this function from L0/L1 RAM, or you must
  152. *     first unlock the CSM.  Note that unlocking the CSM as part of
  153. *     the program flow can compromise the code security.
  154. *  3) The latest datasheet for the particular device of interest should
  155. *     be consulted to confirm the flash timing specifications.
  156. **********************************************************************/
  157. #pragma CODE_SECTION(CfgFlash, "ramfuncs")
  158. void CfgFlash(void)
  159. {
  160.   asm(" EALLOW");                      // Enable EALLOW protected register access
  161.   FlashRegs.FPWR.bit.PWR = 3;          // Pump and bank set to active mode
  162.   FlashRegs.FSTATUS.bit.V3STAT = 1;    // Clear the 3VSTAT bit
  163.   FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;   // Sleep to standby transition cycles
  164.   FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; // Standby to active transition cycles
  165.   FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;// Random access waitstates
  166.   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;// Paged access waitstates
  167.   FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;  // OTP waitstates
  168.   FlashRegs.FOPT.bit.ENPIPE = 1;       // Enable the flash pipeline
  169.   asm(" EDIS");                        // Disable EALLOW protected register access
  170. // Force a complete pipeline flush to ensure that the write to the last register
  171. // configured occurs before returning.  Safest thing is to wait 8 full cycles.
  172.   asm(" RPT #6 || NOP");
  173. }  //end of CfgFlash()
  174. void SCI_Init(void)
  175. {
  176.   SciaRegs.SCICCR.all =0x0007;    // 1 stop bit,  No loopback
  177.                                   // No parity,8 char bits,
  178.                                   // async mode, idle-line protocol
  179.   SciaRegs.SCICTL1.all =0x0003;   // enable TX, RX, internal SCICLK,
  180.                                   // Disable RX ERR, SLEEP, TXWAKE
  181.   SciaRegs.SCIHBAUD = 487 >> 8 ;  // 9600 Baud ; LSPCLK = 37.5MHz
  182.   SciaRegs.SCILBAUD = 487 & 0x00FF;
  183.   SciaRegs.SCICTL1.all =0x0023;   // Relinquish SCI from Reset
  184. }
  185. //===========================================================================
  186. // End
  187. //===========================================================================