⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tim.c

📁 这是一个定时器timer的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                                      
**                                          
**                                杭州央海软件科技有限公司
**
**                                 http://www.armgcc.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: tim.c
** 创 建 人: 罗辉联
** 创建日期: 2006年5月11日
** 描    述: 该文件包含了timer的基本功能函数
**
**--------------历史版本--------------------------------------------------------------------------------
** 创 建 人: 罗辉联
** 版    本: V1.0
** 日   期: 2006年5月11日
** 描   述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "tim.h"
#include "rccu.h"

#if EN_ARM_TIM > 0		//决定是否编译该文件

#ifndef abs
	#define abs(x) ((x)>0 ? (x) : -(x))
#endif
/******************************************* 全局变量定义 ***********************************************/

/******************************************* 局部函数声明 ***********************************************/

/*********************************************************************************************************
;** 函数名称: TIM_Reset
;** 功能描述: 复位指定的定时器 
;** 
;** 参    数: timer: 选择定时器类型(TIMER0, TIMER1, TIMER2, TIMER3)
;**          
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年5月11日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void TIM_Reset(TIM_TYPES_T timer)
{
	TIMx_CR1(timer) = 0x0000;
  	TIMx_CR2(timer) = 0x0000;
  	TIMx_SR(timer)  = 0x0000;
}
/*********************************************************************************************************
;** 函数名称: TIM_ICAPModeConfig
;** 功能描述: 配置指定定时器输入捕捉模式
;** 
;** 参    数: timer: 	选择定时器类型(TIMER0, TIMER1, TIMER2, TIMER3)
;**           channel:  选择定时器的通道(TIM_CHANNEL_A,TIM_CHANNEL_B)
;**           edge :	输入捕捉触发类型(TIM_RISING, TIM_FALLING)
;**          
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年5月11日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void TIM_ICAPModeConfig (TIM_TYPES_T timer, TIM_CHANNELS_T channel, TIM_CLOCK_EDGES_T edge)
{
	switch (channel)
  	{
    	case TIM_CHANNEL_A :
      		if(edge == TIM_RISING) 
      			TIMx_CR1(timer) |= TIM_IEDGA_MASK; 
      		else 
      			TIMx_CR1(timer) &= ~TIM_IEDGA_MASK;
      		break;
    	case TIM_CHANNEL_B :
      		if(edge == TIM_RISING) 
      			TIMx_CR1(timer) |= TIM_IEDGB_MASK; 
      		else 
      			TIMx_CR1(timer) &= ~TIM_IEDGB_MASK;
      		break;
  	}
}
/*********************************************************************************************************
;** 函数名称: TIM_OCMPModeConfig
;** 功能描述: 配置指定定时器输出比较模式
;** 
;** 参    数: timer: 		选择定时器类型(TIMER0, TIMER1, TIMER2, TIMER3)
;**			  channel:  	选择定时器的通道(TIM_CHANNEL_A,TIM_CHANNEL_B)
:**			  pulse_length: 脉冲长度
;**			  mode:			输出比较模式(TIM_TIMING, TIM_WAVE)
;**           level:		输出比较电平类型(TIM_HIGH, TIM_LOW)
;**          
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年5月11日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void TIM_OCMPModeConfig(TIM_TYPES_T 	   timer,
                        TIM_CHANNELS_T 	   channel,
                        UWORD16        pulse_length,
                        TIM_OC_MODES_T     mode,
                        TIM_LOGIC_LEVELS_T level)
{
	UWORD16 temp1 = 0x0000;
  	UWORD16 temp2 = TIMx_CR2(timer);

  	TIMx_CR2(timer)  = 0x0000;					/* Start The TIM Counter							    */
  	TIMx_CR1(timer)  = TIM_EN_MASK;				/* Update the CR2 Register 							    */
  	TIMx_CR2(timer)  = temp2;
  
  	switch (mode)
  	{
    	case TIM_TIMING :						/*Output Compare Used only for Internal Timing Operation*/
      		temp1 = channel == TIM_CHANNEL_A ? temp1 & ~TIM_OCAE_MASK : temp1 & ~TIM_OCBE_MASK;
      		break;
    	case TIM_WAVE :							/* Output Compare Used for external wave generation 	*/
      		temp1 = channel == TIM_CHANNEL_A ? TIM_OCAE_MASK : TIM_OCBE_MASK;
      		if ( level == TIM_HIGH )
        		temp1 = channel == TIM_CHANNEL_A ? temp1 | TIM_OLVLA_MASK  : temp1 | TIM_OLVLB_MASK;
      		else
        		temp1 = channel == TIM_CHANNEL_A ? temp1 & ~TIM_OLVLA_MASK : temp1 & ~TIM_OLVLB_MASK;
      		break;
  	}
  
  	if(channel == TIM_CHANNEL_A)
  		TIMx_OCAR(timer) = (pulse_length - 5);
  	else
    	TIMx_OCBR(timer) = (pulse_length - 5);
    	
    TIMx_CNTR(timer) = 0x0000;
    TIMx_CR1(timer) |= temp1;
}
/*********************************************************************************************************
;** 函数名称: TIM_OPModeConfig
;** 功能描述: 配置指定定时器的单个脉冲模式 ,又单个脉冲模式通过ICAP A OCAP 共同实现
;** 
;** 参    数: timer: 			选择定时器类型(TIMER0, TIMER1, TIMER2, TIMER3)
:**			  pulse_length: 	脉冲长度
;**			  level1:       	脉冲持续期间电平类型(TIM_HIGH,TIM_LOW)
;**           level2       		脉冲产生后电平类型(TIM_HIGH,TIM_LOW)
;**           activative_edge:  触发ICAP A的边沿类型(TIM_RISING,TIM_FALLING)
;**          
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年5月11日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void TIM_OPModeConfig (TIM_TYPES_T         timer,
                       UWORD16  pulse_length,
                       TIM_LOGIC_LEVELS_T level1,
                       TIM_LOGIC_LEVELS_T level2,
                       TIM_CLOCK_EDGES_T  edge )
{
	UWORD16 temp = 0;

  	if(level1 == TIM_HIGH) 
  		temp |= TIM_OLVLB_MASK;				/* Set the Level During the pulse 			*/
  		
  	if(level2 == TIM_HIGH) 
  		temp |= TIM_OLVLA_MASK;			    /* Set the Level  After the pulse 			*/
  
  	if (edge == TIM_RISING) 
  		temp |= TIM_IEDGA_MASK;				/* Set the Activation Edge on the INCAP 1 	*/
  
  	temp |= TIM_OCAE_MASK;					/* Set the Output Compare Function 			*/
  	temp |= TIM_OMP_MASK;					/* Set the One pulse mode 					*/
  	
  	TIMx_CR1(timer) = temp;					/* Update the CR1 register Value 			*/
  	TIMx_OCAR(timer) = pulse_length;		/* Set the Pulse length 					*/
  	
}
/*********************************************************************************************************
;** 函数名称: TIM_PWMOModeConfig
;** 功能描述: 该函数配置指定定时器单个脉冲模式,又单个脉冲模式通过ICAP A OCAP 共同实现
;** 
;** 参    数: timer: 			选择定时器类型(TIMER0, TIMER1, TIMER2, TIMER3)
:**			  duty_cycle: 	脉冲长度
;**			  level1:       	脉冲持续期间电平类型(TIM_HIGH,TIM_LOW)
;**           level2       		脉冲产生后电平类型(TIM_HIGH,TIM_LOW)
;**           full_period:  触发ICAP A的边沿类型(TIM_RISING,TIM_FALLING)
;**          
;** 返 回 值: None
;**         
;** 作   者: 罗辉联

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -