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.

[参考译文] TM4C129ENCPDT:配置单个32位捕捉定时器。

Guru**** 2457760 points
Other Parts Discussed in Thread: TM4C129ENCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/648511/tm4c129encpdt-configuring-single-32-bit-capture-timer

器件型号:TM4C129ENCPDT

如何将计时器配置为在 TM4C129ENCPDT 上具有32位捕捉分辨率? Tivaware 手册让我对如何使 TIMER0A 和 TIMER0B 成为单个32位捕捉感到困惑。 我不确定是否正确使用了"timer_both "。 我在"TimerConfigure"中没有尝试"TIMER_CFG_SPLIT_PAIR"、但从未调用中断。

我正在尝试测量间隔为10ms 的脉冲之间的时间。 因此、具有32位或4294967296个周期(43亿)并且以120MHz 的频率在主时钟上运行应该足以测量10ms。  

下面是配置 TIMER0的代码:

秘书长的报告

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
ROM_SysCtlPeripheralEnable( SYSCTL_Periph_TIMER0 );
ROM_GPIOPinConfigure( GPIO_PA0_T0CCP0 );
ROM_GPIOPinTypeTimer( GPIO_Porta_base、GPIO_PIN_0);

ROM_IntMasterEnable();
ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME | TIMER_CFG_B_CAP_TIME);

ROM_TimerControlEvent( TIMER0_BASE、TIMER_Both、TIMER_EVENT_POS_EDGE );

ROM_TimerLoadSet (TIMER0_BASE、TIMER_A、0xFFFF);
ROM_TimerLoadSet (TIMER0_BASE、TIMER_Both、0xFFFF);
ROM_TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
ROM_TimerIntClear (TIMER0_BASE、TIMER_CAPB_EVENT);
ROM_TimerIntEnable( TIMER0_BASE,TIMER_A );
ROM_TimerIntEnable( TIMER0_BASE,TIMER_B );
ROM_IntEnable (INT_TIMER0A_TM4C129);
ROM_IntEnable( INT_TIMER0A );
ROM_TimerEnable (TIMER0_BASE、TIMER_A);
ROM_TimerEnable (TIMER0_BASE、TIMER_B);

(二

和处理程序:

(三

void TIMER0A_Handler (void){  
ROM_TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
capture_duration = ROM_TimerValueGet (TIMER0_BASE、TIMER_A);

ROM_TimerLoadSet (TIMER0_BASE、TIMER_Both、0xFFFF);

(三

"capture_duration"中的值不会从其中一个定时器寄存器传输。 但这并不让我感到意外、因为我认为设置不正确。

***我已确认(除非我非常困惑)***

1 -捕获中断例程被正确调用。

2 -计时器寄存器正在更改。

3-我在 PA0 (引脚33)上有一个10ms 的周期切换输入。

如果相关、我将使用 Keil Microvision 5.24.1。 和 J-Link。

我阅读了几篇出色的先前文章、其中包括:

"365 <a href="">">e2e.ti.com/.../358696""> s://e2e.ti.com/support/microcontrollerss/stellaris_arm/f/471/t/358696"

  和

" e2e.ti.com/.../331045"

谢谢、

Jeff

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

    尊敬的 Jeff:

     您只能构建一个仅用于输入捕捉的24位计时器、而不能是32位计时器。 请参阅以下有关时间捕获模式下的计时器的数据表摘录。

    在边沿计时模式中、定时器配置为24位递增或递减计数器、包括可选的计数器
    GPTMTnPR 寄存器中存储的高定时器值和中低位的预分频器
    GPTMTnILR 寄存器。 在该模式下、定时器初始化为 GPTMTnILR 中加载的值
    和 GPTMTnPR 寄存器在递减计数时以及在递增计数时为0x0。 计时器能够执行的操作
    捕获三种类型的事件:上升沿、下降沿或两者。 定时器被放置在边沿计时中
    将 GPTMTnMR 寄存器的 TnCMR 位置位、并设置定时器的事件类型、以启用该模式
    捕获由 GPTMCTL 寄存器的 TnEVENT 位域决定。

    假设您希望使用 TIMERA 在您需要使用的输入时间捕获模式下创建您的24位计时器。

    ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME);  

    24位定时器由8位预分频计数器和16位预加载计数器组成。 这意味着、如果要在24位模式下使用、则需要使用以下两个 API 配置预分频和内部加载寄存器。

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

    很棒的查尔斯酒店! 如果它对其他人有用、这里是用于24位捕获的有效(但尚未经过严格测试)代码。

    (一

    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    ROM_SysCtlPeripheralEnable( SYSCTL_Periph_TIMER0 );
    ROM_GPIOPinConfigure( GPIO_PA0_T0CCP0 );
    ROM_GPIOPinTypeTimer( GPIO_Porta_base、GPIO_PIN_0);

    ROM_IntMasterEnable();
    ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME);
    ROM_TimerClockSourceSet( TIMER0_BASE,TIMER_CLOCK _PIOSC );
    ROM_TimerPrescaleSet (TIMER0_BASE、TIMER_A、0xFF);
    ROM_TimerControlEvent( TIMER0_BASE、TIMER_Both、TIMER_EVENT_POS_EDGE );
    ROM_TimerLoadSet (TIMER0_BASE、TIMER_A、0xFFFF);
    ROM_TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
    ROM_TimerIntEnable( TIMER0_BASE,TIMER_A );
    ROM_IntEnable (INT_TIMER0A_TM4C129);
    ROM_IntEnable( INT_TIMER0A );
    ROM_TimerEnable (TIMER0_BASE、TIMER_A);

    秘书长的报告

    void TIMER0A_Handler (void){
    ROM_TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT | TIMER_CAP_EVENT);
    capture_duration = 0xFFFF - ROM_TimerValueGet (TIMER0_BASE、TIMER_A);

    ROM_TimerLoadSet (TIMER0_BASE、TIMER_A、0xFFFF);
    ROM_TimerPrescaleSet (TIMER0_BASE、TIMER_A、0xFF);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为您的问题得到解决感到高兴、并感谢您与社区分享您的工作代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很好。 很高兴您坚持下去-实现了您的目标。

    作为一个"快速/脏"检查-我计算了@ 24位-您的"定时器最大值"刚刚低于140ms。 您是否可以进行测试和确认?
    相比之下-@ 32位(染色纸巾)显示~35S 为"定时器最大值"。
    出于完整性考虑-@16位~540µS 是"定时器最大值" (所有假定的120MHz 系统时钟)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    该海报旨在测量10ms 输入。 此外、他还使用 PIOSC 作为 TMR 的时钟源。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Jeffrey Kittreged"]... 具有32位或4294967296个周期(43亿)、并以120MHz 的频率在主时钟之外运行[/引用]

    你的荣誉-辩护方是否可以展示"A"-记录到证据-并在(非常)最重要的帖子中展示?

    此外,在要求/要求"认真测量"的情况下,我们被告知(只有)一个 xtal 或 xtal-osc 是合适的。    (PIOSC 中的"精度"可能会证明是虚幻-这不是吗?)

    如果计时器时钟降低到(仅) 16MHz、则粒度增加7.5!   (120/16)    

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

    CB1-在第二个帖子的代码中,我在意识到直接硬件支持的32位是不可能的之后,决定切换到 PIOSC。 我本应该表明这一点。

     与您一样、我对 PIOSC 的精度/漂移感到担忧。 我认为、对于我的应用、+/-5%应该是可以的。 我甚至不知道它的价格是多少。 我将尝试使用 PIOSC、如果不够的话、然后弄清楚如何 使用晶体。 FWiw、我不清楚如何使用外部时钟进行"捕捉"。 不过、我并没有为此付出太多的努力。 正如他们所说的,必要性是发明的母亲。 我查看了数据表方框图和 tivaware 时钟源集(),它们看起来只能使用 MainClock 和 PIOSC。 但是、我认为我缺少一些东西、因为我假设捕获可以使用精密外部晶体作为时钟输入、并且仍然捕获另一个硬件输入事件。

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

    感谢您提供最详细且投入最大的响应。   很棒

    我可能有几个事实证明是有用的见解。   (可能)

    外部 xtal/xtal-osc -与 MCU 的 PLL 配合使用-可实现高达120MHz 的系统时钟。    我相信系统时钟或其(减半的值)随后会显示为计时器的输入。     请注意、"可能的时钟源"系统时钟""精度"(营销人员夸大其词的观点!) 内部振荡器"有(两个)逃逸进入此图!    为什么-我们可能 会问-是这样吗?

    我(或经验丰富/合理的其他人)永远不会/永远不会将供应商的"内部 R-C 振荡器"描述为"精度!"      特别是在"避免"向外部 xtal/xtal-osc 授予此类奖励(显然是已知/证明卓越的)的同时。     (真正被认定为"精度"-内部"尝试"在市场中达到(仅限和可能)。)

    粒度损失 -此外-(120/16因子)将影响您的所有计时器使用-因此需要(部分)注意。    也许在"内部振荡器"之前出现"精度"的所有(不正确/过度提倡)"红线"。      (R-C 振荡器-即使"如果"得到改进-也不会授予"精度"-也不会接近!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、通过从精密晶体获取 MainClock、可以提高定时器/捕获模块的精度? 然后将 MainClock 除以时间源? 而不是使用仅用于计时器/捕捉的单独精密晶体?

    我没有将晶体放置到源主时钟的实际(成本/空间)问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不知道该类 MCU 提供"唯一的 xtal 输入"-仅为计时器保留。

    为 MCU 的振荡器输入引脚馈送正确选择、紧密放置/驱动、品牌名称 xtal、适当的支持组件-通常提供必需的精度和(可重复性-因此精度)。    这不是通过内部编码器件实现的(再次不关闭!) 尽管"过度促销"。    (哪一个放大了罪孽—难道不是这样吗?)