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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:   DSP28_281xFlash.c
  4. //
  5. // TITLE:  DSP281x Flash example.
  6. //
  7. // ASSUMPTIONS:
  8. //
  9. //          This program requires the DSP281x V1.00 header files.  
  10. //          As supplied, this project is configured for "boot to Flash" operation.   
  11. //
  12. //          This example runs the EV Timer Period example from the 
  13. //          Flash.  
  14. //
  15. //          1) Build the project
  16. //          2) Flash the .out file into the device.  This program will fit on 
  17. //             an F2812 or an F2810
  18. //          3) Set the hardware jumpers to boot to Flash 
  19. //          4) Use the included GEL file to load the project, symbols 
  20. //             defined within the project and the variables into the watch
  21. //             window.   
  22. //
  23. //          Steps that were taken to convert the EV example from RAM 
  24. //          to Flash execution:
  25. //
  26. //          - Change the linker cmd file to reflect the flash memory map.
  27. //            This example uses the DSP281x F2812.cmd file.
  28. //          - Make sure any initialized sections are mapped to Flash.  
  29. //            In SDFlash utility this can be checked by the View->Coff/Hex
  30. //            status utility. Any section marked as "load" should be
  31. //            allocated to Flash.
  32. //          - Make sure there is a branch instruction from the entry to Flash
  33. //            at 0x3F7FF6 to the beginning of code execution. This example
  34. //            uses the DSP281x_CodeStartBranch.asm file to accomplish this.
  35. //          - Set boot mode Jumpers to "boot to Flash"
  36. //          - For best performance from the flash, modify the waitstates
  37. //            and enable the flash pipeline as shown in this example.
  38. //            Note: any code that manipulates the flash waitstate and pipeline
  39. //            control must be run from RAM. Thus these functions are located
  40. //            in their own memory section called ramfuncs.
  41. // 
  42. // DESCRIPTION:
  43. //
  44. //          This program sets up EVA Timer 1, EVA Timer 2, EVB Timer 3
  45. //          and EVB Timer 4 to fire an interrupt on a period overflow.  
  46. //          A count is kept each time each interrupt passes through
  47. //          the interrupt service routine. 
  48. //
  49. //          EVA Timer 1 has the shortest period while EVB Timer4 has the
  50. //          longest period.
  51. //
  52. //          ISR Locations:
  53. //                eva_timer1_isr  executed from RAM, puts flash in sleep mode
  54. //                eva_timer2_isr  executed from RAM, puts flash in standby mode
  55. //                evb_timer3_isr  executed from RAM, puts flash in sleep mode
  56. //                                              and later moves it to standby
  57. //                evb_timer4_isr  executed from FLASH
  58. //        
  59. //          Watch Variables:
  60. //
  61. //                EvaTimer1InterruptCount;
  62. //                EvaTimer2InterruptCount;
  63. //                EvbTimer3InterruptCount;
  64. //                EvbTimer4InterruptCount;
  65. //
  66. //###########################################################################
  67. //
  68. //  Ver | dd mmm yyyy | Who  | Description of changes
  69. // =====|=============|======|===============================================
  70. //  1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha)
  71. //      |             |      | Updated comments with info on converting
  72. //      |             |      |   a project to flash.
  73. //      |             |      | Changed the method for copying code from
  74. //      |             |      |    XINTF to internal RAM via the MemCopy
  75. //      |             |      |    function and symbols created by the 
  76. //      |             |      |    linker.
  77. //###########################################################################
  78. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  79. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  80. // Functions that will be run from RAM need to be assigned to 
  81. // a different section.  This section will then be mapped using
  82. // the linker cmd file.
  83. #pragma CODE_SECTION(eva_timer1_isr, "ramfuncs");
  84. #pragma CODE_SECTION(eva_timer2_isr, "ramfuncs");
  85. #pragma CODE_SECTION(evb_timer3_isr, "ramfuncs");
  86. // Prototype statements for functions found within this file.
  87. interrupt void eva_timer1_isr(void);
  88. interrupt void eva_timer2_isr(void);
  89. interrupt void evb_timer3_isr(void);
  90. interrupt void evb_timer4_isr(void);
  91. void init_eva_timer1(void);
  92. void init_eva_timer2(void);
  93. void init_evb_timer3(void);
  94. void init_evb_timer4(void);
  95. // Global variables used in this example
  96. Uint32 EvaTimer1InterruptCount;
  97. Uint32 EvaTimer2InterruptCount;
  98. Uint32 EvbTimer3InterruptCount;
  99. Uint32 EvbTimer4InterruptCount;
  100. Uint32 LoopCount;
  101. // These are defined by the linker (see F2812.cmd)
  102. extern Uint16 RamfuncsLoadStart;
  103. extern Uint16 RamfuncsLoadEnd;
  104. extern Uint16 RamfuncsRunStart;
  105. void main(void)
  106. {
  107. // Step 1. Initialize System Control:
  108. // PLL, WatchDog, enable Peripheral Clocks
  109. // This example function is found in the DSP281x_SysCtrl.c file.
  110.    InitSysCtrl();
  111.    
  112. // Step 2. Initalize GPIO: 
  113. // This example function is found in the DSP281x_Gpio.c file and
  114. // illustrates how to set the GPIO to it's default state.
  115. // InitGpio();  // Skipped for this example  
  116. // Step 3. Clear all interrupts and initialize PIE vector table:
  117. // Disable CPU interrupts 
  118.    DINT;
  119. // Initialize PIE control registers to their default state.
  120. // The default state is all PIE interrupts disabled and flags
  121. // are cleared.  
  122. // This function is found in the DSP281x_PieCtrl.c file.
  123.    InitPieCtrl();
  124. // Disable CPU interrupts and clear all CPU interrupt flags:
  125.    IER = 0x0000;
  126.    IFR = 0x0000;
  127. // Initialize the PIE vector table with pointers to the shell Interrupt 
  128. // Service Routines (ISR).  
  129. // This will populate the entire table, even if the interrupt
  130. // is not used in this example.  This is useful for debug purposes.
  131. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  132. // This function is found in DSP281x_PieVect.c.
  133.    InitPieVectTable();
  134. // Interrupts that are used in this example are re-mapped to
  135. // ISR functions found within this file.  
  136.    EALLOW;  // This is needed to write to EALLOW protected registers
  137.    PieVectTable.T1PINT = &eva_timer1_isr;
  138.    PieVectTable.T2PINT = &eva_timer2_isr;
  139.    PieVectTable.T3PINT = &evb_timer3_isr;
  140.    PieVectTable.T4PINT = &evb_timer4_isr;
  141.    EDIS;   // This is needed to disable write to EALLOW protected registers
  142. // Step 4. Initialize all the Device Peripherals:
  143. // This function is found in DSP281x_InitPeripherals.c
  144. // InitPeripherals(); // Not required for this example
  145.    init_eva_timer1();
  146.    init_eva_timer2();
  147.    init_evb_timer3();
  148.    init_evb_timer4();
  149.      
  150. // Step 5. User specific code, enable interrupts:
  151. // Copy time critical code and Flash setup code to RAM
  152. // This includes the following ISR functions: EvaTimer1(), EvaTimer2()
  153. // EvbTimer3 and and InitFlash();
  154. // The  RamfuncsLoadStart, RamfuncsLoadEnd, and RamfuncsRunStart
  155. // symbols are created by the linker. Refer to the F2812.cmd file. 
  156.    MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
  157. // Call Flash Initialization to setup flash waitstates
  158. // This function must reside in RAM
  159.    InitFlash();
  160.    // Initialize count values to 0
  161.    EvaTimer1InterruptCount = 0;
  162.    EvaTimer2InterruptCount = 0;
  163.    EvbTimer3InterruptCount = 0;
  164.    EvbTimer4InterruptCount = 0;
  165.    LoopCount = 0;
  166.  
  167.    // Enable PIE group 2 interrupt 4 for T1PINT
  168.    PieCtrlRegs.PIEIER2.all = M_INT4;
  169.    // Enable PIE group 3 interrupt 1 for T2PINT
  170.    PieCtrlRegs.PIEIER3.all = M_INT1;    
  171.    // Enable PIE group 4 interrupt 4 for T3PINT
  172.    PieCtrlRegs.PIEIER4.all = M_INT4;
  173.    // Enable PIE group 5 interrupt 1 for T4PINT
  174.    PieCtrlRegs.PIEIER5.all = M_INT1;
  175.    // Enable CPU INT2 for T1PINT, INT3 for T2PINT, INT4 for T3PINT
  176.    // and INT5 for T4PINT:
  177.    IER |= (M_INT2 | M_INT3 | M_INT4 | M_INT5);
  178.    // Enable global Interrupts and higher priority real-time debug events:
  179.    EINT;   // Enable Global interrupt INTM
  180.    ERTM;   // Enable Global realtime interrupt DBGM
  181. // Step 6. IDLE loop. Just sit and loop forever:
  182.    while(1)
  183.    {
  184.        LoopCount++;
  185.    }
  186.  
  187. void init_eva_timer1(void)
  188. {
  189.     // Initialize EVA Timer 1:
  190.     // Setup Timer 1 Registers (EV A)
  191.     EvaRegs.GPTCONA.all = 0;
  192.    
  193.     // Set the Period for the GP timer 1 to 0x0200;
  194.     EvaRegs.T1PR = 0x0200;       // Period
  195.     EvaRegs.T1CMPR = 0x0000;     // Compare Reg
  196.    
  197.     // Enable Period interrupt bits for GP timer 1
  198.     // Count up, x128, internal clk, enable compare, use own period
  199.     EvaRegs.EVAIMRA.bit.T1PINT = 1;
  200.     EvaRegs.EVAIFRA.bit.T1PINT = 1;
  201.     // Clear the counter for GP timer 1
  202.     EvaRegs.T1CNT = 0x0000;
  203.     EvaRegs.T1CON.all = 0x1742;
  204.     // Start EVA ADC Conversion on timer 1 Period interrupt
  205.     EvaRegs.GPTCONA.bit.T1TOADC = 2;
  206. }
  207. void init_eva_timer2(void)
  208. {
  209.     // Initialize EVA Timer 2:
  210.     // Setup Timer 2 Registers (EV A)
  211.     EvaRegs.GPTCONA.all = 0;
  212.    
  213.     // Set the Period for the GP timer 2 to 0x0200;
  214.     EvaRegs.T2PR = 0x0400;       // Period
  215.     EvaRegs.T2CMPR = 0x0000;     // Compare Reg
  216.    
  217.     // Enable Period interrupt bits for GP timer 2
  218.     // Count up, x128, internal clk, enable compare, use own period
  219.     EvaRegs.EVAIMRB.bit.T2PINT = 1;
  220.     EvaRegs.EVAIFRB.bit.T2PINT = 1;
  221.     // Clear the counter for GP timer 2
  222.     EvaRegs.T2CNT = 0x0000;
  223.     EvaRegs.T2CON.all = 0x1742;
  224.     // Start EVA ADC Conversion on timer 2 Period interrupt
  225.     EvaRegs.GPTCONA.bit.T2TOADC = 2;
  226. }
  227. void init_evb_timer3(void)
  228. {
  229.     // Initialize EVB Timer 3:
  230.     // Setup Timer 3 Registers (EV B)
  231.     EvbRegs.GPTCONB.all = 0;
  232.    
  233.     // Set the Period for the GP timer 3 to 0x0200;
  234.     EvbRegs.T3PR = 0x0800;       // Period
  235.     EvbRegs.T3CMPR = 0x0000;     // Compare Reg
  236.    
  237.     // Enable Period interrupt bits for GP timer 3
  238.     // Count up, x128, internal clk, enable compare, use own period
  239.     EvbRegs.EVBIMRA.bit.T3PINT = 1;
  240.     EvbRegs.EVBIFRA.bit.T3PINT = 1;
  241.     // Clear the counter for GP timer 3
  242.     EvbRegs.T3CNT = 0x0000;
  243.     EvbRegs.T3CON.all = 0x1742;
  244.     // Start EVA ADC Conversion on timer 3 Period interrupt
  245.     EvbRegs.GPTCONB.bit.T3TOADC = 2;
  246. }
  247. void init_evb_timer4(void)
  248. {
  249.     // Initialize EVB Timer 4:
  250.     // Setup Timer 4 Registers (EV B)
  251.     EvbRegs.GPTCONB.all = 0;
  252.    
  253.     // Set the Period for the GP timer 4 to 0x0200;
  254.     EvbRegs.T4PR = 0x1000;       // Period
  255.     EvbRegs.T4CMPR = 0x0000;     // Compare Reg
  256.    
  257.     // Enable Period interrupt bits for GP timer 4
  258.     // Count up, x128, internal clk, enable compare, use own period
  259.     EvbRegs.EVBIMRB.bit.T4PINT = 1;
  260.     EvbRegs.EVBIFRB.bit.T4PINT = 1;
  261.     // Clear the counter for GP timer 4
  262.     EvbRegs.T4CNT = 0x0000;
  263.     EvbRegs.T4CON.all = 0x1742;
  264.     // Start EVA ADC Conversion on timer 4 Period interrupt
  265.     EvbRegs.GPTCONB.bit.T4TOADC = 2;
  266.  
  267. // This ISR MUST be executed from RAM as it will put the Flash into Sleep
  268. interrupt void eva_timer1_isr(void)
  269. {
  270.     Uint16 i;
  271.     // Put the Flash to sleep
  272.     FlashRegs.FPWR.bit.PWR = FLASH_SLEEP; 
  273.     
  274.     EvaTimer1InterruptCount++;
  275.     // Short Delay to simulate some ISR Code
  276.     for(i = 1; i < 0x03FF; i++) {}
  277.     // Enable more interrupts from this timer
  278.     EvaRegs.EVAIMRA.bit.T1PINT = 1;
  279.     // Note: To be safe, use a mask value to write to the entire
  280.     // EVAIFRA register.  Writing to one bit will cause a read-modify-write
  281.     // operation that may have the result of writing 1's to clear 
  282.     // bits other then those intended. 
  283.     EvaRegs.EVAIFRA.all = BIT7;
  284.     // Acknowledge interrupt to receive more interrupts from PIE group 2
  285.     PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
  286. }
  287. // This ISR MUST be executed from RAM as it will put the Flash into Standby
  288. interrupt void eva_timer2_isr(void)
  289. {
  290.     Uint16 i;
  291.     // Put the Flash into standby
  292.     FlashRegs.FPWR.bit.PWR = FLASH_STANDBY; 
  293.     EvaTimer2InterruptCount++;
  294.     // Short Delay to simulate some ISR Code
  295.     for(i = 1; i < 0x02FF; i++) {}
  296.     // Enable more interrupts from this timer
  297.     EvaRegs.EVAIMRB.bit.T2PINT = 1;
  298.    // Note: To be safe, use a mask value to write to the entire
  299.    // EVAIFRB register.  Writing to one bit will cause a read-modify-write
  300.    // operation that may have the result of writing 1's to clear 
  301.    // bits other then those intended. 
  302.    EvaRegs.EVAIFRB.all = BIT0;
  303.    // Acknowledge interrupt to recieve more interrupts from PIE group 3
  304.    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
  305. }
  306. // This ISR MUST be executed from RAM as it will put the Flash to sleep
  307. // and then later move it to Standby
  308. interrupt void evb_timer3_isr(void)
  309. {
  310.     Uint16 i;
  311.     // Put the Flash to sleep
  312.     FlashRegs.FPWR.bit.PWR = FLASH_SLEEP; 
  313.     EvbTimer3InterruptCount++;
  314.     // Short Delay to simulate some ISR Code
  315.     for(i = 1; i < 0x01FF; i++) {}
  316.     // Sometime later, move the Flash to standby
  317.     FlashRegs.FPWR.bit.PWR = FLASH_STANDBY; 
  318.     // Note: To be safe, use a mask value to write to the entire
  319.     // EVBIFRA register.  Writing to one bit will cause a read-modify-write
  320.     // operation that may have the result of writing 1's to clear 
  321.     // bits other then those intended. 
  322.     EvbRegs.EVBIFRA.all = BIT7;
  323.     // Acknowledge interrupt to receive more interrupts from PIE group 4
  324.     PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
  325. }
  326. // This ISR will be executed out of Flash 
  327. interrupt void evb_timer4_isr(void)
  328. {
  329.     Uint16 i;
  330.     
  331.     EvbTimer4InterruptCount++;
  332.     // Short Delay to simulate some ISR Code
  333.     for(i = 1; i < 0x00FF; i++) {}
  334.  
  335.     // Note: To be safe, use a mask value to write to the entire
  336.     // EVBIFRB register.  Writing to one bit will cause a read-modify-write
  337.     // operation that may have the result of writing 1's to clear 
  338.     // bits other then those intended. 
  339.     EvbRegs.EVBIFRB.all = BIT0;
  340.     // Acknowledge interrupt to recieve more interrupts from PIE group 5
  341.     PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
  342. }
  343. //===========================================================================
  344. // No more.
  345. //===========================================================================