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

DNA

开发平台:

Asm

  1. /*************************************************************************
  2.  *
  3.  *    Used with ICCARM and AARM.
  4.  *
  5.  *    (c) Copyright IAR Systems 2003
  6.  *
  7.  *    File name   : LPC_Timer.c
  8.  *    Description : Define API for Timer system
  9.  *
  10.  *    History :
  11.  *    1. Date: July 08, 2004
  12.  *       Author: Wilson Liu
  13.  *       Description: Create the basic function
  14.  *
  15.  *    2. Date: August 12, 2004
  16.  *       Author: Shawn Zhang
  17.  *       Description: Re-write some API interface
  18.  *
  19.  *    3. Data        : Oct 10, 2004
  20.  *       Author      : Stanimir Bonev
  21.  *       Description : Modify some functions interface
  22.  *
  23.  *    $Revision: 1.1.4.1 $
  24.  **************************************************************************/
  25. #include "LPC_Timer.h"
  26. LPC_Timer_Config_t Timer0Config, Timer1Config;
  27. /*************************************************************************
  28.  * Function Name: TIMER_Init
  29.  * Parameters:  LPC_TimerChanel_t DevNum
  30.  *          unsigned int precision -- the timer precision (Unit: us), general setting is 10 us
  31.  * Return: int
  32.  *              0: success
  33.  *   non-zero: error number
  34.  * Description: Initialize Timer, Set the PR register that represent the precision of timer.
  35.  *
  36.  *************************************************************************/
  37. int TIMER_Init(LPC_TimerChanel_t DevNum, unsigned long precision)
  38. {
  39. int i;
  40.   //all registers are set to 0;
  41.   switch (DevNum)
  42.   {
  43.   case TIMER0:
  44.     // Set globe variable
  45.     Timer0Config.Precision = precision;
  46.     // PR = Precision(us) * Pclk
  47.     if(precision)
  48.     {
  49.       Timer0Config.Prescaler = (precision * SYS_GetFpclk()) / 1000000;
  50.     }
  51.     else
  52.     {
  53.       Timer0Config.Prescaler = 1;
  54.     }
  55.     for (i=0; i<CH_MAXNUM; ++i)
  56.     {
  57.       Timer0Config.MatchCH[i].Enable = false;
  58.       Timer0Config.MatchCH[i].Action = 0;
  59.       Timer0Config.MatchCH[i].TimeValue =0;
  60.       Timer0Config.MatchCH[i].Fnpr = NULL;
  61.       Timer0Config.MatchCH[i].FnprArg = (void *)0;
  62.       Timer0Config.CaptureCH[i].Enable = false;
  63.       Timer0Config.CaptureCH[i].TriggerType= 0;
  64.       Timer0Config.CaptureCH[i].EnableInt = 0;
  65.       Timer0Config.CaptureCH[i].Fnpr = NULL;
  66.       Timer0Config.CaptureCH[i].FnprArg = (void *)0;
  67.       Timer0Config.CaptureCH[i].CPValue= 0;
  68.       Timer0Config.ExtAction[i]= DONOTHING;
  69.       Timer0Config.ExtBitValue[i]= 0;
  70.     }
  71.     // Clear interrupts flags
  72.     T0IR=0xFF;
  73.     // Disable counting
  74.     T0TCR=0;
  75.     // Clear timer counter
  76.     T0TC=0;
  77.     // PR = Presclare - 1
  78.     T0PR= Timer0Config.Prescaler - 1;
  79.     // Clear prescaler timer counter
  80.     T0PC=0;
  81.     // Reset Compare modules
  82.     T0MCR=0;
  83.     T0MR0=0;
  84.     T0MR1=0;
  85.     T0MR2=0;
  86.     T0MR3=0;
  87.     // Reset Capture modules
  88.     T0CCR=0;
  89.     // Reset External Compare module
  90.     T0EMR=0;
  91.     break;
  92.   case TIMER1:
  93.     // Set globe variable
  94.     Timer1Config.Precision = precision;
  95.     // PR = Precision(us) * Pclk
  96.     if(precision)
  97.     {
  98.       Timer1Config.Prescaler = (precision * SYS_GetFpclk()) / 1000000;
  99.     }
  100.     else
  101.     {
  102.       Timer1Config.Prescaler = 1;
  103.     }
  104.     for (i=0; i<CH_MAXNUM; ++i)
  105.     {
  106.       Timer1Config.MatchCH[i].Enable = false;
  107.       Timer1Config.MatchCH[i].Action = 0;
  108.       Timer1Config.MatchCH[i].TimeValue =0;
  109.       Timer1Config.MatchCH[i].Fnpr = NULL;
  110.       Timer1Config.MatchCH[i].FnprArg = (void *)0;
  111.       Timer1Config.CaptureCH[i].Enable = false;
  112.       Timer1Config.CaptureCH[i].TriggerType= 0;
  113.       Timer1Config.CaptureCH[i].EnableInt = 0;
  114.       Timer1Config.CaptureCH[i].Fnpr = NULL;
  115.       Timer1Config.CaptureCH[i].FnprArg = (void *)0;
  116.       Timer1Config.CaptureCH[i].CPValue= 0;
  117.       Timer1Config.ExtAction[i]= DONOTHING;
  118.       Timer1Config.ExtBitValue[i]= 0;
  119.     }
  120.     // Clear interrupts flags
  121.     T1IR=0xFF;
  122.     // Disable counting
  123.     T1TCR=0;
  124.     // Clear timer counter
  125.     T1TC=0;
  126.     // PR = Prescaler - 1
  127.     T1PR=Timer1Config.Prescaler - 1;
  128.     // Clear prescaler timer counter
  129.     T1PC=0;
  130.     // Reset Compare modules
  131.     T1MCR=0;
  132.     T1MR0=0;
  133.     T1MR1=0;
  134.     T1MR2=0;
  135.     T1MR3=0;
  136.     // Reset Capture modules
  137.     T1CCR=0;
  138.     // Reset External Compare module
  139.     T1EMR=0;
  140.     break;
  141.   default:
  142.     return 1;
  143.   }
  144.   return 0;
  145. }
  146. /*************************************************************************
  147.  * Function Name: TIMER_GetPrescaler
  148.  * Parameters:  LPC_TimerChanel_t DevNum
  149.  * Return: unsigned int
  150.  *
  151.  *
  152.  * Description: Return prescaler value
  153.  *
  154.  *
  155.  *************************************************************************/
  156. unsigned long TIMER_GetPrescaler(LPC_TimerChanel_t DevNum)
  157. {
  158.   switch (DevNum)
  159.   {
  160.   case TIMER0:
  161.     return Timer0Config.Prescaler;
  162.   case TIMER1:
  163.     return Timer1Config.Prescaler;
  164.   }
  165.   return 0;
  166. }
  167. /*************************************************************************
  168.  * Function Name: TIMER_Reset
  169.  * Parameters:  LPC_TimerChanel_t DevNum
  170.   * Return: int
  171.  *              0: success
  172.  *       non-zero: error number
  173.  * Description: When next pclk arrives, only the TC and PC will be reset.
  174.  *              Whilst other registers remain.
  175.  *
  176.  *************************************************************************/
  177. int TIMER_Reset(LPC_TimerChanel_t DevNum)
  178. {
  179.   switch (DevNum)
  180.   {
  181.   case TIMER0:
  182.     T0TCR |= 2;
  183.     return 0;
  184.   case TIMER1:
  185.     T1TCR |= 2;
  186.     return 0;
  187.   }
  188.   return 1;
  189. }
  190. /*************************************************************************
  191.  * Function Name: TIMER_Start
  192.  * Parameters:  LPC_TimerChanel_t DevNum
  193.  * Return: int
  194.  *              0: success
  195.  *       non-zero: error number
  196.  * Description: Start Timer or enable the Timer. if the Timer stop now, the Timer will
  197.  *    resume running after calling this function.
  198.  *
  199.  *************************************************************************/
  200. int TIMER_Start(LPC_TimerChanel_t DevNum)
  201. {
  202.   switch (DevNum)
  203.   {
  204.   case TIMER0:
  205.     // Clear reset flag
  206.     T0TCR &= ~2;
  207.     // Counting enable
  208.     T0TCR_bit.CE = true;
  209.     return 0;
  210.   case TIMER1:
  211.     // Clear reset flag
  212.     T1TCR &= ~2;
  213.     // Counting enable
  214.     T1TCR_bit.CE = true;
  215.     return 0;
  216.   }
  217.   return 1;
  218. }
  219. /*************************************************************************
  220.  * Function Name: TIMER_Stop
  221.  * Parameters:  LPC_TimerChanel_t DevNum
  222.  * Return: int
  223.  *              0: success
  224.  *       non-zero: error number
  225.  * Description: Just stop Timer or disable Timer, all registers remain.
  226.  *
  227.  *************************************************************************/
  228. int TIMER_Stop(LPC_TimerChanel_t DevNum)
  229. {
  230.   switch (DevNum)
  231.   {
  232.   case TIMER0:
  233.     T0TCR_bit.CE = false;
  234.     return 0;
  235.   case TIMER1:
  236.     T1TCR_bit.CE = false;
  237.     return 0;
  238.   }
  239.   return 1;
  240. }
  241. /*************************************************************************
  242.  * Function Name: TIMER_GetTimerMatch
  243.  * Parameters:  LPC_TimerChanel_t DevNum,
  244.  *          unsigned int MRNum,
  245.  *          unsigned int * pAction ,
  246.  *          unsigned int * pMatchValue
  247.  * Return: int
  248.  *              0: success
  249.  *   non-zero: error number
  250.  * Description: Get correponding matching information for specific timer.
  251.  *
  252.  *************************************************************************/
  253. int TIMER_GetTimerMatch(LPC_TimerChanel_t DevNum, unsigned int MRNum,
  254.             unsigned int * pAction , unsigned int * pMatchValue)
  255. {
  256.   if (MRNum >= CH_MAXNUM)
  257.     return 1;
  258.   switch(DevNum)
  259.   {
  260.   case TIMER0:
  261.     *pMatchValue = Timer0Config.MatchCH[MRNum].TimeValue;
  262.     *pAction = Timer0Config.MatchCH[MRNum].Action;
  263.     break;
  264.   case TIMER1:
  265.     *pMatchValue = Timer1Config.MatchCH[MRNum].TimeValue;
  266.     *pAction = Timer1Config.MatchCH[MRNum].Action;
  267.     break;
  268.   default:
  269.     return 1;
  270.   }
  271.   return 0;
  272. }
  273. /*************************************************************************
  274.  * Function Name: TIMER_SetMatchAction
  275.  * Parameters:  LPC_TimerChanel_t DevNum -- Device Number
  276.  *    unsigned int MRNum -- Match Channel Number
  277.  *    unsigned int action -- General Interrupt | Reset Timer | Stop Timer
  278.  *    unsigned int Timevalue -- the time value (Unit: us)
  279.  *    void (* Fnpr)(void *) -- ISR function pointer
  280.  *    void * FnprArg -- relative argument
  281.  *    LPC_Timer_ExtAction_t ExtAction -- External Match Control Action
  282.  *
  283.  * Return: int
  284.  *              0: success
  285.  *       non-zero: error number
  286.  * Description: Set correponding matching action and other information to the channel
  287.  *    for specific timer.
  288.  *
  289.  *************************************************************************/
  290. int TIMER_SetMatchAction(LPC_TimerChanel_t DevNum,
  291.                           unsigned int MRNum,
  292.                           unsigned int action ,
  293.                           unsigned long TimeValue,
  294.                           void (* Fnpr)(void *),
  295.                           void * FnprArg,
  296.                           LPC_Timer_ExtAction_t ExtAction)
  297. {
  298.   // Check parameter valid
  299.   if (action>TimerAction_StopTimer+TimerAction_ResetTimer+TimerAction_Interrupt)
  300.     return 1;
  301.   if (ExtAction > TOGGLE)
  302.     return 1;
  303.   switch (DevNum)
  304.   {
  305.   case TIMER0:
  306.     // Set Mash register
  307.     switch (MRNum)
  308.     {
  309.     case CH0:
  310.       T0MR0=TimeValue;
  311.       break;
  312.     case CH1:
  313.       T0MR1=TimeValue;
  314.       break;
  315.     case CH2:
  316.       T0MR2=TimeValue;
  317.       break;
  318.     case CH3:
  319.       T0MR3=TimeValue;
  320.       break;
  321.     default:
  322.       return 1;
  323.     }
  324.     Timer0Config.MatchCH[MRNum].Enable = true;
  325.     Timer0Config.MatchCH[MRNum].Action = action;
  326.     Timer0Config.MatchCH[MRNum].TimeValue= TimeValue;
  327.     Timer0Config.ExtAction[MRNum]= ExtAction;
  328.     // Clear actions
  329.     T0MCR &= ~(7<<(MRNum*3));
  330.     //Set Reset on Match
  331.     if (action & TimerAction_ResetTimer)
  332.       T0MCR |= TimerAction_ResetTimer << (3*MRNum);
  333.     //Set StopWatch on Match
  334.     if (action & TimerAction_StopTimer)
  335.       T0MCR |= TimerAction_StopTimer << (3*MRNum);
  336.     //Set Interrupt on Match
  337.     if (action & TimerAction_Interrupt)
  338.     {
  339.       Timer0Config.MatchCH[MRNum].Fnpr = Fnpr;
  340.       Timer0Config.MatchCH[MRNum].FnprArg = FnprArg;
  341.       T0MCR |= TimerAction_Interrupt << (3*MRNum);
  342.     }
  343.     // Clear External action
  344.     T0EMR &= ~(3 << (4 + 2*MRNum));
  345.     // Set External action
  346.     switch (MRNum)
  347.     {
  348.     case CH0:
  349.       // Set External action type
  350.       T0EMR_bit.EMC0 = ExtAction;
  351.       // Assign pin to match modyle
  352.       if (ExtAction != DONOTHING)
  353.         PINSEL0_bit.P0_3 = 0x2;
  354.       break;
  355.     case CH1:
  356.       // Set External action type
  357.       T0EMR_bit.EMC1 = ExtAction;
  358.       // Assign pin to match modyle
  359.       if (ExtAction != DONOTHING)
  360.         PINSEL0_bit.P0_5 = 0x2;
  361.       break;
  362.     case CH2:
  363.       // Set External action type
  364.       T0EMR_bit.EMC2 = ExtAction;
  365.       // Assign pin to match modyle
  366.       if (ExtAction != DONOTHING)
  367.         PINSEL1_bit.P0_16 = 0x2;
  368.       break;
  369.     case CH3:
  370.       // Set External action type
  371.       T0EMR_bit.EMC3 = ExtAction;
  372.       break;
  373.     }
  374.     return 0;
  375.   case TIMER1:
  376.     // Set Mash register
  377.     switch (MRNum)
  378.     {
  379.     case CH0:
  380.       T1MR0=TimeValue;
  381.       break;
  382.     case CH1:
  383.       T1MR1=TimeValue;
  384.       break;
  385.     case CH2:
  386.       T1MR2=TimeValue;
  387.       break;
  388.     case CH3:
  389.       T1MR3=TimeValue;
  390.       break;
  391.     default:
  392.       return 1;
  393.     }
  394.     Timer1Config.MatchCH[MRNum].Enable = true;
  395.     Timer1Config.MatchCH[MRNum].Action = action;
  396.     Timer1Config.MatchCH[MRNum].TimeValue= TimeValue;
  397.     Timer1Config.ExtAction[MRNum]= ExtAction;
  398.     // Clear actions
  399.     T1MCR &= ~(7<<(MRNum*3));
  400.     //Set Reset on Match
  401.     if (action & TimerAction_ResetTimer)
  402.       T1MCR |= TimerAction_ResetTimer << (3*MRNum);
  403.     //Set StopWatch on Match
  404.     if (action & TimerAction_StopTimer)
  405.       T1MCR |= TimerAction_StopTimer << (3*MRNum);
  406.     //Set Interrupt on Match
  407.     if (action & TimerAction_Interrupt)
  408.     {
  409.       Timer1Config.MatchCH[MRNum].Fnpr = Fnpr;
  410.       Timer1Config.MatchCH[MRNum].FnprArg = FnprArg;
  411.       T1MCR |= TimerAction_Interrupt << (3*MRNum);
  412.     }
  413.     // Clear External action
  414.     T1EMR &= ~(3 << (4 + 2*MRNum));
  415.     // Set External action
  416.     switch (MRNum)
  417.     {
  418.     case CH0:
  419.       // Set External action type
  420.       T1EMR_bit.EMC0 = ExtAction;
  421.       // Assign pin to match modyle
  422.       if (ExtAction != DONOTHING)
  423.         PINSEL0_bit.P0_12 = 0x2;
  424.       break;
  425.     case CH1:
  426.       // Set External action type
  427.       T1EMR_bit.EMC1 = ExtAction;
  428.       // Assign pin to match modyle
  429.       if (ExtAction != DONOTHING)
  430.         PINSEL0_bit.P0_13 = 0x2;
  431.       break;
  432.     case CH2:
  433.       // Set External action type
  434.       T1EMR_bit.EMC2 = ExtAction;
  435.       // Assign pin to match modyle
  436.       if (ExtAction != DONOTHING)
  437.         PINSEL1_bit.P0_19 = 0x2;
  438.       break;
  439.     case CH3:
  440.       // Set External action type
  441.       T0EMR_bit.EMC3 = ExtAction;
  442.       // Assign pin to match modyle
  443.       if (ExtAction != DONOTHING)
  444.         PINSEL1_bit.P0_20 = 0x2;
  445.       break;
  446.     }
  447.     return 0;
  448.   }
  449.   return 1;
  450. }
  451. /*************************************************************************
  452.  * Function Name: TIMER_GetTimerExternalMatch
  453.  * Parameters:  LPC_TimerChanel_t DevNum
  454.  *          unsigned int MRNum,
  455.  *          unsigned int *pAction,
  456.  *          unsigned int *pExternalMatchValue
  457.  * Return: int
  458.  *              0: success
  459.  *   non-zero: error number
  460.  * Description: Get correponding external matching information from specific timer.
  461.  *
  462.  *************************************************************************/
  463. int TIMER_GetTimerExternalMatch(LPC_TimerChanel_t DevNum, unsigned int MRNum,
  464.             unsigned int * pAction , unsigned int *pExternalMatchValue)
  465. {
  466.   if (MRNum >= CH_MAXNUM)
  467.     return 1;
  468.   switch(DevNum)
  469.   {
  470.   case TIMER0:
  471.     *pExternalMatchValue = Timer0Config.ExtAction[MRNum];
  472.     *pAction = Timer0Config.MatchCH[MRNum].Action;
  473.     break;
  474.   case TIMER1:
  475.     *pExternalMatchValue = Timer1Config.ExtAction[MRNum];
  476.     *pAction = Timer1Config.MatchCH[MRNum].Action;
  477.     break;
  478.   default:
  479.     return 1;
  480.   }
  481.   return 0;
  482. }
  483. /*************************************************************************
  484.  * Function Name: TIMER_GetTimerCapture
  485.  * Parameters:  LPC_TimerChanel_t DevNum,
  486.  *    unsigned int CRNum,
  487.  *    unsigned int * pCaptureValue
  488.  * Return: int
  489.  *              0: success
  490.  *   non-zero: error number
  491.  * Description: Get correponding capture information from specific timer.
  492.  *
  493.  *************************************************************************/
  494. int TIMER_GetTimerCapture(LPC_TimerChanel_t DevNum, unsigned int CRNum,
  495.             unsigned int * pCaptureValue)
  496. {
  497.   switch(DevNum)
  498.   {
  499.   case TIMER0:
  500.     if (CRNum >= CPCH_MAXNUM-1)
  501.       return 1;
  502.     *pCaptureValue = Timer0Config.CaptureCH[CRNum].CPValue;
  503.     break;
  504.   case TIMER1:
  505.     if (CRNum >= CPCH_MAXNUM)
  506.       return 1;
  507.     *pCaptureValue = Timer1Config.CaptureCH[CRNum].CPValue;
  508.     break;
  509.   default:
  510.     return 1;
  511.   }
  512.   return 0;
  513. }
  514. /*************************************************************************
  515.  * Function Name: TIMER_SetCaptureAction
  516.  * Parameters:  LPC_TimerChanel_t DevNum  -- Device Number
  517.  *          unsigned char CPCHNum -- Capture Channel Number
  518.  *    unsigned char TriggerType -- Rising edge | Falling edge
  519.  *    bool EnableInt -- whether interrupt is generated
  520.  *    void (* Fnpr)(void *) -- ISR function pointer
  521.  *    void * FnprArg -- relative argument
  522.  *
  523.  * Return: int
  524.  *              0: success
  525.  *   non-zero: error number
  526.  * Description: Set correponding capture trigger type and other information to the channel
  527.  *    for specific timer.
  528.  *
  529.  *************************************************************************/
  530. int TIMER_SetCaptureAction (LPC_TimerChanel_t DevNum,
  531.                               unsigned char CPCHNum,
  532.                               unsigned char  TriggerType,
  533.                               bool EnableInt,
  534.                               void (* Fnpr)(void *),
  535.                               void * FnprArg )
  536. {
  537.   // Check parameter valid
  538.   if (TriggerType > TimerCPTrigger_Rising+TimerCPTrigger_Falling)
  539.     return 1;
  540.   switch (DevNum)
  541.   {
  542.   case TIMER0:
  543.     if (CPCHNum > CPCH_MAXNUM-2)  // for timer 0 cature chanel 3 is not exist
  544.       return 1;
  545.     Timer0Config.CaptureCH[CPCHNum].Enable = true;
  546.     Timer0Config.CaptureCH[CPCHNum].TriggerType = TriggerType;
  547.     // Clear Capture actions
  548.     T0CCR &= ~(7 << (3*CPCHNum));
  549.     // Assign of pin to capture module
  550.     switch (CPCHNum)
  551.     {
  552.     case CH0:
  553.       if (TriggerType == 0)
  554.         PINSEL0_bit.P0_2 = 0;
  555.       else
  556.         PINSEL0_bit.P0_2 = 0x2;
  557.       break;
  558.     case CH1:
  559.       if (TriggerType == 0)
  560.         PINSEL0_bit.P0_4 = 0;
  561.       else
  562.         PINSEL0_bit.P0_4 = 0x2;
  563.       break;
  564.     case CH2:
  565.       if (TriggerType == 0)
  566.         PINSEL0_bit.P0_6 = 0;
  567.       else
  568.         PINSEL0_bit.P0_6 = 0x2;
  569.       break;
  570.     }
  571.     //Set Capture on Rising Edge
  572.     if (TriggerType & TimerCPTrigger_Rising)
  573.       T0CCR |= TimerCPTrigger_Rising << (3*CPCHNum);
  574.     //Set Capture on Falling Edge
  575.     if (TriggerType & TimerCPTrigger_Falling)
  576.       T0CCR |= TimerCPTrigger_Falling << (3*CPCHNum);
  577.     //Set Interrupt on Capture
  578.     if (EnableInt && TriggerType)
  579.     {
  580.       Timer0Config.CaptureCH[CPCHNum].EnableInt = true;
  581.       Timer0Config.CaptureCH[CPCHNum].Fnpr = Fnpr;
  582.       Timer0Config.CaptureCH[CPCHNum].FnprArg = FnprArg;
  583.       T0CCR |= 0x4 << (3*CPCHNum);
  584.     }
  585.     else
  586.     {
  587.       Timer0Config.CaptureCH[CPCHNum].EnableInt = false;
  588.       Timer0Config.CaptureCH[CPCHNum].Fnpr = NULL;
  589.       Timer0Config.CaptureCH[CPCHNum].FnprArg = (void *)0;
  590.     }
  591.     return 0;
  592.   case TIMER1:
  593.     if (CPCHNum > CPCH_MAXNUM-1)
  594.       return 1;
  595.     Timer1Config.CaptureCH[CPCHNum].Enable = true;
  596.     Timer1Config.CaptureCH[CPCHNum].TriggerType = TriggerType;
  597.     // Clear Capture actions
  598.     T1CCR &= ~(7 << (3*CPCHNum));
  599.     // Assign of pin to capture module
  600.     switch (CPCHNum)
  601.     {
  602.     case CH0:
  603.       if (TriggerType == 0)
  604.         PINSEL0_bit.P0_10 = 0;
  605.       else
  606.         PINSEL0_bit.P0_10 = 0x2;
  607.       break;
  608.     case CH1:
  609.       if (TriggerType)
  610.         PINSEL0_bit.P0_11 = 0x2;
  611.       break;
  612.     case CH2:
  613.       if (TriggerType == 0)
  614.         PINSEL1_bit.P0_17 = 0;
  615.       else
  616.         PINSEL1_bit.P0_17 = 0x2;
  617.       break;
  618.     case CH3:
  619.       if (TriggerType == 0)
  620.         PINSEL1_bit.P0_18 = 0;
  621.       else
  622.         PINSEL1_bit.P0_18 = 0x2;
  623.       break;
  624.     }
  625.     //Set Capture on Rising Edge
  626.     if (TriggerType & TimerCPTrigger_Rising)
  627.       T1CCR |= TimerCPTrigger_Rising << (3*CPCHNum);
  628.     //Set Capture on Falling Edge
  629.     if (TriggerType & TimerCPTrigger_Falling)
  630.       T1CCR |= TimerCPTrigger_Falling << (3*CPCHNum);
  631.     //Set Interrupt on Capture
  632.     if (EnableInt && TriggerType)
  633.     {
  634.       Timer1Config.CaptureCH[CPCHNum].EnableInt = true;
  635.       Timer1Config.CaptureCH[CPCHNum].Fnpr = Fnpr;
  636.       Timer1Config.CaptureCH[CPCHNum].FnprArg = FnprArg;
  637.       T1CCR |= 0x4 << (3*CPCHNum);
  638.     }
  639.     else
  640.     {
  641.       Timer1Config.CaptureCH[CPCHNum].EnableInt = false;
  642.       Timer1Config.CaptureCH[CPCHNum].Fnpr = NULL;
  643.       Timer1Config.CaptureCH[CPCHNum].FnprArg = (void *)0;
  644.     }
  645.     return 0;
  646.   }
  647.   return 1;
  648. }
  649. /*************************************************************************
  650.  * Function Name: TIMER_GetREGValue_CR
  651.  * Parameters:  LPC_TimerChanel_t DevNum
  652.  *          int CRNum
  653.  * Return: unsigned long
  654.  *
  655.  * Description: Get CR register value
  656.  *
  657.  *************************************************************************/
  658. unsigned long TIMER_GetREGValue_CR(LPC_TimerChanel_t DevNum, int CRNum)
  659. {
  660.   switch (DevNum)
  661.   {
  662.   case TIMER0:
  663.     switch(CRNum)
  664.     {
  665.     case CPCH0:
  666.       return T0CR0;
  667.     case CPCH1:
  668.       return T0CR1;
  669.     case CPCH2:
  670.       return T0CR2;
  671.     case CPCH3:
  672.       return T0CR3;
  673.     }
  674.   case TIMER1:
  675.     switch(CRNum)
  676.     {
  677.     case CPCH0:
  678.       return T1CR0;
  679.     case CPCH1:
  680.       return T1CR1;
  681.     case CPCH2:
  682.       return T1CR2;
  683.     case CPCH3:
  684.       return T1CR3;
  685.     }
  686.   }
  687.   return (unsigned int)-1;
  688. }
  689. /*************************************************************************
  690.  * Function Name: TIMER_GetREGValue_TC
  691.  * Parameters: LPC_TimerChanel_t DevNum
  692.  * Return: unsigned long
  693.  *
  694.  * Description: Get TC register value
  695.  *
  696.  *************************************************************************/
  697. unsigned long TIMER_GetREGValue_TC(LPC_TimerChanel_t DevNum)
  698. {
  699.   switch (DevNum)
  700.   {
  701.   case TIMER0:
  702.     return T0TC;
  703.   case TIMER1:
  704.     return T1TC;
  705.   }
  706.   return (unsigned int)-1;
  707. }
  708. /*************************************************************************
  709.  * Function Name: TIMER_CheckIntSrc
  710.  * Parameters: LPC_TimerChanel_t DevNum
  711.  * Return: unsigned long
  712.  *  TIMERMR0...3Int | TIMERCR0...3Int
  713.  *
  714.  * Description: Get Timer interrupt Type
  715.  *
  716.  *************************************************************************/
  717. unsigned long TIMER_CheckIntType(LPC_TimerChanel_t DevNum)
  718. {
  719.   switch (DevNum)
  720.   {
  721.   case TIMER0:
  722.     return (T0IR & 0xFF);
  723.   case TIMER1:
  724.     return (T1IR & 0xFF);
  725.   default:
  726.     return (unsigned long)-1;
  727.   }
  728. }
  729. /*************************************************************************
  730.  * Function Name: RTC_ClearInt
  731.  * Parameters:  LPC_TimerChanel_t DevNum
  732.  *          int IntType
  733.  *
  734.  * Return: unsigned long
  735.  *              0: sucess
  736.  *    1: fail
  737.  *
  738.  * Description: Clear Timer interrupt.
  739.  *
  740.  *************************************************************************/
  741. unsigned long TIMER_ClearInt(LPC_TimerChanel_t DevNum, int IntType)
  742. {
  743.   if (IntType<1 || IntType>0xFF)
  744.     return 1;
  745.   switch (DevNum)
  746.   {
  747.   case TIMER0:
  748.     T0IR = (IntType & 0xFF);
  749.     break;
  750.   case TIMER1:
  751.     T1IR = (IntType & 0xFF);
  752.     break;
  753.   default:
  754.     return 1;
  755.   }
  756.   return 0;
  757. }
  758. /*************************************************************************
  759.  * Function Name: T0ISR
  760.  * Parameters: void
  761.  * Return: void
  762.  *
  763.  * Description: TIMER0 interrupt subroutine
  764.  *
  765.  *************************************************************************/
  766. void TIMER0_ISR ()
  767. {
  768. int IntStatus;
  769.   IntStatus = TIMER_CheckIntType(TIMER0);
  770.   TIMER_ClearInt(TIMER0, IntStatus);
  771.   /* Match Register Interrupt */
  772.   if (IntStatus & TIMERMR0Int)
  773.   {
  774.     (Timer0Config.MatchCH[0].Fnpr)((void *)Timer0Config.MatchCH[0].FnprArg);
  775.   }
  776.   if (IntStatus & TIMERMR1Int)
  777.   {
  778.     (Timer0Config.MatchCH[1].Fnpr)((void *)Timer0Config.MatchCH[1].FnprArg);
  779.   }
  780.   if (IntStatus & TIMERMR2Int)
  781.   {
  782.     (Timer0Config.MatchCH[2].Fnpr)((void *)Timer0Config.MatchCH[2].FnprArg);
  783.   }
  784.   if (IntStatus & TIMERMR3Int)
  785.   {
  786.     (Timer0Config.MatchCH[3].Fnpr)((void *)Timer0Config.MatchCH[3].FnprArg);
  787.   }
  788.   /* Capture Register Interrupt */
  789.   if (IntStatus & TIMERCR0Int)
  790.   {
  791.     Timer0Config.CaptureCH[0].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH0);
  792.     (Timer0Config.CaptureCH[0].Fnpr)((void *)Timer0Config.CaptureCH[0].FnprArg);
  793.   }
  794.   if (IntStatus & TIMERCR1Int)
  795.   {
  796.     Timer0Config.CaptureCH[1].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH1);
  797.     (Timer0Config.CaptureCH[1].Fnpr)((void *)Timer0Config.CaptureCH[1].FnprArg);
  798.   }
  799.   if (IntStatus & TIMERCR2Int)
  800.   {
  801.     Timer0Config.CaptureCH[2].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH2);
  802.     (Timer0Config.CaptureCH[2].Fnpr)((void *)Timer0Config.CaptureCH[2].FnprArg);
  803.   }
  804.   if (IntStatus & TIMERCR3Int)
  805.   {
  806.     Timer0Config.CaptureCH[3].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH3);
  807.     (Timer0Config.CaptureCH[3].Fnpr)((void *)Timer0Config.CaptureCH[3].FnprArg);
  808.   }
  809.   VICVectAddr = 0;    // Clear interrupt in VIC.
  810. }
  811. /*************************************************************************
  812.  * Function Name: T1ISR
  813.  * Parameters: void
  814.  * Return: void
  815.  *
  816.  * Description: TIMER1 interrupt subroutine
  817.  *
  818.  *************************************************************************/
  819. void TIMER1_ISR ()
  820. {
  821.   int IntStatus;
  822.   IntStatus = TIMER_CheckIntType(TIMER1);
  823.   TIMER_ClearInt(TIMER1, IntStatus);
  824.   /* Match Register Interrupt */
  825.   if (IntStatus & TIMERMR0Int)
  826.   {
  827.     (Timer1Config.MatchCH[0].Fnpr)((void *)Timer1Config.MatchCH[0].FnprArg);
  828.   }
  829.   if (IntStatus & TIMERMR1Int)
  830.   {
  831.     (Timer1Config.MatchCH[1].Fnpr)((void *)Timer1Config.MatchCH[1].FnprArg);
  832.   }
  833.   if (IntStatus & TIMERMR2Int)
  834.   {
  835.     (Timer1Config.MatchCH[2].Fnpr)((void *)Timer1Config.MatchCH[2].FnprArg);
  836.   }
  837.   if (IntStatus & TIMERMR3Int)
  838.   {
  839.     (Timer1Config.MatchCH[3].Fnpr)((void *)Timer1Config.MatchCH[3].FnprArg);
  840.   }
  841.   /* Capture Register Interrupt */
  842.   if (IntStatus & TIMERCR0Int)
  843.   {
  844.     Timer1Config.CaptureCH[0].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH0);
  845.     (Timer1Config.CaptureCH[0].Fnpr)((void *)Timer1Config.CaptureCH[0].FnprArg);
  846.   }
  847.   if (IntStatus & TIMERCR1Int)
  848.   {
  849.     Timer1Config.CaptureCH[1].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH1);
  850.     (Timer1Config.CaptureCH[1].Fnpr)((void *)Timer1Config.CaptureCH[1].FnprArg);
  851.   }
  852.   if (IntStatus & TIMERCR2Int)
  853.   {
  854.     Timer1Config.CaptureCH[2].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH2);
  855.     (Timer1Config.CaptureCH[2].Fnpr)((void *)Timer1Config.CaptureCH[2].FnprArg);
  856.   }
  857.   if (IntStatus & TIMERCR3Int)
  858.   {
  859.     Timer1Config.CaptureCH[3].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH3);
  860.     (Timer1Config.CaptureCH[3].Fnpr)((void *)Timer1Config.CaptureCH[3].FnprArg);
  861.   }
  862.   VICVectAddr = 0;    // Clear interrupt in VIC.
  863. }