查看: 4831|回复: 9

[已解决] LPC54608标准定时器使用疑问

[复制链接]

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
发表于 2018-1-25 13:15:02 | 显示全部楼层 |阅读模式
用54608的标准定时器CTimer做了个ms延时函数,以下是函数:
void DelayMs(uint16_t  u16delayms)
{
        ctimer_config_t config;
        ctimer_match_config_t matchConfig;
        /* Enable the asynchronous bridge */
        SYSCON->ASYNCAPBCTRL = 1;
        /* Use 12 MHz clock for some of the Ctimers */
        CLOCK_AttachClk(kFRO12M_to_ASYNC_APB);
        CTIMER_GetDefaultConfig(&config);
        CTIMER_Init(DELAYCTIMER3, &config);


        matchConfig.enableCounterReset = true;
        matchConfig.enableCounterStop = false;
        matchConfig.matchValue = u16delayms*12000;
        matchConfig.outControl = kCTIMER_Output_NoAction;
        matchConfig.outPinInitState = false;
        matchConfig.enableInterrupt = false;
        CTIMER_SetupMatch(DELAYCTIMER3, CTIMER_MAT_OUT, &matchConfig);
        CTIMER_StartTimer(DELAYCTIMER3);
       
}


请问我在函数StartTimer后,需要等待计时器到后关闭定时吗?定时时间到后,TCR是自动置位的吗?因为配置里,计数到后复位计数器enableCounterReset = true;

最佳答案

我用直接操作寄存器的方法可以工作了。 SYSCON->AHBCLKCTRL[1] |= (1<<22);                           CT ...
回复

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24903
最后登录
2025-7-22
发表于 2018-1-25 16:38:02 | 显示全部楼层
实验一下就知道了
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2018-1-30 21:02:34 | 显示全部楼层
小恩GG 发表于 2018-1-25 16:38
实验一下就知道了

你好。晚上看了下这个延时函数发现有点问题。如果配置成翻转IO使LED闪烁
        matchConfig.enableCounterReset = true;
        matchConfig.enableCounterStop = false;
        matchConfig.matchValue = u16delayms*12000;
        matchConfig.outControl = kCTIMER_Output_Toggle;
        matchConfig.outPinInitState = false;
        matchConfig.enableInterrupt = false;
        CTIMER_SetupMatch(DELAYCTIMER3, CTIMER_MAT_OUT, &matchConfig);
        CTIMER_StartTimer(DELAYCTIMER3);不管配置成多少ms。都可以得到想要的结果。
但是如果配置成延时函数那种:
        ctimer_match_config_t matchConfig;
        matchConfig.enableCounterReset = true;
        matchConfig.enableCounterStop = false;
        matchConfig.matchValue = u16delayms*12000;
        matchConfig.outControl = kCTIMER_Output_NoAction;
        matchConfig.outPinInitState = false;
        matchConfig.enableInterrupt = false;
        CTIMER_SetupMatch(DELAYCTIMER3, CTIMER_MAT_OUT, &matchConfig);
        CTIMER_StartTimer(DELAYCTIMER3);
        while(DELAYCTIMER3->MCR& CTIMER_MCR_MR1R_MASK);//等待计时时间到来,时间到来定时器会复位,等待复位标志
        CTIMER_StopTimer(DELAYCTIMER3);



我在主函数里只执行
           PRINTF("test1\r\n");
            DelayMs(1000);
             PRINTF("test2\r\n");
就看不到打印test2
       



回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24903
最后登录
2025-7-22
发表于 2018-1-31 09:23:55 | 显示全部楼层
好的,这个问题你可以对照着寄存器配置来看,在debug时看看寄存器配置差别在哪里!
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2018-1-31 09:41:11 | 显示全部楼层
小恩GG 发表于 2018-1-31 09:23
好的,这个问题你可以对照着寄存器配置来看,在debug时看看寄存器配置差别在哪里! ...

你好,配置区别就是输出控制outControl,配置的是EMR(Timer external match registers )这个寄存器,
reg |= (uint32_t)config->outControl << (CTIMER_EMR_EMC0_SHIFT + (matchChannel * 2));
这个是控制引脚输出:
0x0 Do Nothing.
0x1 Clear. Clear the corresponding External Match bit/output to 0 (MAT1 pin is LOW if pinned out).
0x2 Set. Set the corresponding External Match bit/output to 1 (MAT1 pin is HIGH if pinned out).
0x3 Toggle. Toggle the corresponding External Match bit/output.现在是定时器模式,因此我配置0x0,Do nothing
之前那个配置是0x3,翻转IO
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2018-2-9 16:14:16 | 显示全部楼层
自顶不沉
回复

使用道具 举报

该用户从未签到

1

主题

4

帖子

1

注册会员

Rank: 2

积分
52
最后登录
2022-12-14
发表于 2018-4-3 13:26:20 | 显示全部楼层
楼主这个问题是否已经解决?
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

4

帖子

1

注册会员

Rank: 2

积分
52
最后登录
2022-12-14
发表于 2018-4-3 15:28:26 | 显示全部楼层
我也遇到和你相同的问题,请赐教。
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2018-4-3 18:58:11 | 显示全部楼层
b12524 发表于 2018-4-3 15:28
我也遇到和你相同的问题,请赐教。

木有搞定
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

4

帖子

1

注册会员

Rank: 2

积分
52
最后登录
2022-12-14
发表于 2018-4-4 14:56:17 | 显示全部楼层
我用直接操作寄存器的方法可以工作了。


SYSCON->AHBCLKCTRL[1] |= (1<<22);                  
        CTIMER2->TCR = 0x02;                              
        CTIMER2->PR  = 48000;                              
        CTIMER2->MR[0] = delayms;
        CTIMER2->IR  = 0xff;                              
        CTIMER2->MCR = 0x04;                              
        CTIMER2->TCR = 0x01;                             

           while (CTIMER2->TCR & 0x01);                    
           CTIMER2->TCR = 0x00;         

评分

参与人数 1 +1 收起 理由
NXP管管 + 1

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-22 19:52 , Processed in 0.111329 second(s), 32 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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