查看: 5632|回复: 1

[原创] LPC55S69 CTIMER定时器

[复制链接]
  • TA的每日心情
    无聊
    2021-12-29 19:06
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    49

    主题

    188

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    1392
    最后登录
    2025-3-4
    发表于 2020-1-8 21:38:21 | 显示全部楼层 |阅读模式
    本帖最后由 day_day 于 2020-1-12 18:14 编辑

    (一)选择时钟源
    1. CLOCK_AttachClk(kFRO1M_to_CTIMER0);
    复制代码


    该时钟似乎是一个内部固有的时钟,可以直接作为CTIMER外设的时钟源,固定1M,不可配置频率,主要是供给看门狗使用的,但用这个时钟相当方便。
    当然,使用这个时钟之前,我们需要在图形界面配置启动这个时钟:
    1.png



    (二)初始化定时器,设置分频系数等配置



    1. const ctimer_config_t timer_CTIMER0_config = {
    2.                         .mode = kCTIMER_TimerMode,
    3.                         .input = kCTIMER_Capture_0,
    4.                         .prescale = 0
    5.         };
    复制代码
    1. CTIMER_Init(CTIMER0, &timer_CTIMER0_config);
    复制代码



    这个函数配置PR寄存器,当PC寄存器和PR寄存器匹配时,清除PR寄存器,TC寄存器(定时器用于计数的主要寄存器)加一,从而实现分频

    (三)配置匹配相关寄存器



    1. const ctimer_match_config_t timer_CTIMER0_Match_0_config = {
    2.                         .matchValue = 100,
    3.                         .enableCounterReset = true,
    4.                         .enableCounterStop = true,
    5.                         .outControl = kCTIMER_Output_NoAction,
    6.                         .outPinInitState = false,
    7.                         .enableInterrupt = true
    8.         };
    9. CTIMER_SetupMatch(CTIMER0,kCTIMER_Match_0,&timer_CTIMER0_Match_0_config);
    复制代码



    CTIMER定时匹配时,MRx寄存器控制了匹配的数值
    2.png
    用户手册P537显示,这个寄存器有32个位
    3.png
    即最大可以匹配4294967295,若是通过时钟源选择的分频设置CTIMER累加频率为1M,则最多可以数四千多秒,即一个小时多点。
    MCR寄存器则控制了中断相关事宜以及重装载(当MRxTC匹配后,是否清零TC




    (四)设置回调函数

    1. ctimer_callback_t timer_CTIMER0_callbackFunc[] = {CTIMER0_IntMa0CallBack, NULL, NULL, NULL, NULL, NULL, NULL, NULL};

    2. CTIMER_RegisterCallBack(CTIMER0, timer_CTIMER0_callbackFunc, kCTIMER_MultipleCallback);
    复制代码



    值得注意的是,这个timer_CTIMER0_callbackFunc变量必须作为全局变量,具体没有深究过,作为局部变量是,会因为函数结束而停止生命周期,被释放掉,从而在执行过程中产生硬件错误,进入HardFault_Handler()。这个问题应该可以通过static解决,但具体没有尝试。

    此外,还需要学习两个主要的寄存器IR(中断寄存器,主要是各种标志位)、TCR寄存器(配置计数器基本功能)



    (五)修改

    可以通过修改CTIMER0->MR0来修改匹配值,或者调用函数
    1. <font color="black" size="4">void CTIMER0_ChangeMatchValue(uint32_t inpu_value)
    2. {
    3.         const ctimer_match_config_t timer_CTIMER0_Match_0_config = {
    4.                         .matchValue = inpu_value,
    5.                         .enableCounterReset = true,
    6.                         .enableCounterStop = true,
    7.                         .outControl = kCTIMER_Output_NoAction,
    8.                         .outPinInitState = false,
    9.                         .enableInterrupt = true
    10.         };

    11.         CTIMER_SetupMatch(CTIMER0, kCTIMER_Match_0, &timer_CTIMER0_Match_0_config);
    12. }</font>
    复制代码

    不需要重新初始化,节省效率









    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4692

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10093
    最后登录
    2025-8-8
    发表于 2020-1-9 10:28:12 | 显示全部楼层
    回调函数的魅力啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-16 02:57 , Processed in 0.083554 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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