tim.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:8k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : tim.c
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 09/08/2003
  5. * Description        : This file provides all the TIM software functions
  6. ********************************************************************************
  7. * History:
  8. *  01/01/2004 : V1.2
  9. *  14/07/2004 : V1.3
  10. *******************************************************************************/
  11. #include "tim.h"
  12. /*******************************************************************************
  13. * Function Name  : TIM_Init
  14. * Description    : This routine is used to Initialize the TIM peripheral
  15. * Input          : TIM Timer to Initialize
  16. * Return         : None
  17. *******************************************************************************/
  18. void TIM_Init( TIM_TypeDef *TIMx )
  19. {
  20.   TIMx->CR1 = 0x0000;
  21.   TIMx->CR2 = 0x0000;
  22.   TIMx->SR  = 0x0000;
  23. }
  24. /*******************************************************************************
  25. * Function Name  : TIM_ICAPModeConfig
  26. * Description    : This routine is used to configure the input capture feature
  27. * Input          : (1) TIM Timer
  28. *                : (2) Input Capture Channel ( Channel_A or Channel_B )
  29. *                : (3) Active Edge : Rising edge or Falling edge.
  30. * Output         : None
  31. *******************************************************************************/
  32. void TIM_ICAPModeConfig ( TIM_TypeDef  *TIMx,
  33.                           TIM_Channels Xchannel,
  34.                           TIM_Clock_Edges  Xedge )
  35. {
  36.   switch (Xchannel)
  37.   {
  38.     case TIM_CHANNEL_A :
  39.       if (Xedge == TIM_RISING) TIMx->CR1 |= TIM_IEDGA_Mask; else TIMx->CR1 &= ~TIM_IEDGA_Mask;
  40.       break;
  41.     case TIM_CHANNEL_B :
  42.       if (Xedge == TIM_RISING) TIMx->CR1 |= TIM_IEDGB_Mask; else TIMx->CR1 &= ~TIM_IEDGB_Mask;
  43.       break;
  44.   }
  45. }
  46. /*******************************************************************************
  47. * Function Name  : TIM_OCMPModeConfig
  48. * Description    : This routine is used to configure the output compare feature
  49. * Input          : (1) TIM Timer
  50. *                : (2) OCMP Channel ( Channel_A or Channel_B )
  51. *                : (3) Pulse Length
  52. *                : (4) OC_Mode     : output wave, or only timing.
  53. *                : (5) Level       : Rising edge or Falling edge after the ==
  54. * Output         : None
  55. *******************************************************************************/
  56. void TIM_OCMPModeConfig (  TIM_TypeDef  *TIMx,
  57.                            TIM_Channels Xchannel,
  58.                            u16          XpulseLength,
  59.                            TIM_OC_Modes     Xmode,
  60.                            TIM_Logic_Levels Xlevel )
  61. {
  62.   u16 Tmp1 = 0x0000;
  63.   u16 Tmp2 = TIMx->CR2;
  64.   TIMx->CR2 = 0x0000;
  65.   // Start The TIM Counter
  66.   TIMx->CR1  = TIM_EN_Mask;
  67.   // Update the CR2 Register
  68.   TIMx->CR2  = Tmp2;
  69.   switch ( Xmode )
  70.   {
  71.     case TIM_TIMING :
  72.       // Output Compare Used only for Internal Timing Operation
  73.       Tmp1 = Xchannel == TIM_CHANNEL_A ? Tmp1 & ~TIM_OCAE_Mask : Tmp1 & ~TIM_OCBE_Mask;
  74.       break;
  75.     case TIM_WAVE :
  76.       // Output Compare Used for external wave generation
  77.       Tmp1 = Xchannel == TIM_CHANNEL_A ? TIM_OCAE_Mask : TIM_OCBE_Mask;
  78.       if ( Xlevel == TIM_HIGH )
  79.         Tmp1 = Xchannel == TIM_CHANNEL_A ? Tmp1 | TIM_OLVLA_Mask  : Tmp1 | TIM_OLVLB_Mask;
  80.       else
  81.         Tmp1 = Xchannel == TIM_CHANNEL_A ? Tmp1 & ~TIM_OLVLA_Mask : Tmp1 & ~TIM_OLVLB_Mask;
  82.       break;
  83.   }
  84.   if ( Xchannel == TIM_CHANNEL_A )
  85.     TIMx->OCAR = ( XpulseLength - 5 );
  86.   else
  87.     TIMx->OCBR = ( XpulseLength - 5 );
  88.     TIMx->CNTR = 0x0000;
  89.     TIMx->CR1 |= Tmp1;
  90. }
  91. /*******************************************************************************
  92. * Function Name  : TIM_OPModeConfig
  93. * Description    : This routine is used to configure the one pulse mode
  94. * Input          : (1) TIM Timer
  95. *                : (3) XpulseLength      : Length of the pulse
  96. *                : (4) Level1            : Level during the pulse
  97. *                : (5) Level2            : Level after the pulse
  98. *                : (6) Activation Edge   : High or Low on ICAP A
  99. * Output         : None
  100. *******************************************************************************/
  101. void TIM_OPModeConfig ( TIM_TypeDef      *TIMx,
  102.                         u16              XpulseLength,
  103.                         TIM_Logic_Levels XLevel1,
  104.                         TIM_Logic_Levels XLevel2,
  105.                         TIM_Clock_Edges  Xedge )
  106. {
  107.   u16 Tmp = 0;
  108.   // Set the Level During the pulse
  109.   if (XLevel1 == TIM_HIGH) Tmp |= TIM_OLVLB_Mask;
  110.   // Set the Level after After the pulse
  111.   if (XLevel2 == TIM_HIGH) Tmp |= TIM_OLVLA_Mask;
  112.   // Set the Activation Edge on the INCAP 1
  113.   if (Xedge == TIM_RISING) Tmp |= TIM_IEDGA_Mask;
  114.   // Set the Output Compare Function
  115.   Tmp |= TIM_OCAE_Mask;
  116.   // Set the One pulse mode
  117.   Tmp |= TIM_OMP_Mask;
  118.   // Update the CR1 register Value
  119.   TIMx->CR1 = Tmp;
  120.   // Set the Pulse length
  121.   TIMx->OCAR = XpulseLength;
  122. }
  123. /*******************************************************************************
  124. * Function Name  : TIM_PWMOModeConfig
  125. * Description    : This routine is used to configure the PWM in output mode
  126. * Input          : (1) TIM Timer
  127. *                : (2) DutyCycle   : u16
  128. *                : (3) Level 1     : During the Duty Cycle
  129. *                : (4) Level 2     : During the after the pulse
  130. *                : (5) Full period : u16
  131. * Output         : None
  132. *******************************************************************************/
  133. void TIM_PWMOModeConfig ( TIM_TypeDef  *TIMx,
  134.                           u16          XDutyCycle,
  135.                           TIM_Logic_Levels XLevel1,
  136.                           u16          XFullperiod,
  137.                           TIM_Logic_Levels XLevel2
  138.                         )
  139. {
  140.   u16 Tmp = TIMx->CR1;
  141.   // Set the Level During the pulse
  142.   Tmp = XLevel1 == TIM_HIGH  ? Tmp | TIM_OLVLB_Mask : Tmp & ~TIM_OLVLB_Mask;
  143.   // Set the Level after After the pulse
  144.   Tmp = XLevel2 == TIM_HIGH  ? Tmp | TIM_OLVLA_Mask : Tmp & ~TIM_OLVLA_Mask;
  145.   // Set the OCAE
  146.   Tmp |= TIM_OCAE_Mask;
  147.   // Set the PWM Bit
  148.   Tmp |= TIM_PWM_Mask;
  149.   // Update the CR1
  150.   TIMx->CR1 = Tmp;
  151.   // Set the Duty Cycle value
  152.   if ( XDutyCycle < 5 ) XDutyCycle = 5;
  153.   TIMx->OCAR = XDutyCycle - 5;
  154.   // Set the Full Period
  155.   TIMx->OCBR = XFullperiod - 5;
  156. }
  157. /*******************************************************************************
  158. * Function Name  : TIM_PWMInputConfig
  159. * Description    : This routine is used to configure the PWM in input mode
  160. * Input          : (1) TIM Timer
  161. *                : (2) First Activation Edge
  162. * Output         : None
  163. *******************************************************************************/
  164. void TIM_PWMIModeConfig ( TIM_TypeDef  *TIMx,  TIM_Clock_Edges  Xedge )
  165. {
  166.   u16 Tmp = TIMx->CR1;
  167.   // Set the first edge Level
  168.   Tmp = Xedge == TIM_RISING ? Tmp | TIM_IEDGA_Mask : Tmp & ~TIM_IEDGA_Mask;
  169.   // Set the Second edge Level ( Opposit of the first level )
  170.   Tmp = Xedge == TIM_FALLING ? Tmp | TIM_IEDGB_Mask : Tmp & ~TIM_IEDGB_Mask;
  171.   // Set the PWM I Bit
  172.   Tmp |= TIM_PWMI_Mask;
  173.   // Update the CR1
  174.   TIMx->CR1 = Tmp;
  175. }
  176. /*******************************************************************************
  177. * Function Name  : TIM_PWMIValue
  178. * Description    : This routine is used to get the PWMI values
  179. * Input          : (1) TIM Timer
  180. * Output         : PWMI_parameters : - u16 Dyty cycle
  181.                                      - u16 Full period
  182. *******************************************************************************/
  183. PWMI_parameters TIM_PWMIValue (  TIM_TypeDef  *TIMx )
  184. {
  185.   PWMI_parameters Tmp;
  186.   Tmp.Pulse  = TIMx->ICBR;
  187.   Tmp.Period = TIMx->ICAR;
  188.   return Tmp;
  189. }
  190. /*******************************************************************************
  191. * Function Name  : TIM_PWMInputConfig
  192. * Description    : This routine is used to configure the PWM in input mode
  193. * Input          : (1) TIM Timer
  194. *                : (2) First Activation Edge
  195. * Output         : None
  196. *******************************************************************************/
  197. void TIM_CounterConfig ( TIM_TypeDef  *TIMx, TIM_CounterOperations Xoperation )
  198. {
  199.   switch ( Xoperation )
  200.   {
  201.     case TIM_START :
  202.       TIMx->CR1 |= TIM_EN_Mask;
  203.       break;
  204.     case TIM_STOP :
  205.       TIMx->CR1 &= ~TIM_EN_Mask;
  206.       break;
  207.     case TIM_CLEAR :
  208.       TIMx->CNTR = 0x1234;
  209.       break;
  210.   }
  211. }
  212. /******************* (C) COPYRIGHT 2003 STMicroelectronics *****END OF FILE****/