/************************************************************************* * 野火嵌入式开发工作室 * * 函数名称: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; //开启输入捕捉中断 } }
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 (); }
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); }
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; } }
/** * @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; }
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; }