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.

[参考译文] TM4C1294NCPDT:使用全宽定时器捕捉边沿时间-解释预分频

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/592675/tm4c1294ncpdt-using-full-width-timer-for-edge-time-capture---explaining-prescale

器件型号:TM4C1294NCPDT

男士、

刚刚遇到了一个"需求"、我认为这是可能的、但现在我不确定:我想使用计时器来捕获4个事件、这些事件所需的时间超过16位计数就足够了。

我的信号被接至 TxCCP0。 典型周期为~1ms。 下图显示了正在测量的 PWM 信号以及低于该信号的16位计时器、系统时钟设置为120MHz。

转换通过 DMA 自动传输到阵列- DMA 是读取定时器的侵入性更低的方法。 但是、该特定信号跨越两个以上的计时器翻转、因此我无法仅使用一个16位计时器来使用该解决方案。

下面的一些想法(我在撰写问题时正在阅读数据表、因此可能会同时出现答案... 但为了确认或提出建议、让我们保留它!)

-如果我仅 使用 TIMER_CFG_A_CAP_TIME 调用 TimerConfigure()而不使用 TIMER_CFG_SPLIT_PAIR,则计时器的"B"部分是否会在部件"A"的每个卷轴减少1个单元,同时仍使 CCP 处于活动状态?
(否、在发生转换时不执行中断/DMA)。

-使用预分频器:在查看数据表和 driverlib 用户指南时、预分频器的使用并不是很清楚。 很明显,没有任何函数可以“启用”它-所以我想知道,仅仅通过 TimerPrescaleSet()写入一个值的事实是否会启用它? 如果值为0x00该怎么办? 除了写入一个寄存器之外、该函数的作用是...

我们能否借此机会正确解释每个预分频寄存器的作用?

- GPTMTAPR (简单的称为预分频):由具有 TimerPrescaleSet()的 TivaWare 修改并使用 TimerPrescaleGet ()读取;
它有什么作用,用人的英语?

- GPTMTAPMR (预分频匹配):使用 TimerPrescaleMatchSet()修改并使用 TimerPrescaleMatchGet ()读取;
它的作用是什么?

- GPTMTAPS (预分频快照):无 TivaWare 函数。
它的作用是什么?

为便于说明/搜索、寄存器为 TimerA 进行硬编码。

为了便于记录、我还通过此链接寻求帮助、但随后在文章中提到了一个 TAPV 寄存器、以使事情更具挑战性、因为它不会出现在数据表寄存器表中...
e2e.ti.com/.../354038

总之、真正好的特性是文档令人困惑、但使用起来很简单: 我在定时器配置之后向预分频器添加了一个非零值、并且根据数据表的 GPTM 章节、寄存器说明、条目18 (GPTMTAR)、捕捉事件发生时的预分频器值被自动传输到该寄存器的位23-16! 因此、我只需不执行任何操作就可以读取它、计时器现在是24位。

TimerConfigure (TIMER0_BASE、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP));
TimerPrescaleSet (TIMER0_BASE、TIMER_A、4);

很抱歉这个曲折的帖子、正如它在研究期间所写的那样-这里有一些未回答的问题、主要是由于误导性的文档-帮助/洞察最受欢迎! 但也有一些有用的结论。

此致

布鲁诺

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

    您好、Bruno、

     您并不是唯一一个难以理解计时器的人。 我第一次读取它时遇到同样的问题。 我认为图表会大有帮助。  

     如果您使用输入捕获时间模式、则无需使用 GPTMTAPMR 和 GPTMTAPS。  

     物理上有一个8位预分频寄存 器 GPTMTAPR 和一个16位 GPTMAILR 寄存器。 这两个寄存器连接在一起形成一个24位预加载寄存器。 如果您处于递减计数模式、则24位预加载寄存器将加载到自由运行计数器 GPTMTAV 中。 从物理角度讲、GPTMTAV 仅为24位。 数据表中显示的是32位、但高8位只是绑定的零。 GPTMTAV 的31:24没有物理触发器。 当检测到边沿时、GPTMTAV 寄存器的快照(或另一个字中的时间戳)被传输到 GPTMTAR 寄存器。 由于在向上计数模式中使用 TIMER_CFG_A_CAP_TIME_UP、因此首先将0加载24位 GPTMTAV。 它将递增计数、直到 GPTMTAPR 和 GPTMAIRL 中定义的上限超时、然后再次复位为零。

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

    [引述用户="Charles Tsaaa"]您并非孤军奋战[/引述]

    这些(确切的)词是否曾经在这里使用过-现在"重复了?"   好的。    展现出出色的用户关怀/关注(通过"非单独")、并"软化"任何"用户需求"的感觉。   再说一次、很好!

    [引用用户="Charles Tsaa"]我认为图表会大有帮助。  [/报价]

    我的小型技术小组也是如此!   我们的希望“高了”——但这张图(尚未)已经到了!     我们必须假设它是,“在工作中!”   (希望这种情况...其他 ARM MCU 供应商提供此类产品-"灵感"应该证明有用...)

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

    查尔斯

    谢谢您的话语、我同意您和 CB1对这一个的看法。 我们需要图表!

    -我的项目现在正在运行、我仍然不确定原因! 如果我用相当大的值启动预分频器 TimerPrescalerSet(),则每个事件序列都会按升序记录。 如果我从较小的值开始、几个系列的 evens 会捕获未排序的值、这毫无意义-不过、现在我希望将代码保持在当前状态是安全的(无论如何、有针对奇怪读数的防护措施)。

    ——无论怎样用流利的英语、莎士比亚风格或盖尔语重写解释,通常都是令人困惑和不确定的。 也许 TI 会允许/赞助您打开一个帖子"免费 launchpad Set (One ai nough)"、以获得最喜欢的发布图表集、其中介绍了 ARM/Tiva 定时器"!

    我相信我对这些计时器非常了解、几乎可以让计时器一起下雨! 但仍然有些寄存器和用途(包括预分频器)难以读取。

    谢谢

    布鲁诺

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

    在输入捕捉时间模式中、预分频寄存器用于将16位定时器扩展到24位。 我想您已经知道了这一点。 或许让我举一个例子来说明。 让我们使用您的代码。 您写道:

    TimerPrescaleSet (TIMER0_BASE、TIMER_A、4);

    这意味着预分频寄存器 GPTMTAPR 的值为0x4。 由于您没有使用 TimerLoadSet (16位定时器预加载寄存器)配置 GPTMAILR 寄存器、因此 GPTMAILR 为0。 请注意、GPTMAPR 和 GPTMAILR 在输入捕捉定时器模式下形成一个24位预加载寄存器、GPTMAPR 占用位23:16、GPTMAILR 占用位15:0。 当 GPTMTAPR =0x4且 GPTMAILR =0x0时、预加载值为0x4_0000。 这是十进制的262144。 在递增计数时、自由运行计数器的值等于0、并递增、直到达到0x4_0000、此时它将再次复位为零。 如果检测到边沿、自由运行计数器 GPTMTAV 的时间戳将保存到 GPTMTAR 中、稍后由应用程序检索。

    系统时钟为120MHz。 如果使用的预分频值为0x4、则最大分辨率为8.3ns * 262144 ~= 2.17ms。 让我们使用另一个示例。 如果您写入:

    TimerPrescaleSet (TIMER0_BASE、TIMER_A、0x80);// 0x80 = 128

    24位预加载寄存器将为0x80_0000。 这等于8388608十进制。 在120MHz 时、这将提供69ms 的最大分辨率。

    如果您写入:

    TimerPrescaleSet (TIMER0_BASE、TIMER_A、0xFF);
    TimerLoadSet (TIMER0_BASE、TIMER_A、0xFFFF);

    这将创建一个完整的24位定时器、因为预加载值将为0xFF_FFFF。 自由运行计数器将在再次复位为零之前从0计数到0xFF_FFFF。 在120MHz 时、24位计数器提供的最大值为139.25ms。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查尔斯
    非常感谢您坚持并抽出时间回答这一详尽的问题! 也许可以用英语解释计时器!
    我回到数据表、看看我是否可以在那里找到等效的解释、但这当然是不可能的-无论人们如何读取、该文本都没有解释预分频器是计时器的扩展8位计数的限制。
    以上图表仍然是一项主要需求、不是吗? 我对 Timer Diagram 比赛的建议是有效的!
    我的特定应用的代码预分频器现在硬设置为0xFF!
    在我们进行确认时、我能再要求一次确认吗? 调用 TimerEnable (Timer1_base、timer_A)时、GPTMTAV 寄存器是否真的归零? 我们是否需要从以前的使用中重置它,例如,HWREG (Timer1_base + 0x050)= 0;?
    此致
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruno、

     请参阅数据表中的下表。 请注意、标题中有一个错别字、它本应用于输入边沿计时模式、而不是输入事件计数模式。 在这里您可以看到,如果您处于向上计数模式,则 TNV (GPTMTAV)加载为0。 您无需手动重置 TNV。 电路应该根据向上计数模式选择将计数器复位为0。  

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

    布鲁诺-我的团队早就发现、"倒计时"-而不是"倒计时"-更易于实施和理解。   和-(希望这对于该供应商的 MCU 是如此)大多数计时器功能都支持"向下计数"、而多个"块"向上计数。    最好与大多数人"保持一致"-我想。

    与"图表"一样好-(可能需要多个图表)因此、一个"gif"文件-在定时器运行时显示关键定时器寄存器"实时"-将会更好!   定时器/计数器的运行是"动态"的-一个图表能够捕获(仅)一个时间瞬间-实际上、当将这些关键定时器寄存器放置在清晰显示上的"多个关键/关键时刻"时-将更加明确。   最常去——没有 AMI?

    注意:计时器将"变慢"(以最大限度提高可查看性)并定向(跳过) 到(靠近)这些关键/关键输出和/或拐点(因此不会等待-永远)、以便"所有关键/关键计时器寄存器"裸机(可见)-并呈现其(最隐藏的)机密...

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

    男士、

    进一步介绍:我一直在使用外部超时控制、以避免在我不捕获一个给定 TCCP 的4次转换时出现问题。 我认为、用于捕获转换的同一个计时器可用于检查超时、只需启用另一个中断标志(TIMER_TINA_TIMEOUT)即可。 但是、我们没有收到任何超时中断(出于目的关闭输入信号)。

    //配置 Timer3A
    SysCtlPeripheralDisable (SYSCTL_Periph_TIMER3);
    SysCtlPeripheralReset (SYSCTL_Periph_TIMER3);
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER3)){}
    TimerConfigure (TIMER3_base、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP));
    TimerPrescaleSet (TIMER3_base、TIMER_A、37);
    TimerLoadSet (TIMER3_base、TIMER_A、0);
    TimerControlEvent (TIMER3_base、TIMER_A、TIMER_EVENT_BULE_edges);
    TimerDMAEventSet (TIMER3_base、TIMER_DMA_CAPEVENT_A);
    TimerIntEnable (TIMER3_base、TIMER_TINA_DMA | TIMER_TINA_TIMEOUT);
    IntEnable (INT_TIMER3A); 

    是缺少什么、还是在将计时器配置为 TIMER_CFG_A_CAP_TIME_UP 时不会发生超时中断? 或者 DMA 的使用是否与之相关?

    此处的计划是在捕获4个转换(已经正常工作)或超过20ms 的周期过期(0处的 LoadSet 和37处的 PrescaleSet 将转换为十进制24832或120MHz 处的20.2ms)时生成中断。

    此致

    布鲁诺