打印
[Kinetis]

k60 DN512VLQ芯片,LPTMR 计脉冲数遇到的问题

[复制链接]
3868|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
    用的野火的例程,用LPTMR 计脉冲数,开始用的 带"Z"的芯片,一切正常,但是换不带“Z”的芯片后,脉冲数始终为0,该芯片其他其他功能正常。
   查阅资料后,发现,带 Z 的芯片是第一批生产的,不带Z 的是第二批,意思是比前一批有许多改进。

关于LPTMR 定时器的改动如图片,是说如果要读  计数寄存器,必须先写一个任意数进去?
不管怎样,先试试程序,下午回来再试,想先问问大家有没有这样的情况?

相关帖子

沙发
FSL_TICS_Robin| | 2014-3-28 10:05 | 只看该作者
恩,的确如Kinetis 100 MHz Rev 1.x to Rev 2.x Migration Guide这篇AN中提到的需要先写操作再读。
你在V2版本的手册中也可以看到读LPTMR counter的描述:


使用特权

评论回复
板凳
mengyu139|  楼主 | 2014-3-28 12:25 | 只看该作者
FSL_TICS_Robin 发表于 2014-3-28 10:05
恩,的确如Kinetis 100 MHz Rev 1.x to Rev 2.x Migration Guide这篇AN中提到的需要先写操作再读。
你在V2 ...

嗯,我在程序中加入一句写操作后,可以正常读取脉冲数了

使用特权

评论回复
地板
FSL_TICS_Robin| | 2014-3-28 13:42 | 只看该作者
mengyu139 发表于 2014-3-28 12:25
嗯,我在程序中加入一句写操作后,可以正常读取脉冲数了

使用别人的库函数,首先应该了解库的应用范围,了解是否适合自己的芯片使用。
如果使用库遇到问题,的确应该像楼主这样根据手册上寄存器说明为准。

使用特权

评论回复
5
jd972594| | 2014-3-28 16:16 | 只看该作者
FSL_TICS_Robin 发表于 2014-3-28 10:05
恩,的确如Kinetis 100 MHz Rev 1.x to Rev 2.x Migration Guide这篇AN中提到的需要先写操作再读。
你在V2 ...

玩K60的还真得关注一下这篇应用手册

使用特权

评论回复
6
FSL_TICS_ZJJ| | 2014-4-2 10:18 | 只看该作者
jd972594 发表于 2014-3-28 16:16
玩K60的还真得关注一下这篇应用手册

是的,这两个版本的差异还是蛮大的,如果有问题,欢迎提出交流。

使用特权

评论回复
7
jinpeng121| | 2014-7-8 19:16 | 只看该作者
mengyu139 发表于 2014-3-28 12:25
嗯,我在程序中加入一句写操作后,可以正常读取脉冲数了

对不起,我还有点懵,请问怎么加写入程序,在哪加???谢谢。

使用特权

评论回复
8
mengyu139|  楼主 | 2014-7-8 21:55 | 只看该作者
jinpeng121 发表于 2014-7-8 19:16
对不起,我还有点懵,请问怎么加写入程序,在哪加???谢谢。

在LPTMR.c  文件里面,定义的函数,加上一句就行了

使用特权

评论回复
9
mengyu139|  楼主 | 2014-7-8 21:56 | 只看该作者
mengyu139 发表于 2014-7-8 21:55
在LPTMR.c  文件里面,定义的函数,加上一句就行了

我用的是野火的库

使用特权

评论回复
10
jinpeng121| | 2014-7-9 07:11 | 只看该作者
我用的也是,
void lptmr_counter_init(LPT0_ALTn altn, u16 count, u8 PrescaleValue, LPT_CFG cfg)
{

    if(PrescaleValue > 0x0f)PrescaleValue = 0x0f;

    //设置输入管脚
    if(altn == LPT0_ALT1)
    {
        SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;  //打开 PORTA 时钟
        PORTA_PCR19 = PORT_PCR_MUX(0x6);    //在PTA19上使用 ALT6
        LPT0_flag=1;
    }
    else if(altn == LPT0_ALT2)
    {
        SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;  //使能 PORTC 时钟
        PORTC_PCR5 = PORT_PCR_MUX(0x4);     //在PTC5上使用 ALT4
        LPT1_flag=1;
    }
    else                                    //不可能发生事件
    {
        assert_failed(__FILE__, __LINE__);  //设置管脚有误?
    }

    /* 开启模块时钟 */
    SIM_SCGC5 |= SIM_SCGC5_LPTIMER_MASK;    //使能LPT模块时钟

    /* 清状态寄存器 */
    LPTMR0_CSR = 0x00;                      //先关了LPT,这样才能设置时钟分频等

    /* 设置累加计数值  */
    LPTMR_CMR_REG(LPTMR0_BASE_PTR)  =   LPTMR_CMR_COMPARE(count);                       //设置比较值

    /* 时钟选择 */
    LPTMR_PSR_REG(LPTMR0_BASE_PTR)  =   LPTMR_PSR_PCS(0x1) | LPTMR_PSR_PBYP_MASK  |  LPTMR_PSR_PRESCALE(PrescaleValue);        //使用 LPO clock 且 bypass glitch filter
    //                                                        开启和配置脉冲滤波器:2^n个时钟上升沿才识别

    /* 管脚设置、使能中断  */
    LPTMR_CSR_REG(LPTMR0_BASE_PTR)  =   LPTMR_CSR_TPS(altn) | LPTMR_CSR_TMS_MASK  | ( cfg == LPT_Falling ?  LPTMR_CSR_TPP_MASK :   0  )  | LPTMR_CSR_TEN_MASK  | LPTMR_CSR_TIE_MASK  ;
    //                                       选择输入管脚        选择脉冲计数                                   下降沿       上升沿           使能LPT
    // TFC = 0,即计数值等于比较值时,计数值复位

    enable_irq(LPTMR_irq);                        //开引脚的IRQ中断
}
这怎么加.....求指教,非常谢谢

使用特权

评论回复
11
mengyu139|  楼主 | 2014-7-9 08:44 | 只看该作者
jinpeng121 发表于 2014-7-9 07:11
我用的也是,
void lptmr_counter_init(LPT0_ALTn altn, u16 count, u8 PrescaleValue, LPT_CFG cfg)
{

uint16 lptmr_pulse_get(void)
{
    uint16 data;
    if(LPTMR0_CSR & LPTMR_CSR_TCF_MASK)     //已经溢出了
    {

        data = ~0;                          //返回 0xffffffff 表示错误
    }
    else
    {
#if defined(MK60F15)
        LPTMR0_CNR = 0;
#endif



        data = LPTMR0_CNR;
    }
    return data;
}


data = LPTMR0_CNR;  之前,先给LPTMR0_CNR随便附一个值。

使用特权

评论回复
12
FSL_TICS_Robin| | 2014-7-9 08:55 | 只看该作者
jinpeng121 发表于 2014-7-9 07:11
我用的也是,
void lptmr_counter_init(LPT0_ALTn altn, u16 count, u8 PrescaleValue, LPT_CFG cfg)
{

难道野火的库现在还只支持型号带“Z”的芯片吗?
因为型号是否带“Z”有些地方程序需修改,所以各位使用第三方函数库时需注意AN4445


使用特权

评论回复
13
jinpeng121| | 2014-7-9 09:04 | 只看该作者
mengyu139 发表于 2014-7-9 08:44
uint16 lptmr_pulse_get(void)
{
    uint16 data;

请问一下,我设置过了,为神门中断进不去呀???

使用特权

评论回复
14
FSL_TICS_ZJJ| | 2014-7-9 09:09 | 只看该作者
jinpeng121 发表于 2014-7-9 09:04
请问一下,我设置过了,为神门中断进不去呀???


你好,应该是你配置有问题,
在我们的中文资料中有一篇关于LPTMR的,你可以看看那边的配置:https://bbs.21ic.com/icview-618648-1-1.html

使用特权

评论回复
15
jinpeng121| | 2014-7-9 09:19 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-7-9 09:09
你好,应该是你配置有问题,
在我们的中文资料中有一篇关于LPTMR的,你可以看看那边的配置:http://bbs.2 ...

这个我也有,请问一下配置那里有可能会出问题,根据你的经验,谢谢

使用特权

评论回复
16
FSL_TICS_ZJJ| | 2014-7-9 09:44 | 只看该作者
jinpeng121 发表于 2014-7-9 09:19
这个我也有,请问一下配置那里有可能会出问题,根据你的经验,谢谢

这样吧,你发一个新贴出来,我们在新的问题贴里面讨论,不要跟在别人已结贴后面。
告诉我你使用的芯片型号,你的配置,以及中断处理情况。还有你使用的编译环境。

使用特权

评论回复
17
jinpeng121| | 2014-7-9 10:30 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-7-9 09:44
这样吧,你发一个新贴出来,我们在新的问题贴里面讨论,不要跟在别人已结贴后面。
告诉我你使用的芯片型 ...

我已经发过了,希望所有人都进来讨论,一起学习,一起解决问题。。。
https://bbs.21ic.com/forum.php?mod=viewthread&tid=764970&extra=

使用特权

评论回复
18
jinpeng121| | 2014-7-9 16:47 | 只看该作者
mengyu139 发表于 2014-7-9 08:44
uint16 lptmr_pulse_get(void)
{
    uint16 data;

#if defined(MK60F15)
         LPTMR0_CNR = 0;
#endif
里的MK60F15这是什么意思,谢谢

使用特权

评论回复
19
mengyu139|  楼主 | 2014-7-9 20:30 | 只看该作者
jinpeng121 发表于 2014-7-9 16:47
#if defined(MK60F15)
         LPTMR0_CNR = 0;
#endif

这个估计是 野火做的一些定义,是为了切换不同芯片方便,可以忽略

使用特权

评论回复
20
mengyu139|  楼主 | 2014-7-9 20:33 | 只看该作者
jinpeng121 发表于 2014-7-9 09:04
请问一下,我设置过了,为神门中断进不去呀???

你看看你使能 此中断没有,使能总中断没有,初始化没有,接的引脚对了没有,程序执行到这一句没有,用仿真看看有没有收到数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

57

帖子

0

粉丝