Timer0_IntOnMR0.c
上传用户:sourcesun
上传日期:2013-09-23
资源大小:362k
文件大小:4k
源码类别:

DNA

开发平台:

Asm

  1. /******************************************************************************
  2. Minimal code for setting up Timer0 to interrupt on compare match on channel 0
  3. to interrupt at 100Hz
  4. XTALFREQ 12000000         //XTAL frequency in Hz
  5. PCLKFREQ (XTALFREQ/4)     //pclk must always be XTALFREQ/4?
  6. Open terminal I/O window in debugger using View/Terminal I/O in C-SPY to see
  7. VICVectAddr value in exception handler. This is not routed to the serial port
  8. because UARTx is not configured and no implementation of putchar()
  9. ******************************************************************************/
  10. #include <iolpc2148.h>
  11. #include <stdio.h>
  12. #include <intrinsics.h>
  13. #define XTALFREQ 12000000         //XTAL frequency in Hz
  14. #define PCLKFREQ (XTALFREQ/4)     //pclk must always be XTALFREQ/4?
  15. #define TICKS_PER_SECOND 100      // TIMER0 interrupt is 100Hz
  16. #define FALSE 0
  17. #define TRUE !(FALSE)
  18. void feed (void);
  19. void main(void);
  20. #pragma vector=0x18
  21. __irq __arm void IRQ_ISR_Handler (void);
  22. void MM_TIMER0_ISR();
  23. unsigned int bl_TimerFlag;
  24. void main(void)
  25. {
  26.   bl_TimerFlag = 0;  // No background tasks performed yet
  27.   MEMMAP = 2 ;       // Must set this way when executing code out of RAM
  28.   /* Init MCU Clock */
  29.   /* Fosc = 12MHz, Fpckl = 12MHz */
  30.   PLLCON_bit.PLLC = PLLCON_bit.PLLE = 0; // Disable and disconnect PLL
  31.   feed();                                // PLL feed sequence
  32.   /* Init Peripherial divider Pckl = Clk/4 */
  33.   VPBDIV_bit.VPBDIV = 0;
  34.   T0IR=0xFF;           // reset match and capture event interrupts
  35.   T0TC=0;              // Clear timer counter
  36.   T0PR= 0;             // No Prescalar
  37.   T0MR0=PCLKFREQ/100;  // Count up to 36,864 for 100Hz interrupt, period = 10ms
  38.   T0MCR = 3;           // Reset Timer Counter & Interrupt on match
  39.   T0TCR = 1;           // Counting enable
  40.   VICIntSelect  =  0;             // Set all VIC interrupts to IRQ for now
  41.   VICIntEnClear = 0xFFFFFFFF;     // Diasable all interrupts
  42.   VICProtection = 0;              // VIC registers can be accessed in User or
  43.                                   // privileged mode
  44.   VICVectAddr = 0;                // Clear interrupt
  45.   VICProtection = 0;              // Accesss VIC in USR | PROTECT
  46.   VICIntSelect &= ~(1<<VIC_TIMER0);            // Timer 0 intrpt is an IRQ (VIC_TIMER0 = 4)
  47.   VICVectAddr0 = (unsigned int)&MM_TIMER0_ISR; // Install ISR in VIC addr slot 0
  48.   VICVectCntl0 = 0x20 | VIC_TIMER0;            // IRQ type, TIMER 0 int enabled
  49.   VICIntEnable |= (1<<VIC_TIMER0);             // Turn on Timer0 Interrupt
  50.   __enable_interrupt();                         // Global interrupt enable
  51.   while(TRUE)                  // Foreground "task"
  52.   {
  53.     if(bl_TimerFlag)
  54.     {
  55.       bl_TimerFlag = FALSE;    // Clear this flag if set by MM_TIMER0_ISR
  56.     }
  57.   } // end foreground loop
  58. }   // end main()
  59. /******************************************************************************
  60.  * Function Name: IRQ_ISR_Handler
  61.  * Parameters: void
  62.  * Return: void
  63.  *
  64.  * Description: IRQ exception handler, this will call appropriate isr after
  65.  * reading value out of VICVectAddr
  66. * Note: This is ARM mode code - full 32 bit code
  67.  *****************************************************************************/
  68. #pragma vector=0x18
  69. __irq __arm void IRQ_ISR_Handler (void)
  70. {
  71.   void (*interrupt_function)();
  72.   unsigned int vector;
  73.   static unsigned int us_count;
  74.   us_count++;
  75.   vector = VICVectAddr;                   // Get interrupt vector.
  76.   if(us_count == 100)
  77.   {
  78.     printf("VICVectAddr = %8xn",vector); // print VICVectAddr @ 1Hz
  79.     us_count = 0;
  80.   }
  81.   interrupt_function = (void(*)())vector; // Call MM_TIMER0_ISR thru pointer
  82.   (*interrupt_function)();  // Call vectored interrupt function
  83.   VICVectAddr = 0;          // Clear interrupt in VIC
  84. }
  85. void MM_TIMER0_ISR()
  86. {
  87.   static unsigned int us_Ticks;
  88.   us_Ticks++;
  89.   if(us_Ticks == TICKS_PER_SECOND)
  90.   {
  91.     bl_TimerFlag = TRUE;        // The background "task"
  92.     us_Ticks = 0;
  93.   }
  94.   T0IR = 1;                     // Clear timer interrupt
  95. }
  96. // Feed sequence for the PLL
  97. void feed (void)
  98. {
  99.   PLLFEED=0xAA;
  100.   PLLFEED=0x55;
  101. }