Exemplo n.º 1
0
/*
 * LPLD_FTM_PWM_Init
 * FTM模块PWM模式初始化,内部调用
 */
static uint8 LPLD_FTM_PWM_Init(FTM_InitTypeDef ftm_init_structure)
{
    uint32 bus_clk_hz;
    uint32 mod, mod2;
    uint8 ps;
    uint32 freq = ftm_init_structure.FTM_PwmFreq;
    uint32 dt_en = ftm_init_structure.FTM_PwmDeadtimeCfg;
    uint8 dt_div = ftm_init_structure.FTM_PwmDeadtimeDiv;
    uint8 dt_val = ftm_init_structure.FTM_PwmDeadtimeVal;
    FTM_MemMapPtr ftmx = ftm_init_structure.FTM_Ftmx;

    //参数检查
    //ASSERT( freq );                  //判断频率
    //ASSERT( dt_val<=63 );            //判断死区插入值
    if (dt_val > 63)
        return 0;

    bus_clk_hz = g_bus_clock;

    if(freq>bus_clk_hz) return 0;
//这段代码写的比较有趣...
    if((mod=bus_clk_hz/(freq*128)) < 0xFFFFu)
    {
        ps = 7;
        mod2=mod;
        if((mod=bus_clk_hz/(freq*64)) < 0xFFFFu)
        {
            ps = 6;
            mod2=mod;
            if((mod=bus_clk_hz/(freq*32)) < 0xFFFFu)
            {
                ps = 5;
                mod2=mod;
                if((mod=bus_clk_hz/(freq*16)) < 0xFFFFu)
                {
                    ps = 4;
                    mod2=mod;
                    if((mod=bus_clk_hz/(freq*8)) < 0xFFFFu)
                    {
                        ps = 3;
                        mod2=mod;
                        if((mod=bus_clk_hz/(freq*4)) < 0xFFFFu)
                        {
                            ps = 2;
                            mod2=mod;
                            if((mod=bus_clk_hz/(freq*2)) < 0xFFFFu)
                            {
                                ps = 1;
                                mod2=mod;
                                if((mod=bus_clk_hz/(freq*1)) < 0xFFFFu)
                                {
                                    ps = 0;
                                    mod2=mod;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    else
    {
        return 0;
    }

    ftmx->SC = 0;

    // 设置PWM周期及占空比
    //    PWM周期 = (MOD-CNTIN+1)*FTM时钟周期 :
    // 配置FTM计数初始值
    ftmx->CNT = 0;
    ftmx->CNTIN = 0;
    // 配置FTM计数MOD值
    ftmx->MOD = mod2;

    ftmx->DEADTIME = FTM_DEADTIME_DTPS(dt_div) | FTM_DEADTIME_DTVAL(dt_val);
    ftmx->COMBINE = dt_en;        //使能死区

    // 配置FTM控制寄存器
    // 禁用中断, 加计数模式, 时钟源:System clock(Bus Clk), 分频系数:8
    // 假设SysClk = 50MHz, SC_PS=3, FTM Clk = 50MHz/2^3 = 6.25MHz
    ftmx->SC = FTM_SC_CLKS(1)|FTM_SC_PS(ps);

    return 1;
}
Exemplo n.º 2
0
status_t FTM_Init(FTM_Type *base, const ftm_config_t *config)
{
    assert(config);

    uint32_t reg;

    if (!(config->pwmSyncMode &
          (FTM_SYNC_TRIG0_MASK | FTM_SYNC_TRIG1_MASK | FTM_SYNC_TRIG2_MASK | FTM_SYNC_SWSYNC_MASK)))
    {
        /* Invalid PWM sync mode */
        return kStatus_Fail;
    }

    /* Ungate the FTM clock*/
    CLOCK_EnableClock(s_ftmClocks[FTM_GetInstance(base)]);

    /* Configure the fault mode, enable FTM mode and disable write protection */
    base->MODE = FTM_MODE_FAULTM(config->faultMode) | FTM_MODE_FTMEN_MASK | FTM_MODE_WPDIS_MASK;

    /* Configure the update mechanism for buffered registers */
    FTM_SetPwmSync(base, config->pwmSyncMode);

    if (config->reloadPoints)
    {
        /* Setup intermediate register reload points */
        FTM_SetReloadPoints(base, config->reloadPoints);
    }

    /* Set the clock prescale factor */
    base->SC = FTM_SC_PS(config->prescale);

    /* Setup the counter operation */
    base->CONF = (FTM_CONF_BDMMODE(config->bdmMode) | FTM_CONF_GTBEEN(config->useGlobalTimeBase));

    /* Initial state of channel output */
    base->OUTINIT = config->chnlInitState;

    /* Channel polarity */
    base->POL = config->chnlPolarity;

    /* Set the external trigger sources */
    base->EXTTRIG = config->extTriggers;
#if defined(FSL_FEATURE_FTM_HAS_RELOAD_INITIALIZATION_TRIGGER) && (FSL_FEATURE_FTM_HAS_RELOAD_INITIALIZATION_TRIGGER)
    if (config->extTriggers & kFTM_ReloadInitTrigger)
    {
        base->CONF |= FTM_CONF_ITRIGR_MASK;
    }
    else
    {
        base->CONF &= ~FTM_CONF_ITRIGR_MASK;
    }
#endif /* FSL_FEATURE_FTM_HAS_RELOAD_INITIALIZATION_TRIGGER */

    /* FTM deadtime insertion control */
    base->DEADTIME = (FTM_DEADTIME_DTPS(config->deadTimePrescale) | FTM_DEADTIME_DTVAL(config->deadTimeValue));

    /* FTM fault filter value */
    reg = base->FLTCTRL;
    reg &= ~FTM_FLTCTRL_FFVAL_MASK;
    reg |= FTM_FLTCTRL_FFVAL(config->faultFilterValue);
    base->FLTCTRL = reg;

    return kStatus_Success;
}