int main(void) { vuint32_t PulseNum = 0; /* 模块初始化 */ exc_init(); /* 中断初始化 */ light_init(); /* LED灯初始化 */ /* 初始化串口 */ serial_initialize((intptr_t)(NULL)); ftm_decoder_init(PTA8_9); printf("%s\n","FTM - PWM test!"); while(1) { PulseNum = FTM_CNT_REG(FTM1_BASE_PTR); //读FTM1的CNT寄存器的值 if(PulseNum > 5000) { light_change(LIGHT1); } } return 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); }
/** * @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; }