This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2538:CC2538 - MAC 定时器配置

Guru**** 2502455 points
Other Parts Discussed in Thread: CC2538

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/930683/cc2538-cc2538---mac-timer-configuration

器件型号:CC2538

您好!

我正在阅读与 cc2538无线电的 MAC 计时器相关的用户手册、我在理解所提供的一些操作时遇到了困难。
我主要关注定时器比较和计数器溢出比较模式、因为我想使用它们通过 CSP 命令来调度 TX/RX 操作。

我的疑问是、使用上述两个操作的计时器周期。

通过阅读手册、我了解到:
定时器包含一个24位溢出计数器和一个16位定时器计数器。
2.定时器计数器在每个时钟周期更新1、在系统时钟(32MHz、精度为31.25ns)时节拍

此外、还报告说、每当设置的周期结束时、溢出计数器都会递增、但我不确定它所指的周期、因为我正在使用比较运算。

该周期是否只是为16位宽定时器计数器和31.25ns 精度提供可实现的最大增量时间,大约为2.0479ms?

非常感谢您的关注。

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当定时器计数到等于"设置定时器周期"的值时、会发生"定时器溢出"。
    "设置定时器周期"是可配置的(请参阅 用户指南中的1.3.5.1 MAC 定时器)。 若要设置此值:在写入 RFCORE_SFR_MTMSEL.MTMSEL 之前、RFCOR_SFR_MTM0 和 RFCOR_SFR_MTM1时、RFCOR_SFR_MTMSEL 应为010。

    由于这是一个16位值、最大周期将根据您的计算结果、即2.0479ms (0xFFFF/32MHz)。

    "上溢计数比较"比较值可以采用类似的方式进行设置(请 参阅 RFCORE_SFR_MTMSEL.MTMOVFSEL)。

    此致、
    Toby

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复、非常感谢。

    不幸的是,这没有回答我原来的问题。 也许我没有清楚地说明。

    我将以具体的例子来解释这个问题。

    假设 MAC 定时器为0x00000001 (考虑到整个40位 MAC 定时器)。
    我想将一个事件设置为在上面的时间戳之后大约8.192ms 被触发。

    由于这个延迟基本上是(1 << 18)、所以我用值0x0000040001来设置 MAC 定时器和溢出寄存器。

    请注意、上面的时间戳表示:
    24位溢出值设为0x4
    16位定时器的值设为0x1

    然后、我启用其中一个计时器作为溢出比较匹配事件、另一个计时器作为计数器比较匹配事件。
    我使用 CSP 命令首先等待溢出事件、然后等待计数器事件。

    问题是:第二个事件将在 a) 8.192ms 或 b) 125ns (31.25ns * 4)之后触发?
    根据用户手册和您的答案、选项 b 就是这种情况。

    但是、通过使用由我使用的板提供的二级32KHz 计时器并对该延迟进行时间戳、"似乎"选项 A 是可能的。

    希望这个例子能让事情变得更清楚。
    非常感谢您的参与。

    此致、
    迭戈

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Diego Lobba"]

    然后、我启用其中一个计时器作为溢出比较匹配事件、另一个计时器作为计数器比较匹配事件。
    我使用 CSP 命令首先等待溢出事件、然后等待计数器事件。

    问题是:第二个事件将在  a) 8.192ms 或  b) 125ns (31.25ns * 4)之后触发?

    [/报价]

    您能澄清一下"第二次事件"是什么意思吗?
    这是指"计数器事件":
    事件1:溢出比较匹配事件
    事件2:计数器比较匹配  <--这是"第二个事件"吗?

    这是指第二个事件序列:
    事件1:溢出比较匹配事件、计数器比较匹配
    事件2:溢出-比较-匹配事件,计数器-比较匹配  <--这是“第二个事件”吗?

    如果使用比较值, 则为 MT_CMP1、 MT_cmp2、 MTovf_CMP1、 MTovf_cmp2设置了哪些值?

    您能否分享以下内容的一些代码片段:
    -如何写入与 MAC 定时器相关的寄存器?
    -如何使用32KHz 计时器确定事件之间的时间?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    关于事件顺序、我是指您提到的第一个事件(溢出-比较-匹配、然后是计数器-比较-匹配)。

    我用来设置 MAC 定时器寄存器的代码如下:

    /*将 MTMOVFSEL 位设置为011、因为我们要设置溢出比较1值*/
    REG (RFCORE_SFR_MTMSEL)=(REG (RFCORE_SFR_MTMSEL)&~RFCOCOR_SFR_MTMSEL)| 0x00000030;
    REG (RFCOR_SFR_MTF0)
    
    =(FR_VMTF0)+ TR_TR_TR_TR_TRF0 (MTR_TR_TR_TRF0)= TR_TRF_TRF0 (VMTVST_TRF0 + TRF_TRF_TRF0)= TR_TR_TRF0 (VMTVST_TRF0 + TRF_TR_TRF32)+ TR_TRF_TRF_TRF_TRF_TRF_TRF_TRF_TRF_TRF0 (TRF_TRF_TRF_TRF_TRF0)= TR_TR_TRF_TRF_TRF_TRF_TRF_TRF_TRF_TRF32)= TRF_TRF_TRF_TRF0 (MT
    
    //
    将 MTMSEL 位设置为011,因为我们要设置计数器比较1值*/ REG (RFCORE_SFR_MTMSEL)=(REG (RFCORE_SFR_MTMSEL)&~RFCOR_SFR_MTMSEL)| 0x00000003;
    REG (RFCOR_SFR_MTMSEL)=(RFCOR_MTM0
    )+ TR_MTRM32_TR_TR_TR_TRF_MTM1 (TR_TR_TR_TRF_TREMT)= 0x0000_MTRM32_TR_TR_TR_TR_TRF_TRF_TRF_TRF_TRF_MTM0)
    
    /*我们仅在需要超过1次溢出时使用溢出事件。 */
    if ((ts_TX_mT >> 16)-(t_now >> 16)> 1){
    /*启用 MAC 定时器事件1 (EVENT1)的溢出比较匹配*
    REG (RFCORE_SFR_MTCSPCFG)=(REG (RFCORE_SFR_MTCSPCFG)
    &~RFCORE_SFR_MTCSPCFG_MACTIMER_EVENT1_CFG)| 0x00000004;
    /*写入指令以等待 MAC 定时器溢出匹配发生(事件1)*/
    REG (RFCORE_SFR_RFST)= CC2538_RF_CSP_OP_WEVENT1;
    }
    
    /*启用 MAC 定时器事件2 (EVENMT)作为计数器比较匹配*/
    REG (RFCORE_SFR_MTCSPCFG)=(REG (RFCORE_SFR_MTCSPCFG)
    &~RFCORE_SFR_MTCSPCFG_MACTIME_EVENMT_CFG)| 0x00000010;
    
    //加载等待(EVENT1)、EVENT_MT 然后 TX 并最终停止的 CSP 程序* 

    
    

    有关32kHz 计时器的更多信息。 我正在使用 Contiki 运行程序、该程序被编程为使用32kHz 计时器来运行计时器(操作系统提供的一种计时器类型)。
    因此、我只需请求并标记从计划操作到其结束之间经过的时间

    我执行了一个自包含应用程序、该应用程序打印与计划 TXS 相关的时间戳的值以及使用32kHz 计时器检索到的保存的时间戳。
    可从此处获取。

    非常感谢您的帮助。

    此致、
    迭戈

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您共享代码。

    下面是我认为正在发生的情况。

    从代码片段中、您将按如下间隔调度无线电 TX:
    MT_COUNT ()+[0x000004][0x0000]
    MT_COUNT ()+ [0x000008][0x0000]
    MT_COUNT ()+ [0x00000C][0x0000]
    (笑声)
    MT_COUNT ()+ [0x000004][0x0000]* n
    (笑声)
    其中 MT_COUNT()是[溢出计数、24位][Mac 计时器计数、16位]的当前读取值

    我看到您使用上述值来设置 MTovf_CMP1和 MT_CMP1来完成此操作。 但是、我看不到您写入 MT_PER 值的位置、该值决定 了 MTovf 递增的间隔。 我将假设这是0xFFFF 的最大值。

    现在、执行从时间 T 开始的采样序列:

    1. 等待 MTovf_CMP1中值的溢出比较事件。
      这将在 0x4 * MT_PER/32MHz = 8.192ms 后发生
    2. 等待值 为 MT_CMP1的定时器比较事件。
      假定定时器比较值刚刚溢出(在上一次溢出计数迭代期间)、这将很快发生、而不是8ms。

    因此、第二个事件之后的总等待时间大约是 T 之后的8ms

    这是假设16位 MTim 的周期为0xFFFF (~2ms)。 您可以通过设置 MT_PER 来调整此周期。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢!

    我将再次检查 MT_PER 的值。 实际上、我的代码中从未设置过该值、可能所有值都在这种假设下工作。

    此致、
    迭戈