查看: 3151|回复: 5

[求助] MK60DN512VLQ10单片机lptmr的设置问题

[复制链接]

该用户从未签到

29

主题

104

帖子

0

中级会员

Rank: 3Rank: 3

积分
355
最后登录
2019-1-28
发表于 2016-6-6 17:37:24 | 显示全部楼层 |阅读模式
大家好,我现在想用LPTMR模块设计成一个精确的延时函数,我对LPTMR的相关寄存器做了如下配置:
void time_delay_ms(unsigned int count_val)
{
    SIM_SCGC5 |= SIM_SCGC5_LPTIMER_MASK;       //打开LPTMR的门控时钟
       
    LPTMR0_CSR = 0x00;                                      //先关闭LPT,自动清计数器的值
           
    MCG_C1 |= MCG_C1_IRCLKEN_MASK;          //使能内部参考时钟供给MCGIRCLK,MCGIRCLK时钟活跃

    MCG_C2 |= MCG_C2_IRCS_MASK;             //使能内部快速参考时钟(2MHz),若MCG_C2[IRCS]=0表示使能内部慢速参考时钟(32K)
       
    LPTMR0_CMR = LPTMR_CMR_COMPARE(count_val);   //设置LPTMR比较寄存器的数值
           
    LPTMR0_PSR |= (LPTMR_PSR_PCS(0) | LPTMR_PSR_PBYP_MASK); //分频器时钟选择0,表示时钟源为MCGIRCLK,分频参数0x8表示512分频
                                                                //LPTMR_PSR_PCS(0):MCGIRCLK作为分频器的时钟源
                                                                //LPTMR_PSR_PCS(1):LPO(1KHz)作为分频器的时钟源
                                                                //LPTMR_PSR_PCS(2):ERCLK32K作为分频器时钟源
                                                                //LPTMR_PSR_PCS(3):OSCERCLK作为分频器的时钟源
    LPTMR0_CSR &= ~LPTMR_CSR_TMS_MASK;      //LPTMR工作在定时器计数模式  

    LPTMR0_CSR |= LPTMR_CSR_TEN_MASK;          //LPTMR使能

    while(!(LPTMR0_CSR & LPTMR_CSR_TCF_MASK)){;} //等待计数器达到比较值

    LPTMR0_CSR &= ~LPTMR_CSR_TEN_MASK;            //LPTMR禁止

    return;
}

通过如上配置,lptmr的时钟为2MHZ,再根据定时计算公式,
QQ截图20160606173156.png
可得,当调用time_delay_ms(1);函数时为延时1us,我在主函数中这样写:
while(1)
    {
                 DrvGPIO_Open(PORTD, 15, GPIO_OUTPUT, 0);
       
                time_delay_ms(1);
               
                DrvGPIO_Open(PORTD, 15, GPIO_OUTPUT, 1);
       
                time_delay_ms(1);
        }

但是,我用示波器却抓不到波形,单步调试了下,发现程序死在这一句   
while(!(LPTMR0_CSR & LPTMR_CSR_TCF_MASK)){;} //等待计数器达到比较值
找了一天,也没找出原因,希望大家给指点一下,多谢!


我知道答案 目前已有5人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-9-14 09:26
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    70

    主题

    329

    帖子

    0

    高级会员

    Rank: 4

    积分
    952
    最后登录
    2021-1-4
    发表于 2016-6-7 09:28:48 | 显示全部楼层
    先单步看看counter的值变不变?

    程序结构有问题,最好改成中断模式

    想用查询模式也行,但是要把初始化代码和查询代码分开。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    355
    最后登录
    2019-1-28
     楼主| 发表于 2016-6-7 11:58:53 | 显示全部楼层
    healy_sun 发表于 2016-6-7 09:28
    先单步看看counter的值变不变?

    程序结构有问题,最好改成中断模式

    非常感谢您的回答,我再改下试试。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25453
    最后登录
    2025-9-4
    发表于 2016-6-7 14:28:49 | 显示全部楼层
    天天都有好心情 发表于 2016-6-7 11:58
    非常感谢您的回答,我再改下试试。

    查询方式也是可以运行的。
    你配置的时候看看,你相关的寄存器值是不是对的?
    可以把CMR的值稍微设大点,然后刷刷CNR,看看值是否会有增加。
    如果不增加,就需要看看时钟源问题了,你也可以换成LPO的试试。
    下面是官方使用LPO的代码:
    void time_delay_ms(uint32 count_val)
    {
      /* Make sure the clock to the LPTMR is enabled */
      SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK;
      
      /* Set the compare value to the number of ms to delay */
      LPTMR0_CMR = count_val;
      
      /* Set up LPTMR to use 1kHz LPO with no prescaler as its clock source */
      LPTMR0_PSR = LPTMR_PSR_PCS(1)|LPTMR_PSR_PBYP_MASK;
      
      /* Start the timer */
      LPTMR0_CSR |= LPTMR_CSR_TEN_MASK;

      /* Wait for counter to reach compare value */
      while (!(LPTMR0_CSR & LPTMR_CSR_TCF_MASK));
      
      /* Clear Timer Compare Flag */
      LPTMR0_CSR &= ~LPTMR_CSR_TEN_MASK;
      
      return;
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    355
    最后登录
    2019-1-28
     楼主| 发表于 2016-6-7 15:41:23 | 显示全部楼层
    小恩GG 发表于 2016-6-7 14:28
    查询方式也是可以运行的。
    你配置的时候看看,你相关的寄存器值是不是对的?
    可以把CMR的值稍微设大点, ...

    恩,非常感谢您的回答,我用LPO时钟的时候是可以运行的,但是换成其他时钟就不能运行了,我也是很郁闷,我再找下原因吧。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25453
    最后登录
    2025-9-4
    发表于 2016-6-7 15:46:28 | 显示全部楼层
    天天都有好心情 发表于 2016-6-7 15:41
    恩,非常感谢您的回答,我用LPO时钟的时候是可以运行的,但是换成其他时钟就不能运行了,我也是很郁闷, ...

    看来MCGIRCLK没有配置好输出。
    你可以直接测试下IRCLK是不是有,
    CLKOUT引脚,SIM_SOPT2[CLKOUTSEL]=100.
    测试下,时钟是否有输出。
    如果没有输出,把IRCLK相关通路的寄存器debug检查下。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-7 04:01 , Processed in 0.100623 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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