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.

[参考译文] MSPM0G1519:使用外部32MHz 时钟和外部1Hz 锁存信号进行 TIMG12捕获

Guru**** 2387830 points
Other Parts Discussed in Thread: LP-MSPM0G3507, SYSCONFIG, MSPM0G3507
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1489254/mspm0g1519-timg12-capture-using-external-32mhz-clock-and-external-1hz-latch-signals

器件型号:MSPM0G1519
Thread 中讨论的其他器件:SysConfigMSPM0G3507、LP-MSPM0G3507

工具/软件:

如何控制 TIMG12 (32位计时器)以便使用外部~μ s 32MHz 时钟源和外部1Hz 时钟信号进行周期捕获?

技术参考手册(slau846b)指出:

27.2.1.1时钟源选择和预分频器
TIMx 时钟(TIMCLK)可通过内部时钟或外部信号触发来推进 时钟。

这是如何实现的呢? 我尝试了 SysConfig 许多方法、但不可能。

我需要计算在1秒外部时钟信号(上升沿到上升沿)内发生的外部32MHz 时钟数量。

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

    具体思路是、您(例如)将1kHz 信号(捕获触发)引入 C0、将32MHz (时钟)信号引入 C1。 然后、设置 CC1的 ACOND = 1 (C1引脚的上升沿)、并设置 CTRCTL:CAC=1以指向 CC1的 ACOND。 之后、它是 CC0上的正常"周期"捕获。

    我认为 timx_timer_mode_capture_edge_capture 示例将为您提供以下捕获部分:

    https://dev.ti.com/tirex/explore/node?node=A__ALfbfSw7t-el4gbNzBJSJg__MSPM0-SDK__a3PaaoK__LATEST

    SysConfig 似乎不希望将 ACOND 设置为除 TIMCLK (=0)之外的任何内容。 您可能必须明确调用(我认为这是正确的):

    > DL_Timer_setCaptureCompareCtl (TIMER、DL_TIMER_CC_MODE_COMPARE、DL_TIMER_CC_ACOND TRIG_RISE、1);// ACOND = 1时针对 C1上的时钟上升

    功能

    DL_Timer_setCounterControl (TIMER、DL_TIMER_CZC_CCCTL0_ZCOND、DL_TIMER_CAC_CCCTL1_ACOND、DL_TIMER_CLC_CCCTL0_LCOND);// CAC->CC1的 ACOND

    连续捕获之间的差值是(32MHz)周期数。

    [编辑:忘记了示例链接。]

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

    您好、 

    思路是(例如)将1kHz 信号(捕获触发器)引入 C0、将32MHz (时钟)信号引入 C1。 然后、设置 CC1的 ACOND = 1 (C1引脚的上升沿)、并设置 CTRCTL:CAC=1以指向 CC1的 ACOND。 之后、它是 CC0上的正常"时间段"捕获。

    这是个好主意、值得尝试。

    32MHz 控制计数器前进、1kHz 控制计数器清零。

    您好、 

    Aaron Lee 说:
    技术参考手册(slau846b)声明:

    此部分是计时器的时钟源描述。

    对于 G3519的 TIMG12时钟源、您可以选择 BUSCLK、MFCLK 和 LFCLK。

    MFCLK 可以来自外部 HFCLK、但具有最大频率限制、但无法达到32MHz。

    您可以在 syscfg 时钟树视图中配置这部分。

    此致、

    Helic

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

    感谢您发送编修。 我必须获得一个演示板或构建一个仅使用 G1519的快速板来测试此问题、因为它是在我的产品开发使用此部件之前的一个主要阻塞点。

    两个问题:
    Q1)不清楚 Helic 的评论意味着什么。 我遇到了 HFCLK 上相同的4MHz 频率限制、因此我想知道如何选择外部32MHz 时钟源。 但是、听起来 Helic 说这是不可能的、但 Bruce 说这是可能的、但不通过 SysConfig???
    因此,我不明白你们两人是否同意或不同意。 您能解释一下吗?

    Q2) BTW、它是一个1Hz 信号、而不是1KHz 信号、但不确定将 TIMG12作为32位计时器是否重要。

    Q3)建议:我喜欢 SysConfig 中系统时钟的图形时钟跟踪、那么为什么不在其中添加计时器时钟呢?

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

    我想[ Helic 会纠正我吗?] Helic 描述了使用32MHz 信号来提供一个系统时钟、并将其作为 TIMCLK 路由到计时器。

    我曾通过(例如) C1引脚将32MHz 用作计数器。

    再深入探究、我认为我看到了术语冲突:我认为这(通过 C1实现的32MHz)是一个"计时器时钟"、因为它驱动计数器打勾;设计人员认为这是一个比较单元功能、它(也)会导致计数器打勾。 Helic (和 SysConfig)是正确的、因为运行计时器单元其余部分的 TIMCLK 需要是系统时钟之一。 (这可能需要>= 32MHz;BUSCLK 似乎是一个不错的选择。)

    与此相关的模型在 TRM (SLAU846B)第 27.2.3.2.1节中进行了介绍、并在 timx_timer_mode_compare_edge_count 示例中进行了说明:

    https://dev.ti.com/tirex/explore/node?node=A__AAR6edrrZqUYodAtIjBtSQ__MSPM0-SDK__a3PaaoK__LATEST

    在示例中、这是在 Driverlib 中通过(合成)模式"DL_TIMER_COMPARE_MODE_EDGE_COUNT "完成的、这会执行我上述操作。 我不是 SysConfig 向导、但我没有找到同时设置另一个通道(C0)以进行捕获的机制。 我非常确定计时器单元能够实现它。

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

    你好 Helic,  
    我的中文名字叫史登义、我去过上海三次、多年前在台湾居住过、是个红毛洋鬼子。Grinningμ s

    我找不到 G3519 Launchpad (无可用)。 如果您(或 Bruce)有一个、您能做 Bruce 建议的实验吗?
    将外部1Hz 信号(捕获触发器)连接到 C0、将外部32MHz (时钟)信号连接到 C1以验证此功能是否有效?

    我在为我的应用选择 TI TMSM0G1519之前必须对此进行验证、否则我必须转到 SiLabs 部分。

    请请帮我帮助我  

    Dan 史登义 Staver

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

    您好 Bruce、  
    感谢您的最新回复、但可能会有一些混淆。 我的外部32MHz 时钟信号必须来自外部 IC、而不是 Gx519内部的内部32MHz 时钟之一。

    您提到了 BUSCLK、然后在"27.2.1.1.1内部时钟和预分频器"部分中、它似乎将源自 MCLK、但这不是我需要提前时钟的外部32MHz 信号。

    有了所有这些消息,我们能有一个快速的电话来清除这一点,因为它仍然不清楚,如果你现在相信它会工作或不。 +1-719-502-1675

    此致、
    Dan

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

    Bruce、  

    您链接到的示例工程仅显示外部捕获信号、但未使用外部时钟。

    我们是否可以进行调用、或者有人可以访问任何具有32位 TIMGx 的 M0G Launchpad 来验证该功能?

    此致、
    Dan

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

    EDGE_COUNT 示例的作用是:(1)接受进入计时器 CN 引脚之一的输入信号 (2)计数(向下) CTR 寄存器中的信号边沿(3)当计数器达到0 (最初为5)时、它会触发加载事件的中断。

    (1)/(2)是接受(32MHz)信号进入计时器 CN 引脚并计算周期数(上升沿)的机制。  下一步是配置另一个通道、根据较慢(触发)信号中到达另一个通道的边沿来捕获(CTR)。

    我不建议将32MHz 信号用作系统时钟之一。 我提到了">=BUSCLK"、因为我怀疑计时器无法接受比它运行的时钟(TIMCLK)更快的信号(数据表未说明)、LFCLK 和会太慢、但我认为(不进行检查)您可以至少对40MHz 运行32MHz。

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

    我从未打算将外部32MHz 用作系统时钟。

    您是否认为我的外部32MHz 异步时钟必须先通过内部时钟进行限定、然后才能将 TIMG12提前为时钟?

    我计划购买 MSPM0G3507 Launchpad (3519 LaunchPad 未提供)来证明/驳斥此问题。

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

    您好、 

    Q1) Helic 的评论含义不清楚。 我遇到了 HFCLK 上相同的4MHz 频率限制、因此我想知道如何选择外部32MHz 时钟源。

    是的、时钟系统无法实现。

    但 Bruce 说这是可能的、但不是通过 Sysconfig 实现的???

    Bruce 提供了一种将外部32MHz 连接到计时器 CC 引脚的方法、该方法也没有连接到时钟系统。

    这是计时器中的一些操作、您需要读取 Bruce 提到的计时器寄存器。

    Q2)顺便说一下、它是一个1Hz 信号、而不是一个1KHz 信号、但不确定将 TIMG12作为32位计时器是否重要。

    我们将 TIMG12定义为32位计时器、只有32位计时器可以将32MHz 计数为1s (1Hz)而不会溢出。

    我认为[ Helic 会纠正我的错误吗?] Helic 描述使用32MHz 信号来提供一个系统时钟、并将其路由到计时器作为 TIMCLK。
    Q3)建议:我喜欢 SysConfig 中的系统时钟图形跟踪、所以为什么不在其中添加计时器时钟?

    这是另一种方法:

    我们不能通过时钟系统使外部32MHz 进入计时器。

    除非您使用 HFCLKIN 功能、否则这是 MSPM0的数字时钟源、这将从外部32MHz 获取所有 MSPM0系统的时钟源。

    还包括 TIMG12。 HFCLK_IN EXT、从器件引脚到 SYSPLL、然后到 CPU 和所有外设。

    该时钟将控制计时器计数增加。

    再深入探究、我认为我看到了术语冲突:我认为这(通过 C1实现的32MHz)是一个"计时器时钟"、因为它使计数器打勾;设计师认为这是一个比较单元功能、(也)会导致计数器打勾。 Helic (和 SysConfig)是正确的、因为运行计时器单元其余部分的 TIMCLK 需要是系统时钟之一。 (这大概需要>= 32MHz;BUSCLK 似乎是一个不错的选择。)

    外部32MHz 到 CC 输入和内部计时器时钟源之间会出现计时器同步问题、最好将计时器时钟源设置为高于输入32MHz。

    这里有计时器捕获外部信号的捕获和同步步骤、您可以参考 图27-13。 使用 FP = 0 (3个 TIMCLK 周期)的输入干扰滤波的连续周期和多数表决。

    对不起,我没有完成阅读你所有的答复。 今天时间有限、太忙了。 我希望这将很好地指导您。

    如果有任何其他问题、请回复此主题、

    此致、

    Helic

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

    我黑客攻击了一个程序(频率计数器),我写了一段时间前做我的上面所述. 当 TIMCLK 32MHz 时、我能够对16MHz 输入信号进行计数/捕获、但不能捕获32MHz 输入信号。 这表明(如 Helic 所说)你需要 TIMCLK > 32MHz (不是">="),虽然我还不知道有多少">"。 我的程序当前无法加速 BUSCLK、因此我需要添加它。

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

    感谢您的帮助。 我认为这归结为文档不清楚。

    根据讨论(以及多年的 MCU 经验)、我认为您认为我应该能够使用其中一个外部 CN 输入来 推进计数、并使用另一个 CN 输入来实现锁存 (捕获)事件、但这些信号必须由 内部 TIMCLK 限定(同步)、该内部 TIMCLK 必须源自简短的系统时钟列表、并且必须>所使用的外部时钟。 (可能> 1.25倍左右、以保证安全)。

    驱动 TIMCLK 的唯一实际选择是 BUSCLK←MCLK、因为所有其他选择都太慢了。

    我唯一需要验证的方法是使用 Launchpad、所以我订购了 LP-MSPM0G3507 (只有一个可用)、因为它也属于该系列、并具有一个32位 TIMG12。

    我会让你知道我找到了什么,但我希望这将允许我的生产开发选择此器件。

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

    您好、 

    我还提到另一种方法:

    Aaron Lee 说:
    驱动 TIMCLK 的唯一实际选择是 BUSCLK←MCLK~、因为所有其他选择都太慢。
    我们不能将外部通过时钟系统连接到计时器。
    [user57id="571933"/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1489254/mspm0g1519-timg12-capture-using-external-32mhz-clock-and-external-1hz-latch-signals/5723109、然后引用/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1489254/mspm0g1519-timg12-capture-using-external-32mhz-clock-and-external-1hz-latch-signals/5724814、将所有外围设备的外部32MHz 引到计时器。

    但这需要外部32MHz 持续输入到 MSPM0。

    驱动 TIMCLK 的唯一真正选择是 BUSCLK←MCLK、因为所有其他选择都太慢了。

    是、TIMG12的最大时钟速度为来自 MCLK 的80MHz。

    此致、

    Helic

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

    您好、 

    我今天回来~

    我的中文名字叫史登义、我去过上海三次、多年前在台湾居住过、是个红毛洋鬼子。

    很高兴~很高兴见到你。  你有这么多的经验!

    我找不到 G3519 Launchpad (无空闲)。

    这目前仅供内部使用、但有一些限制、如果您需要获取、请联系您当地的现场团队。

    G3507对于 TIMG12也是相同的、您可以先使用 LP-MSPM0G3507对此进行测试。

    您提到 BUSCLK、然后在"27.2.1.1.1内部时钟和预分频器"部分中、它似乎将源自 MCLK、但这不是我需要提前时钟的外部32MHz 信号。[/报价]

    是的。

    Aaron Lee 说:
    ]我从未打算将外部32MHz 用作系统时钟。

    因此、我们不能将外部32MHz 作为系统时钟引入 MSPM0。

    Aaron Lee 说:
    ]您是否说我的外部32MHz 异步时钟必须先通过内部时钟进行限定、然后才能将 TIMG12推进为时钟?

    是、有一些计时器 cc 输入同步步骤。 您可以 在最新版本的 TRM 中参考图27-13。

    此致、

    Helic

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

    我已经使用 TIMCLK 64MHz 演示了32MHz 输入信号上的方法。 它可能会以较慢的 BUSCLK 运行、但我没有尝试过。

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

    很高兴听到这个消息!

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

    您好 Bruce、

    非常感谢您对此进行验证。  上周、我订购了类似系列的 Launchpad (LP-MSPM0G3507)、但直到本周底才会供货。 我也会尝试一下、但我觉得您能让它发挥作用更好。
    在您解释了必须使用内部时钟来鉴定外部时钟之后、我猜对于大于~1.25或40MHz 就足够了。  
    现在我可以选择使用、如果它对于我的应用来说足够快、我可以使用内部 SYSOSC (32MHz)、 将外部时钟减少到16MHz、并更大程度地降低成本。 我有一个 GPS 可以帮助我跟踪长期的时间漂移,所以我认为我应该是可以的。

    再次感谢你们的帮助。

    此致、
    Dan

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

    我(仍然)不知道如何使用 SysConfig/Driverlib 执行此操作。 我在上面提到了两种可能性、但我没有尝试过其中的任何一种。

    我推迟到 SysConfig 向导。

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

    这不能由 syscfg 完成。

    SYSCFG 无法涵盖此类非正常应用。

    当然、我们可以尝试使用 driverlib、只需在 dl_timer.x 文件中搜索这些寄存器即可。

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

    我尝试使用 TIMCLK =BUSCLK=BUSCLK 48MHz、我(一致)看到计数为16M。 我想这意味着 BUSCLK 需要比这快、可能是64MHz。

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

    至少是时钟速度的两倍。

    来自 TRM 的提示: 27.2.3.1.2.3脉宽捕获、 图27-16。 脉宽捕获模式

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

    我能够使用 TIMG12_C0的上升沿进行捕获、但它始终使用内部 BUSCLK 进行计数。

    但是、在尝试所有建议的一切后、检查了所有示例工程的代码以及许多寄存器设置、仍然无法让计时器计数器使用引脚 TIMG12_C1上的外部时钟提前。

    什么是我的缺失?

    代码:

    void CAPTURE_0_INST_IRQHandler (void)
      uint32_t Joe = DL_TimerG_getPendingInterrupt (CAPTURE_0_INST)和0xFF

    // 开关(DL_TimerG_getPendingInterrupt (CAPTURE_0_INST)){
      开关(Joe){
        用例 DL_TIMER_IIDX_CC0_UP:  

          gThisCaptureCnt = DL_TimerG_getCaptureCompareValue (Capture_0_INST、DL_TIMER_CC_0_INDEX);
          
          // if (gNumPpsCapures > 0){
            GPP_PERIOD = gThisCaptureCnt - gLastCaptureCnt;
            gCheckCapures = true
          //}
            gLastCaptureCnt = gThisCaptureCnt
            gSynced = true

            //针对 errata timer_ERR_01的权变措施对于16MHz ppl_clk 来说不够快、可能会丢失时钟
            ///*需要手动重新加载才能解决计时器捕获限制*/
            // DL_TimerG_setTimerCount (Capture_0_INST、gLoadValue);
    ...

    条件:(在调试中、I get 周期 = GPP_PERIOD ~ 16155400 (显示它使用32MHz BUSCLK、而不是4MHz 的外部 TIMG12_C1时钟)。

    1) 32MHz BUSCLK = SYSCLK
    2) TIMG12_C1 (PINCM6/PB31/TIMG12_C1[5]  / PIN-39)=  4 MHz  外部时钟
    3) TIMG12_C0 (PINCM30/PB13/TIMG12_C0[4]/ PIN-1)  = 2Hz 外部时钟

    TIMG12_C0和 TIMG12_C1配置:
     

    调试期间的 TIMG12寄存器值:

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

    CAC 指向 CCCTL_01[1].ACOND、但 CCCTL_01[1].ACOND = 0 (TIMCLK)。 您需要.ACOND =1 (上升)。  

    我有这样的想法,你可以做到这一点  

    > DL_Timer_setCaptureCompareCtl (TIMER、DL_TIMER_CC_MODE_COMPARE、DL_TIMER_CC_ACOND TRIG_RISE、1);// ACOND = 1时针对 C1上的时钟上升

    但这个电话可能出了问题? [执行此操作时、我直接存储了 ACOND。]

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

    您好 Bruce、

    感谢您的耐心。 我意识到我完全误解了计时器是如何工作的,所以我试图忘记所有以前的假设,重新阅读计时器描述章节,现在我得到了它的工作。 此外设必须具有我未使用的模式、以便将指针传递到 CAC->ACOND。

    然而、 IFCTL_01[0/1]的措辞使我感到困惑。 最终、唯一可行的设置是:

    TIMG12.IFCTL_01[0]=[0、2] (两者都将选择 C_)用于捕获事件边沿的引脚)
    TIMG12.IFCTL_01[1]=[0]

    这是有道理的,但在一段时间内,我的 Pooh 大脑温尼躲过了。

    我仍然认为它不是写得很好,这是令人困惑的是,他们使用非固定助记符为 CCP (捕获控制引脚),这把我扔掉。 不清楚他们是在谈论一个 PIN 还是一个事件或什么。

    起初、也不清楚必须同时使用两个计时器寄存器才能完成此任务。 这是设计上的还是由于计时器勘误表造成的?

    此致、
    Dan

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

    对于 IFCTL_01[0]、ISEL = 0和 ISEL = 2是等效的(因为它是通道0)。 ISEL=2的一种用法是在 IFCTL_01[1]中进行设置、这样两个通道都使用 CC0引脚、然后设置相反的边沿检测、以便一个通道捕获上升沿和其他下降沿。 通过该选项、您可以区分触发的边沿、因为在其他方面很难确定。

    您的应用确实需要两个通道、因为引脚具有不同的信号、可驱动不同的结果。 在一些计时器架构中、高频信号将作为"时钟"(一个特殊的输入)馈入、但在这个架构中、它只是另一个通道。