查看: 5316|回复: 13

[已解决] 如何kinetis的TMP模块设置为普通的定时器?(kl02开发版)

[复制链接]
  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
    发表于 2016-6-20 11:19:56 | 显示全部楼层 |阅读模式
    本帖最后由 足球爱好者 于 2016-6-20 11:41 编辑

    路过的版友,帮忙看看是啥问题。今天看了TPM章节,就想先搞个普通定时器用作定时功能。但测试时就是进不了中断函数。

    void TPM_init(void)
    {
       EnableInterrupts;
      //开启中断
      NVIC_EnableIRQ(TPM0_IRQn);    //使能中断
      NVIC_SetPriority(TPM0_IRQn,2); //设置中断优先级
      //打开TPM0开关
      SIM->SCGC6 = 1<<SIM_SCGC6_TPM0_SHIFT;
      //选择MCGFLLCLK clock为时钟源
      SIM->SOPT2 = SIM_SOPT2_TPMSRC(1);
      //分频系数128
      TPM0->SC = TPM_SC_PS(1);

      TPM0->CNT = 0;
      TPM0->MOD = 30;  

      //使能溢出中断
      TPM0->SC = TPM_SC_TOIE_MASK ;
      //选择计数方式
      TPM0->SC = TPM_SC_CMOD(1);  
      TPM0->SC |= TPM_SC_TOF_MASK;//清除中断,

    }
    void TPM0_IRQHandler(void)
    {
      TPM0->SC |= TPM_SC_TOF_MASK;//清除中断,
      TPM0_Count++;
      if(TPM0_Count==100)
      {
        TPM0_Count=0;
        TPM0_Flag=1;
      }
    }






    最佳答案

    足球爱好者 发表于 2016-6-21 11:18 失误失误。。。忘了MOD值是16位数据了。*1000就超过它的范围了。 如果想快, 选择FLL的时钟,并且不做分频。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
     楼主| 发表于 2016-6-20 12:12:44 | 显示全部楼层
    自己先顶顶
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24864
    最后登录
    2025-7-18
    发表于 2016-6-20 12:25:39 | 显示全部楼层
    楼主你好!
    请先看下我们之前写的关于TPM的文档:
    https://www.nxpic.org.cn/module/forum/thread-563962-1-1.html
    参考下那边的代码!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-4-27 08:44
  • 签到天数: 64 天

    连续签到: 1 天

    [LV.6]常住居民II

    26

    主题

    577

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1703
    最后登录
    1970-1-1
    发表于 2016-6-21 09:32:32 | 显示全部楼层
    //分频系数128
      TPM0->SC = TPM_SC_PS(1);

      TPM0->CNT = 0;
      TPM0->MOD = 30;  

      //使能溢出中断
      TPM0->SC = TPM_SC_TOIE_MASK ;
      //选择计数方式
      TPM0->SC = TPM_SC_CMOD(1);  
      TPM0->SC |= TPM_SC_TOF_MASK;//清除中断,


    这里写的是由问题的,SC寄存器应该都用或的方式设进去,不然你这样直接赋值等,寄存器的设备就被覆盖掉了。中断使能肯定是没设进去的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
     楼主| 发表于 2016-6-21 09:35:24 | 显示全部楼层
    本帖最后由 足球爱好者 于 2016-6-21 09:36 编辑
    小恩GG 发表于 2016-6-20 12:25
    楼主你好!
    请先看下我们之前写的关于TPM的文档:
    https://www.nxpic.org.cn/module/forum/thread-563962-1-1.ht ...

    谢谢版主!!搞定了。现在有另外一个问题:就是TPM的定时器进入中断的时间可不可以把它降到ns级别?现在我用逻辑分析仪抓高低电平,发现降到1.038ms的时候怎么降MOD的值,时间都降不下去。
    void TPM_Timer_Init(void)
    {
       EnableInterrupts;
      //开启中断
      NVIC_EnableIRQ(TPM0_IRQn);    //使能中断
      NVIC_SetPriority(TPM0_IRQn,2); //设置中断优先级
      //打开TPM0开关
      SIM->SCGC6 |= 1<<SIM_SCGC6_TPM0_SHIFT;
      //选择MCGFLLCLK clock为时钟源
      SIM->SOPT2 |= SIM_SOPT2_TPMSRC(1);
      //分频系数128
      TPM0->SC |= TPM_SC_PS(7);

      TPM0->CNT = 0;
      TPM0->MOD = 1;  

      //使能溢出中断
      TPM0->SC |= TPM_SC_TOIE_MASK ;
      //选择计数方式
      TPM0->SC |= TPM_SC_CMOD(1);  
      TPM0->SC |= TPM_SC_TOF_MASK;//清除中断,

    }

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24864
    最后登录
    2025-7-18
    发表于 2016-6-21 09:56:50 | 显示全部楼层
    足球爱好者 发表于 2016-6-21 09:35
    谢谢版主!!搞定了。现在有另外一个问题:就是TPM的定时器进入中断的时间可不可以把它降到ns级别?现在我 ...

    这个取决于你的TPM时钟源:保证时钟源分频后给TPM使用的时钟也在ns级别,然后你设置MOD的时间也在ns级别。
    这样你就可以获得ns的中断了,不过如果你用逻辑分析仪抓,你要保证你的逻辑分析仪能够抓取这么高的频率。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
     楼主| 发表于 2016-6-21 10:10:06 | 显示全部楼层
    adarly 发表于 2016-6-21 09:32
    //分频系数128
      TPM0->SC = TPM_SC_PS(1);

    嗯嗯,是这样,改为|=就没事了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
     楼主| 发表于 2016-6-21 10:13:10 | 显示全部楼层
    小恩GG 发表于 2016-6-21 09:56
    这个取决于你的TPM时钟源:保证时钟源分频后给TPM使用的时钟也在ns级别,然后你设置MOD的时间也在ns级别 ...

    哦,系统时钟那块还没怎么研究,都是用默认的时钟。那得先熟悉了时钟模块再去搞ns级别的了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24864
    最后登录
    2025-7-18
    发表于 2016-6-21 10:24:33 | 显示全部楼层
    足球爱好者 发表于 2016-6-21 10:13
    哦,系统时钟那块还没怎么研究,都是用默认的时钟。那得先熟悉了时钟模块再去搞ns级别的了。 ...

    是的,你现在代码里的总线时钟是多少呢?
    如果使用了FLL,可以通过配置SIM_SOPT2[TPMSRC]=01,选择 MCGFLLCLK。
    如果MCGFLLCLK是Mhz级别的。
    然后到TPM那边不做分频,再选择一个较小的MOD,计算下定时的周期时间,如果是ns级别的,再使能中断就可以了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
     楼主| 发表于 2016-6-21 10:48:51 | 显示全部楼层
    小恩GG 发表于 2016-6-21 10:24
    是的,你现在代码里的总线时钟是多少呢?
    如果使用了FLL,可以通过配置SIM_SOPT2[TPMSRC]=01,选择 MCGFL ...

    嗯,我选择了使用FLL。输出频率是20971520。还有就是怎么计算时间的?比如我 想1ms进入一次中断,分频值为128,那MOD的值=0.001*20971520/128,此时CMT的值设置为0。按我想的计算方法,发现有错误。当我把得出MOD的值再*1000时,按我的方法计算出来应该是1s进一次中断,但是逻辑分析仪的结果是2.67ms。请问版主帮忙看看。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-19 05:49 , Processed in 0.121017 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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