Exemplo n.º 1
0
/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称:FTM1_IRQHandler
*  功能说明:FTM1输入捕捉中断服务函数
*  参数说明:无
*  函数返回:无
*  修改时间:2012-2-25
*  备    注:引脚号需要根据自己初始化来修改,参考现有的代码添加自己的功能
*************************************************************************/
void FTM1_IRQHandler()
{
    u8 s = FTM1_STATUS;             //读取捕捉和比较状态  All CHnF bits can be checked using only one read of STATUS.
    u8 n;
    FTM1_STATUS = 0x00;               //清中断标志位

    n = 0;
    if( s & (1 << n) )
    {
        FTM_CnSC_REG(FTM1_BASE_PTR, n) &= ~FTM_CnSC_CHIE_MASK; //禁止输入捕捉中断
        /*     用户任务       */
        
        /*********************/
        //不建议在这里开启输入捕捉中断,而是在main函数里根据需要来开启
        //通道 CH0、CH1、Ch2、Ch3 有滤波器
        //FTM_CnSC_REG(FTM1_BASE_PTR,n) |= FTM_CnSC_CHIE_MASK;  //开启输入捕捉中断
        //delayms(10);        //因为输入的信号跳变过程不稳定,容易触发多次输入捕捉,所以添加延时
        //但考虑到中断不应该过长延时,所以开输入捕捉中断就放在main函数里,根据需要来开启
    }

    n = 1;
    if( s & (1 << n) )
    {
        FTM_CnSC_REG(FTM1_BASE_PTR, n) &= ~FTM_CnSC_CHIE_MASK; //禁止输入捕捉中断
        /*     用户任务       */


        /*********************/
        //不建议在这里开启输入捕捉中断
        //FTM_CnSC_REG(FTM1_BASE_PTR,n) |= FTM_CnSC_CHIE_MASK;  //开启输入捕捉中断
    }

}
Exemplo n.º 2
0
void Qd::setMode ()
{
	//===Setings pin===//
	//pha
	pha.settingPinPort(QdDef::PhaPort);
	pha.settingPin(QdDef::PhaPin, QdDef::PhaAlt);

	//phb
	phb.settingPinPort(QdDef::PhbPort);
	phb.settingPin(QdDef::PhbPin, QdDef::PhbAlt);

	//===Settings timer===//
	FTM_SC_REG(ftm_ptr[num_ftm]) = 0;
	setPeriod(FTM_MOD_MOD_MASK);
	setInitValue(0);
	FTM_MODE_REG (ftm_ptr[num_ftm]) |= FTM_MODE_WPDIS_MASK;
	FTM_MODE_REG (ftm_ptr[num_ftm]) |= FTM_MODE_FTMEN_MASK;

	FTM_CnSC_REG(ftm_ptr[num_ftm], 0) = 0;
	FTM_CnSC_REG(ftm_ptr[num_ftm], 1) = 0;
	FTM_QDCTRL_REG(ftm_ptr[num_ftm]) |= FTM_QDCTRL_QUADEN_MASK|FTM_QDCTRL_PHAFLTREN_MASK|FTM_QDCTRL_PHBFLTREN_MASK;
	FTM_FILTER_REG (ftm_ptr[num_ftm]) |= FTM_FILTER_CH0FVAL(2) | FTM_FILTER_CH1FVAL(2) ;
	start ();
}
Exemplo n.º 3
0
void FTM_init  (FTM_MemMapPtr base)
{
	// Habilito el pin PTC1 como salida del canal 0
	PORTC_PCR1 = (PORT_PCR_ISF_MASK |
	              PORT_PCR_MUX(0x04));
	PORTB_PCR18 = (PORT_PCR_ISF_MASK |
		              PORT_PCR_MUX(0x03));
	
	// Habilito la llave general de las interrupciones
	//NVICISER1 |= NVIC_ISER_SETENA(0x0400);
	
	// Habilito el clock gating
	SIM_SCGC6 |= SIM_SCGC6_FTM0_MASK;
	SIM_SCGC6 |= SIM_SCGC6_FTM2_MASK;
	
	// Deshabilito la proteccion de escritura
	FTM_MODE_REG(base) 		= FTM_MODE_WPDIS_MASK;
	
	// Apago los flag de interrupciones
	FTM_STATUS_REG(base) 	= (FTM0_STATUS &
				       0x00);
	
	// Deshabilito los clocks y borro la configuracion
	FTM_SC_REG(base) 		= 0x00;
	
	// Configuro el canal 0 como nada
	FTM_CnSC_REG(base,0) 		= 0x00;
	
	// Configuro la salida inicial en alto (los LEDs son activo-bajo)
	FTM_MODE_REG(base) 		= FTM_MODE_INIT_MASK;
	
	// Configuro el PWM a duty 25% y reinicio el contador
	FTM_CnV_REG(base,0) 		= 0x0000;
	FTM_MOD_REG(base) 	    = 0x0000;
	FTM_CNTIN_REG(base) 		= 0x0000;
	FTM_CNT_REG(base) 		= 0x0000;
	
	FTM_PWMLOAD_REG(base) 	= (FTM_PWMLOAD_LDOK_MASK | 
					   FTM_PWMLOAD_CH0SEL_MASK);
	
	// Habilito las interrupciones y los clocks, y configuro el prescaler
	FTM_SC_REG(base) 		= (FTM_SC_TOIE_MASK |
			   		   FTM_SC_CLKS(0x01) |
			           FTM_SC_PS(0x0F));
	// Habilito los contadores del modulo
	FTM_CONF_REG(base) 		= FTM_CONF_BDMMODE(0x03);
}
Exemplo n.º 4
0
void FTM_PWMCenterAligned(FTM_MemMapPtr base, bool outputTrue){
	FTM_CnSC_REG(base,0) 	&=	~FTM_CnSC_MSA_MASK;
	FTM_CnSC_REG(base,0) 	|=	FTM_CnSC_MSB_MASK;
	FTM_SC_REG(base) |= FTM_SC_CPWMS_MASK;
	FTM_COMBINE_REG(base) &=	~FTM_COMBINE_COMBINE0_MASK;
	FTM_COMBINE_REG(base) &=	~FTM_COMBINE_DECAPEN0_MASK;
	
	if(outputTrue == HIGHTRUE){
		FTM_CnSC_REG(base,0) 	|=	FTM_CnSC_ELSB_MASK;
		FTM_CnSC_REG(base,0) 	&=	~FTM_CnSC_ELSA_MASK;
	}
	else{
		FTM_CnSC_REG(base,0) 	|=	FTM_CnSC_ELSA_MASK;
		FTM_CnSC_REG(base,0) 	&=	~FTM_CnSC_ELSB_MASK;
	}
}
Exemplo n.º 5
0
Arquivo: ftm_pwm.c Projeto: aarzho/k60
/**
 *    @brief pwm2模块相关寄存器配置
 *
 *    @param   channel  pwm2所选的通道  
 */
static void pwm_mod2_set(ID channel)
{
	/*使能ftm0模块时钟*/
	SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK;
	
	/*选择时钟源,分频系数,以及计数器计数方式*/
	FTM_SC_REG(FTM2_BASE_PTR) = FTM_SC_CLKS(FTM2_PWM_CLK) | FTM_SC_PS(FTM2_PWM_PRESCALE) | ((FTM2_PWM_MODE & 0x10)<<1); 
	
	/*设置计数器计数初值*/
	FTM_CNTIN_REG(FTM2_BASE_PTR) = CNTIN_VALUE;
	
	/*初始化计数器*/
	FTM_CNT_REG(FTM2_BASE_PTR) = FTM2_INIT_VALUE;
	
	/*设置计数器最大模值*/
	FTM_MOD_REG(FTM2_BASE_PTR) = FTM2_PWM_CYCLE;
	
	/*设置FTM模块的工作方式*/
	FTM_CnSC_REG(FTM2_BASE_PTR,channel) = ((FTM2_PWM_MODE & 0x0f)<<2);
	
	/*设置初始化占空比*/
	FTM_CnV_REG(FTM2_BASE_PTR,channel) = PWM_INIT_VALUE;
}
Exemplo n.º 6
0
void FTM_PWMEdgeAligned(FTM_MemMapPtr base, bool outputTrue){
	FTM_setPeriod(base, 0x0000);
	FTM_setDuty(base, 0x0000);
	FTM_CnSC_REG(base,0) 	&=	~FTM_CnSC_MSA_MASK;
	FTM_CnSC_REG(base,0) 	|=	FTM_CnSC_MSB_MASK;
	FTM_SC_REG(base) &=	~FTM_SC_CPWMS_MASK;
	FTM_COMBINE_REG(base) &=	~FTM_COMBINE_COMBINE0_MASK;
	FTM_COMBINE_REG(base) &=	~FTM_COMBINE_DECAPEN0_MASK;
	if(outputTrue == HIGHTRUE){
		FTM_CnSC_REG(base,0) 	|=	FTM_CnSC_ELSB_MASK;
		FTM_CnSC_REG(base,0) 	&=	~FTM_CnSC_ELSA_MASK;
	}
	else{
		FTM_CnSC_REG(base,0) 	|=	FTM_CnSC_ELSA_MASK;
		FTM_CnSC_REG(base,0) 	&=	~FTM_CnSC_ELSB_MASK;
	}
	
	FTM_SC_REG(base) &=	~FTM_SC_CPWMS_MASK;
}