注册 登录
查看: 3688|回复: 30

飞思卡尔K60FX的FTM3

[复制链接]
发表于 2014-7-3 15:06:11 | 显示全部楼层 |阅读模式
请问谁有FX的FTM3输出PWM的底层驱动,自己仿照FTM0写了个,但是不能用,求救啊~~~~~
======
山外メ雲ジ:添加修改好的文件,覆盖工程同名文件。有可能提示有的管脚宏定义没定义,在宏的后面加个后缀:_PIN 即可



5.2版本已经集成进去,不需要替换


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

回复

使用道具 举报

 楼主| 发表于 2014-7-3 15:48:34 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-3 15:45
lptmr 是独立模块,应该是准的啊。
你测得不准吗?

我们两个电机,一个用FTM,一个用LPTMR计数,之前没注意过这个问题,现在发现,电机高速时lptmr测不准确
回复 支持 0 反对 1

使用道具 举报

发表于 2014-7-3 15:10:16 | 显示全部楼层
把你写的发上来,我看看哪里有问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-3 15:14:49 | 显示全部楼层
FTM_MemMapPtr FTMN[4] = {FTM0_BASE_PTR, FTM1_BASE_PTR, FTM2_BASE_PTR, FTM3_BASE_PTR}; //定义三个指针数组保存 FTMn_e 的地址
/*!
*  @brief      初始化FTM 的PWM 功能
*  @param      FTMn_e    模块号(FTM0、  FTM1、  FTM2、  FTM3)
*  @param      FTM_CHn_e     通道号(CH0~CH7)
*  @param      freq    频率(单位为Hz)
*  @param      duty    占空比分子,占空比 = duty / FTMn_PRECISON
*  @since      v5.0
*  @note       同一个FTM,PWM频率是必须一样的,但占空比可不一样。共3个FTM,即可以输出3个不同频率PWM
*  Sample usage:       FTM_PWM_init(FTM0, FTM_CH6,200, 10);    //初始化 FTM0_CH6 为 频率 200Hz 的PWM,占空比为 10/FTM0_PRECISON
*/
void FTM_PWM_init(FTMn_e ftmn, FTM_CHn_e ch, uint32 freq, uint32 duty)
{
    uint32 clk_hz ;
    uint16 mod;
    uint8  ps;
    uint16 cv;

    ASSERT( (ftmn == FTM0)||(ftmn == FTM3) || ( (ftmn == FTM1 || ftmn == FTM2 ) && (ch <= FTM_CH1))   );  //检查传递进来的通道是否正确
    ASSERT( freq <= (bus_clk_khz * 1000 >> 1) );                                           //用断言检测 频率 是否正常 ,频率必须小于时钟二分之一

    /******************* 开启时钟 和 复用IO口*******************/
    switch(ftmn)
    {
    case FTM0:
        SIM_SCGC6 |= SIM_SCGC6_FTM0_MASK;       //使能FTM0时钟
        switch(ch)
        {
        case FTM_CH0:
            if(FTM0_CH0 == PTC1)
            {
                port_init(FTM0_CH0, ALT4);
            }
            else if(FTM0_CH0 == PTA3)
            {
                port_init(FTM0_CH0, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH1:
            if(FTM0_CH1 == PTC2)
            {
                port_init(FTM0_CH1, ALT4);
            }
            else if(FTM0_CH1 == PTA4)
            {
                port_init(FTM0_CH1, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH2:
            if(FTM0_CH2 == PTC3)
            {
                port_init(FTM0_CH2, ALT4);
            }
            else if(FTM0_CH2 == PTA5)
            {
                port_init(FTM0_CH2, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH3:
            if(FTM0_CH3 == PTC4)
            {
                port_init(FTM0_CH3, ALT4);
            }
            else if(FTM0_CH3 == PTA6)
            {
                port_init(FTM0_CH3, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH4:
            if(FTM0_CH4 == PTD4)
            {
                port_init(FTM0_CH4, ALT4);
            }
            else if(FTM0_CH4 == PTA7)
            {
                port_init(FTM0_CH4, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH5:
            if(FTM0_CH5 == PTD5)
            {
                port_init(FTM0_CH5, ALT4);
            }
            else if(FTM0_CH5 == PTA0)
            {
                port_init(FTM0_CH5, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH6:
            if(FTM0_CH6 == PTD6)
            {
                port_init(FTM0_CH6, ALT4);
            }
            else if(FTM0_CH6 == PTA1)
            {
                port_init(FTM0_CH6, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH7:
            if(FTM0_CH7 == PTD7)
            {
                port_init(FTM0_CH7, ALT4);
            }
            else if(FTM0_CH7 == PTA2)
            {
                port_init(FTM0_CH7, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;
        default:
            return;
        }
        break;

    case FTM1:
        SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK;       //使能FTM1时钟
        switch(ch)
        {
        case FTM_CH0:
            if((FTM1_CH0 == PTA8) || (FTM1_CH0 == PTA12) || (FTM1_CH0 == PTB0) )
            {
                port_init(FTM1_CH0, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;


        case FTM_CH1:
            if((FTM1_CH1 == PTA9) || (FTM1_CH1 == PTA13) || (FTM1_CH1 == PTB1) )
            {
                port_init(FTM1_CH1, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        default:
            return;
        }
        break;

    case FTM2:
        SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK;                           //使能FTM2时钟
        switch(ch)
        {
        case FTM_CH0:
            if((FTM2_CH0 == PTA10) || (FTM2_CH0 == PTB18) )
            {
                port_init(FTM2_CH0, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH1:
            if((FTM2_CH1 == PTA11) || (FTM2_CH1 == PTB19))
            {
                port_init(FTM2_CH1, ALT3);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        default:
            return;
        }
        break;
        
    case FTM3:
        SIM_SCGC3 |= SIM_SCGC3_FTM3_MASK;       //使能FTM0时钟
        switch(ch)
        {
        case FTM_CH0:          //PTD0(ALT4)、PTE5(ALT6)
            if(FTM0_CH0 == PTD0)
            {
                port_init(FTM0_CH0, ALT4);
            }
            else if(FTM0_CH0 == PTE5)
            {
                port_init(FTM0_CH0, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH1:          //PTD1(ALT4)、PTE6(ALT6)
            if(FTM0_CH1 == PTD1)
            {
                port_init(FTM0_CH1, ALT4);
            }
            else if(FTM0_CH1 == PTE6)
            {
                port_init(FTM0_CH1, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH2:          //PTD2(ALT4)、PTE7(ALT6)
            if(FTM0_CH2 == PTD2)
            {
                port_init(FTM0_CH2, ALT4);
            }
            else if(FTM0_CH2 == PTE7)
            {
                port_init(FTM0_CH2, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH3:          //PTD3(ALT4)、PTE8(ALT6)
            if(FTM0_CH3 == PTD3)
            {
                port_init(FTM0_CH3, ALT4);
            }
            else if(FTM0_CH3 == PTE8)
            {
                port_init(FTM0_CH3, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH4:         //PTC8(ALT3)、PTE9(ALT6)
            if(FTM0_CH4 == PTC8)
            {
                port_init(FTM0_CH4, ALT3);
            }
            else if(FTM0_CH4 == PTE9)
            {
                port_init(FTM0_CH4, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH5:        //PTC9(ALT3)、PTE10(ALT6)
            if(FTM0_CH5 == PTC9)
            {
                port_init(FTM0_CH5, ALT3);
            }
            else if(FTM0_CH5 == PTE10)
            {
                port_init(FTM0_CH5, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH6:           //PTC10(ALT3)、PTE11(ALT6)
            if(FTM0_CH6 == PTC10)
            {
                port_init(FTM0_CH6, ALT3);
            }
            else if(FTM0_CH6 == PTE11)
            {
                port_init(FTM0_CH6, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH7:           //PTC11(ALT3)、PTE12(ALT6)
            if(FTM0_CH7 == PTC11)
            {
                port_init(FTM0_CH7, ALT3);
            }
            else if(FTM0_CH7 == PTE12)
            {
                port_init(FTM0_CH7, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;
        default:
            return;
        }
        break;        
    default:
        break;
    }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-3 15:15:05 | 显示全部楼层

    /*       计算频率设置        */
    //  若 CPWMS = 1 ,即双边捕捉脉冲,则 PMW频率 =  bus频率 /2 /(2^预分频因子)/模数
    //  若 CPWMS = 0 ,即单边捕捉脉冲,则 PMW频率 =  bus频率    /(2^预分频因子)/模数
    //  EPWM的周期 :MOD - CNTIN + 0x0001   (CNTIN 设为0)
    //  脉冲宽度:CnV - CNTIN

    //  模数 MOD < 0x10000
    //  预分频因子 PS  < 0x07
    //  预分频因子 PS 越小时,模数 mod 就越大,计数就越精准,PWM输出更为准确
    //  MOD  = clk_hz/(freq*(1 << PS)) < 0x10000  ==>  clk_hz/(freq*0x10000) < (1<< PS)  ==>  (clk_hz/(freq*0x10000) >> PS) < 1
    //  即 (((clk_hz/0x10000 )/ freq ) >> PS ) < 1

    // 以 CPWMS = 1 ,即双边捕捉脉冲为例
    clk_hz = (bus_clk_khz * 1000) >> 1 ; // bus频率 / 2

    mod = (clk_hz >> 16 ) / freq ;      // 临时用 mod 缓存一下
    ps = 0;
    while((mod >> ps) >= 1)             // 等 (mod >> ps) < 1 才退出 while 循环 ,即求 PS 的最小值
    {
        ps++;
    }

    ASSERT(ps <= 0x07);         // 断言, PS 最大为 0x07 ,超过此值,则 PWM频率设置过低,或 Bus 频率过高

    mod = (clk_hz >> ps) / freq;// 求 MOD 的值

    switch(ftmn)                // 初值 CNTIN 设为0 ,脉冲宽度:CnV - CNTIN ,即 CnV 就是 脉冲宽度了。
    {
        // EPWM的周期 : MOD - CNTIN + 0x0001 == MOD - 0 + 1
        // 则 CnV = (MOD - 0 + 1) * 占空比 = (MOD - 0 + 1) * duty/ FTM_PRECISON
    case FTM0:
        cv = (duty * (mod - 0 + 1)) / FTM0_PRECISON;
        break;

    case FTM1:
        cv = (duty * (mod - 0 + 1)) / FTM1_PRECISON;
        break;

    case FTM2:
        cv = (duty * (mod - 0 + 1)) / FTM2_PRECISON;
        break;
    case FTM3:
        cv = (duty * (mod - 0 + 1)) / FTM3_PRECISON;
        break;
    default:
        break;
    }

    /******************** 选择输出模式为 边沿对齐PWM *******************/
    //通道状态控制,根据模式来选择 边沿或电平
    FTM_CnSC_REG(FTMN[ftmn], ch) &= ~FTM_CnSC_ELSA_MASK;
    FTM_CnSC_REG(FTMN[ftmn], ch)  = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSB_MASK;
    // MSnB:MSnA = 1x       边沿对齐PWM
    // ELSnB:ELSnA = 10     先高后低
    // ELSnB:ELSnA = 11     先低后高

    /******************** 配置时钟和分频 ********************/
    FTM_SC_REG(FTMN[ftmn])    = ( 0
                                  | FTM_SC_CPWMS_MASK         //0:上升沿计数模式 ,1: 跳变沿计数模式选择 (注释了表示 0)
                                  | FTM_SC_PS(ps)             //分频因子,分频系数 = 2^PS
                                  | FTM_SC_CLKS(1)            //时钟选择, 0:没选择时钟,禁用; 1:bus 时钟; 2:MCGFFCLK; 3:EXTCLK( 由SIM_SOPT4 选择输入管脚 FTM_CLKINx)
                                  //| FTM_SC_TOIE_MASK        //溢出中断使能(注释了表示 禁止溢出中断)
                                );
    FTM_MOD_REG(FTMN[ftmn])   = mod;                        //模数, EPWM的周期为 :MOD - CNTIN + 0x0001
    FTM_CNTIN_REG(FTMN[ftmn]) = 0;                          //计数器初始化值。设置脉冲宽度:(CnV - CNTIN).
    FTM_CnV_REG(FTMN[ftmn], ch) = cv;
    FTM_CNT_REG(FTMN[ftmn])   = 0;                           //计数器。只有低16位可用(写任何值到此寄存器,都会加载 CNTIN 的值)
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-3 15:16:03 | 显示全部楼层
fire_port_cgf中的添加了:
//      模块通道    端口          可选范围                          建议
#define FTM3_CH0    PTD0        //PTD0(ALT4)、PTE5(ALT6)            PTA3不要用(与Jtag、SWD冲突)
#define FTM3_CH1    PTD1        //PTD1(ALT4)、PTE6(ALT6)
#define FTM3_CH2    PTD2        //PTD2(ALT4)、PTE7(ALT6)
#define FTM3_CH3    PTD3        //PTD3(ALT4)、PTE8(ALT6)
#define FTM3_CH4    PTC8        //PTC8(ALT3)、PTE9(ALT6)
#define FTM3_CH5    PTC9        //PTC9(ALT3)、PTE10(ALT6)        PTA0不要用(与Jtag、SWD冲突)
#define FTM3_CH6    PTC10        //PTC10(ALT3)、PTE11(ALT6)       PTA1不要用(与Jtag冲突)
#define FTM3_CH7    PTC11        //PTC11(ALT3)、PTE12(ALT6)  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-3 15:16:51 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-3 15:10
把你写的发上来,我看看哪里有问题

FTM3只能输出PWM吗?不能计数吗?
回复 支持 反对

使用道具 举报

发表于 2014-7-3 15:19:57 | 显示全部楼层
可爱的深蓝 发表于 2014-7-3 15:16
FTM3只能输出PWM吗?不能计数吗?

FTM3 只能 PWM 输出


你的初始化代码有误。把 0 改成 3(有多个地方的,我仅仅是标记了一小部分)
另外,管脚复用,需要查复用表,根据复用表来选择哪些管脚的


case FTM3:
        SIM_SCGC3 |= SIM_SCGC3_FTM3_MASK;       //使能FTM0时钟
        switch(ch)
        {
        case FTM_CH0:          //PTD0(ALT4)、PTE5(ALT6)
            if(FTM0_CH0 == PTD0)
            {
                port_init(FTM0_CH0, ALT4);
            }
            else if(FTM0_CH0 == PTE5)
            {
                port_init(FTM0_CH0, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH1:          //PTD1(ALT4)、PTE6(ALT6)
            if(FTM0_CH1 == PTD1)
            {
                port_init(FTM0_CH1, ALT4);
            }
            else if(FTM0_CH1 == PTE6)
            {
                port_init(FTM0_CH1, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH2:          //PTD2(ALT4)、PTE7(ALT6)
            if(FTM0_CH2 == PTD2)
            {
                port_init(FTM0_CH2, ALT4);
            }
            else if(FTM0_CH2 == PTE7)
            {
                port_init(FTM0_CH2, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH3:          //PTD3(ALT4)、PTE8(ALT6)
            if(FTM0_CH3 == PTD3)
            {
                port_init(FTM0_CH3, ALT4);
            }
            else if(FTM0_CH3 == PTE8)
            {
                port_init(FTM0_CH3, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH4:         //PTC8(ALT3)、PTE9(ALT6)
            if(FTM0_CH4 == PTC8)
            {
                port_init(FTM0_CH4, ALT3);
            }
            else if(FTM0_CH4 == PTE9)
            {
                port_init(FTM0_CH4, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH5:        //PTC9(ALT3)、PTE10(ALT6)
            if(FTM0_CH5 == PTC9)
            {
                port_init(FTM0_CH5, ALT3);
            }
            else if(FTM0_CH5 == PTE10)
            {
                port_init(FTM0_CH5, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH6:           //PTC10(ALT3)、PTE11(ALT6)
            if(FTM0_CH6 == PTC10)
            {
                port_init(FTM0_CH6, ALT3);
            }
            else if(FTM0_CH6 == PTE11)
            {
                port_init(FTM0_CH6, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;

        case FTM_CH7:           //PTC11(ALT3)、PTE12(ALT6)
            if(FTM0_CH7 == PTC11)
            {
                port_init(FTM0_CH7, ALT3);
            }
            else if(FTM0_CH7 == PTE12)
            {
                port_init(FTM0_CH7, ALT6);
            }
            else
            {
                ASSERT(0);                      //设置管脚有误?
            }
            break;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-3 15:29:08 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-3 15:19
FTM3 只能 PWM 输出

嗯,感觉这错误好傻逼啊~~~~~~我查过管脚复用,应该没什么错,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-3 15:36:04 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-3 15:19
FTM3 只能 PWM 输出

可以产生PWM了,谢谢山外哥~~~~话说,这个FTM3能计数吗?
回复 支持 反对

使用道具 举报

发表于 2014-7-3 15:36:56 | 显示全部楼层
可爱的深蓝 发表于 2014-7-3 15:36
可以产生PWM了,谢谢山外哥~~~~话说,这个FTM3能计数吗?

FTM3 没有正交解码的
回复 支持 反对

使用道具 举报

发表于 2014-7-3 15:38:08 | 显示全部楼层
可爱的深蓝 发表于 2014-7-3 15:36
可以产生PWM了,谢谢山外哥~~~~话说,这个FTM3能计数吗?

非常感谢啊,你的代码,也可以给其他人提供参考
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-3 15:40:15 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-3 15:36
FTM3 没有正交解码的

那个连LPTMR是不是不准啊?
回复 支持 反对

使用道具 举报

发表于 2014-7-3 15:45:25 | 显示全部楼层
可爱的深蓝 发表于 2014-7-3 15:40
那个连LPTMR是不是不准啊?

lptmr 是独立模块,应该是准的啊。
你测得不准吗?
回复 支持 反对

使用道具 举报

发表于 2014-7-3 17:16:31 | 显示全部楼层
可爱的深蓝 发表于 2014-7-3 15:48
我们两个电机,一个用FTM,一个用LPTMR计数,之前没注意过这个问题,现在发现,电机高速时lptmr测不准确

这个我也没留意到哦。那就用FTM吧
回复 支持 反对

使用道具 举报

发表于 2014-7-7 16:31:59 | 显示全部楼层
是不是144管教的K60都可以FTm3输出PWm
回复 支持 反对

使用道具 举报

发表于 2014-7-7 16:32:32 | 显示全部楼层
172350225 发表于 2014-7-7 16:31
是不是144管教的K60都可以FTm3输出PWm

不是,是FX 单片机才有,DN的是没有的
回复 支持 反对

使用道具 举报

发表于 2014-7-7 17:37:41 | 显示全部楼层
FTM3的寄存器地址数据手册上查不到,能发给我吗?多谢
回复 支持 反对

使用道具 举报

发表于 2014-7-7 17:45:35 | 显示全部楼层
172350225 发表于 2014-7-7 17:37
FTM3的寄存器地址数据手册上查不到,能发给我吗?多谢

K60FX 的手册上才有,你的手册上没有,说明你的单片机不支持FTM3
回复 支持 反对

使用道具 举报

发表于 2014-7-7 19:39:56 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 17:45
K60FX 的手册上才有,你的手册上没有,说明你的单片机不支持FTM3

多谢,长知识了
回复 支持 反对

使用道具 举报

发表于 2014-7-16 13:56:10 | 显示全部楼层
走过路过,不能错过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-16 16:13:02 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-3 15:36
FTM3 没有正交解码的

山外哥,MK60_FTM.h文件中的typedef enum
{
    FTM0,
    FTM1,
    FTM2,
    FTM3,
    FTM_MAX,//作用是什么???????
} FTMn_e;
中 FTM_MAX的作用是什么,我屏蔽之后,并没有发现哪里出错~~~
回复 支持 反对

使用道具 举报

发表于 2014-8-16 16:18:05 | 显示全部楼层
可爱的深蓝 发表于 2014-8-16 16:13
山外哥,MK60_FTM.h文件中的typedef enum
{
    FTM0,

这个是表示FTM模块有多少个数目,因为我们的程序中没用到,所以这里可以删掉。
像LED_MAX ,就有用到,可以方便知道LED的数目。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-16 16:20:03 | 显示全部楼层
我之前一直不清楚哪里用到了,怕出bug,谢谢山外哥强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-16 16:20:21 | 显示全部楼层
山外メ雲ジ 发表于 2014-8-16 16:18
这个是表示FTM模块有多少个数目,因为我们的程序中没用到,所以这里可以删掉。
像LED_MAX ,就有用到,可 ...

我之前一直不清楚哪里用到了,怕出bug,谢谢山外哥强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-10-24 10:31:21 | 显示全部楼层
晕 完全看不懂 底层驱动 怎么办- -
回复 支持 反对

使用道具 举报

发表于 2014-10-24 11:08:21 | 显示全部楼层
xzh1985613 发表于 2014-10-24 10:31
晕 完全看不懂 底层驱动 怎么办- -

底层驱动代码,是有一定难度的。如果基础薄弱,建议看我们的k60书。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-12-29 12:34:20 | 显示全部楼层
请问可以发一份有FTM3的工程给我么,谢了
回复 支持 反对

使用道具 举报

发表于 2014-12-29 12:34:54 | 显示全部楼层
Mr.Orange 发表于 2014-12-29 12:34
请问可以发一份有FTM3的工程给我么,谢了

用5.2 版本的,已经集成进去了
回复 支持 反对

使用道具 举报

发表于 2014-12-29 12:44:05 | 显示全部楼层
谢了,你说的是山外的例程么
回复 支持 反对

使用道具 举报

发表于 2014-12-29 12:48:03 | 显示全部楼层
Mr.Orange 发表于 2014-12-29 12:44
谢了,你说的是山外的例程么

是啊,肯定是山外的例程
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部