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.

[参考译文] AM6421:Cacade 计时器设置为对 10 μ s 周期进行计数

Guru**** 2542100 points
Other Parts Discussed in Thread: AM62L, AM6421

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1548650/am6421-cacade-timer-setup-to-count-10us-ticks

器件型号:AM6421
主题中讨论的其他器件:AM62L

工具/软件:

我的设计具有从不同的时钟运行的多个处理器。  为了同步关键时序、我尝试使用 EXT_REFCLK1 运行两个级联计时器。  预分频计时器将为第二个自由运行计时器提供 10 μ s 节拍。  我选择 TIMER2 作为 10us 周期发生器、并选择 TIMER3 对 10us 周期进行计数。  在 AM64x TRM 中、我 在第 5.1.1.5.65 节中找到了 CTRLMMR_TIMER3_CTRL CASCADE_EN 位。  我的问题与如何对该寄存器进行编程有关。  我看不到任何从 SYSCFG 系统中设置此设置的方法、我找不到任何示例或 API、其中展示了 如何在 启动和系统初始化期间处理此步骤

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

    您好 Bruce、

    请允许我们在某个时候返回给您。

    谢谢、

    Vaibhav

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

    好的、供您参考、这个问题与我提出的另一个问题有关、但我更希望通过级联计时器以这种方式运行、而不是通过我自己的 ISR 来对 10 μ s 周期进行计数。

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

    您好 Bruce、

    据我所知、您的团队目前正在使用 AM64x、还有一个团队正在开发 AM62L。

    您能否确认这是两个独立的项目还是同一个项目的一部分?

    MCU+ SDK 中的计时器级联操作:

    到目前为止、MCU+ SDK 不支持 API 中的级联模式。

    但是、如果要手动启用硬件级联操作、设置 CTRLMMR_TIMER3_CTRL 中的 CASCADE_EN 位是一种有效的方法。

    这样就允许两个连续的计时器(例如 Timer2 和 Timer3)作为单个 64 位计时器运行。

     计时器级联模式 :
    •这些计时器以级联方式配置、以便 Timer2(低 32 位)溢出并自动使 Timer3(高 32 位)递增。
    •这两者一起充当单个 64 位计数器、非常适合持续时间较长的计时。

     用例中的限制:

    根据我的理解、您正在尝试:
    •使用两个由相同时钟源馈送的计时器
    •一个用于生成中断的计时器
    •第二个计时器独立对 10µs 间隔进行计数

    此设置与级联操作模型不一致、因为:
    •在级联模式下、计时器紧密耦合—第二个计时器不能单独使用。
    •在级联模式下、您无法为中断独立配置一个计时器、而在 10µs 间隔内独立配置另一个计时器。

     建议的方法

    如果您需要:
    •一个计时器、用于产生 10µs 周期中断
    •另一个计时器是自由运行的计时器、用于时间戳或持续时间跟踪

    然后、您应该使用两个单独的计时器、每个计时器在非级联模式下独立配置。

    此致、

    Anil.

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

    Anil、

    我可以确认这是与使用 AM62L 的项目不同的项目。  我的工程同时使用 AM6421 和 CC1354 、需要将其同步到外部 48MHz TCXO。

    您的理解略有不正确。  我确实希望两个计时器紧密耦合、第一个计时器由 48MHz 计时、连接到我们电路板上的 EXT_REFCLK1、并以 10us 的速率溢出。 级联计时器将对 10uS 溢出进行计数、固件将读取第二个计时器以获取以 10uS 周期测量的同步历时。  我没有想到在此设置中使用任何中断。 我通过阅读 AM6421 TRM 第 12.5.3.1 节获得了这个概念

    “级联后、TIMERi 充当 TIMERi+1 的 32 位预分频器、MCU_TIMERn 充当 32 位
    预分频器到 MCU_TIMERn+1。 必须配置 TIMERi/MCU_TIMERn 以生成 PWM 输出边沿
    递增 TIMERi+1/MCU_TIMERn+1 计数器所需的速率。“

    我有 2 个问题:

    1.这是一种有效的方法吗?

    2.如果是、如何写入  CTRLMMR_TIMER3_CTRL 中的 CASCADE_EN 位?  我尝试在我的“C"代码“代码中添加一条直接指令、如下所示:

    #define CTRLMMR_TIMER3_CTRL (0x4300420CUL)

    #define CASCADE_EN (0x100uL)

    *(volatile uint32_t *) CTRLMMR_TIMER3_CTRL = CASCADE_EN;

    在启动期间运行此文件后、我稍后停止了调试器并检查了 CASTRAGE_EN 位的值。  未设置。   现在我认为我需要 首先使用 CTRLMMR_LOCK0_KICK0 来解锁访问、但您的示例会有所帮助。

    以下是到目前为止我使用的级联计时器设置、即定时器 2 和 3 的 SysRegisteredCfg 相关设置。  此代码来自自动生成的 ti_drivers_config.c 文件。 如果我走在正确的轨道上、请告诉我。

    /* GPTIMER 特性*/
    静态 GPTIMER_HwAttrs gGpTimerHwAttrs[GPTIMER_NUM_Instances]=


    .baseAddr = 3794544、
    .intNum = 155、
    .EventID = 0、
    .inputClk = 25000000、
    .enableIntr = false、
    . Priority = 4、
    }、

    .baseAddr = 37879808、
    .intNum = 154、
    .EventID = 0、
    .inputClk = 48000000、
    .enableIntr = false、
    . Priority = 4、
    }、
    };
    /* GPTIMER 对象*/
    静态 GPTIMER_Object gGpTimerObjects[GPTIMER_NUM_Instances]=


    /*计时器模式配置*/
    .timerConfigMode = GPTIMER_MODE_CONFIG_FREE_RUN、
    /*回调分配*/
    .overflowCallbackFunction = NULL、
    compareMatchCallbackFunction = NULL、
    .captureCallbackFunction = NULL、
    }、

    /*计时器模式配置*/
    .timerConfigMode = GPTIMER_MODE_CONFIG_PWM_GEN、
    .pwmConfig.trigOutputPWMMode = GPTIMER_PWM_OUT_overflow_trigger、
    .pwmConfig.defaultPWMOutSetting = GPTIMER_PWM_OUT_PIN_DEFAULT_0、
    .pwmConfig.cntCompareValPWM = 0、
    .pwmConfig.outputModulationType = GPTIMER_PWM_OUT_PIN_MODULATION_TOGGLE、
    /*回调分配*/
    .overflowCallbackFunction = NULL、
    compareMatchCallbackFunction = NULL、
    .captureCallbackFunction = NULL、
    }、
    };
    /* GPTIMER 配置*/
    GPTIMER_Config gGpTimerConfig[GPTIMER_NUM_Instances]=


    .object =&gGpTimerObjects[tick_COUNTER]、
    .hwAttrs =&gGpTimerHwAttrs[tick_COUNTER]
    }、

    .object =&gGpTimerObjects[tick_prescare]、
    .hwAttrs =&gGpTimerHwAttrs[tick_prescare]
    }、
    };

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

    今天我已经取得了一些进展。  我按照 TRM 中所述将 TIMER2 配置为预分频 TIMER3 的 PWM。  我还能够使用以下序列为 TIMER3 打开 CASCADE_EN 位:

    //启用将 Timer2 级联到 Timer3
    *(volatile uint32_t *)(CTRL_MMR0+CSL_MAIN_CTRL_MMR_CFG0_LOCK1_KICK0)= 0x68EF3490;//解锁步骤 1
    *(volatile uint32_t *)(CTRL_MMR0+CSL_MAIN_CTRL_MMR_CFG0_LOCK1_KICK1)= 0xD172BC5A;//解锁步骤 2
    *(volatile uint32_t *)(CTRL_MMR0+CSL_MAIN_CTRL_MMR_CFG0_TIMER3_CTRL)= CASCADE_EN;
    *(volatile uint32_t *)(CTRL_MMR0+CSL_MAIN_CTRL_MMR_CFG0_LOCK1_KICK0)= 0;//重新锁定

    GPTIMER_INIT ();
    /*
    **预分频计时器 2 级联到自由计时器 3.
    **使用 SYSCFG 工具设置的初始参数
    */
    // TickPrescale Handle = GPTIMER_OPEN (TICK_PRESCALE、NULL);//请参阅 SYSCFG 中设置的参数
    TickPrescale Handle = gGpTimerHandle[TICK_PRESCALE];

    //自由运行计时器
    // TickCounterHandle = GPTIMER_OPEN (TICK_COUNTER、NULL);//请参阅 SYSCFG 中设置的参数
    TickCounterHandle = gGpTimerHandle[TICK_COUNTER];
    /*启动计时器*/
    GPTIMER_START (TickPrescaleHandle);
    // GPTIMER_START (TickCounterHandle);

    这里是使用我的两个计时器的 SYSCFG 的屏幕截图

    请注意、我已经注释掉了第二个 GPTIMER_START。  如果包含此说明、程序将在此调用过程中崩溃。

    我想我离得越来越近了。  您能否确认我在正确的轨道上并提供一些帮助?

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

    我对您的原始反馈进行了更多研究、并对级联操作的描述有疑问。  我希望能够从上部级联计时器中读出计数、并希望它提供自由运行计数。  为了读取它、我需要一个句柄来使用 GPTIMER 接口。

    我仍然不确定是否正确配置了两个计时器。  我将与应用程序中的其他代码一起移动、假设我可以使用该方法在电路板上的 CC1354 和 AM6421 之间实现同步的 10us 节拍。  如果这种方法不可行、请提出另一种方法

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

    您好 Bruce、

    CS1354 时钟被馈送到 SoC 计时器、并 在中断模式下配置计时器。

    当向计时器提供 CS1354 时钟时、计时器开始计数。 一旦完成其 10µs 计数、就会产生中断。

    此方法允许您在 CS1354 和 SoC 之间实现同步时钟、每个 10µs 都会发生中断。

    这种方法对您不起作用吗?

    此致、

    Anil.

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

    Anil、

    这是我目前正在研究的一般想法。  我的 Am6421 在 GPIO 引脚上生成 100kHz 时钟(10us 周期)、这是 CC1354 的输入 、我现在正在努力设置 CC1354、以便通过在边沿计数模式下设置 GPTimer 来简单地对该外部时钟的上升沿进行计数。  通过使用 CC1354 计时器进行计数、可以减少 1354 中所需的 ISR 服务数量。  我不再需要 AM6421 中的级联计时器、有多个基准可帮助我在 CC1354 中设置计数模式。

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

    您好 Bruce、

    上述方法似乎可以。

    但是、为了每 10 μ s 对 GPIO 生成 100KHz 的频率、我们需要在 10 次使用中断中切换 GPIO、  

    我觉得大家使用的是计时器+ GPIO 方法。  

    我建议使用 PWM、而不是 GPIO 切换。

    如果使用 PWM 方法、则没关系。

    此致、

    Anil.

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

    Anil、

    我同意采用 PWM 方法。  我正忙于处理其他问题、现在又回到了这个问题。 我已经成功使用 CC1354 对由 AM6421 生成的 GPIO 脉冲进行计数、但 AM6421 中的高频中断会干扰其他操作。  所以我确实需要让 AM6421 通过 PWM 生成 10us 脉冲。

    我需要在 AM6421 和 CC1354 中同时进行计数、以便允许两个处理器中同步计时事件。  如果 AM6421 可以使用级联计数器来对 PWM 周期进行计数、则 CC1354 可以对 PWM 脉冲进行计数。  事实证明、我们的定制硬件具有引脚 C13、该引脚可分配给 Timer_IO10 路由到 CC1354。

    因此、我需要一个在 TIMER_IO10 上输出的 PWM 计时器。  同一个计时器需要进行级联并对 PWM 脉冲进行计数。

    我是否在 正确的轨道上?

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

    您好 Bruce、

    级联计数器不能用作计时器和 PWM。

    级联计数器可用作计时器或 PWM。

    接下来,如果你想用 10usec 信号驱动 PWM ,那么我们可以从计时器生成 PWM 信号。

    有关计时器模块中 PWM 的更多详细信息、请查看示例和常见问题解答。

    如果您 要监控同一信号、则应将相同的时钟路由到计时器模块并在特定时间生成中断或将此信号提供给 ECAP 模块。

    ECAP 模块根据上升沿和下降沿的中断生成来提供时间周期和占空比。

     【常见问题解答】PROCESSOR-SDK-AM64X:如何使用计时器创建 PWM 

    C:\ti\mcu_plus_sdk_am64x_11_00_00_15\examples\drivers\gp_timer

    此致、

    Anil

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

    我认为我对我的预期设计理念还不清楚。  我附上了一份简短的 文件、描述了我认为会起作用的概念。  如 TRM 所述、我想 配置 TIMERn 以在 100kHz 的频率下生成 PWM、然后使用 TIMERn+1 作为计数器。  第 15.5.3.1 节中的 TRM 描述是不正确的、还是这是合理的方法?

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

    今天、我按照您发送的 PWM 示例取得了成功、几乎可以完全正常工作。  以下是有用的内容:

    1.我将 TIMER6 配置为 PWM、使用 TRIGGER_ON_OVERFLOING_AND_MATCH 在 B16 I/O 引脚上获得 100kHz 方波。

    2.我启用了 TIMER7 的级联位、并将其设置为自由运行的计时器、并查看与 100kz PWM 计数一致的计数

    3.使用 CC1354 成功对外部 PWM 引脚上的上升沿进行计数。

    4. TIMER7 和 CC1354 中的计数在初始启动后保持同步

    祝大家顺利、感谢您帮助设计出 PWM 设置。

    我还有一个问题是如何停止并重新启动 AM6421 计时器。  我可以在 AM6421 计时器停止时将 CC1354 复位以使两个计时器同步、但我不确定停止并重新启动级联计时器的正确过程。

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

    您好 Bruce、

    是的、您的理解是正确的。

    在级联模式下、计时器 i 的输出信号可用作计时器 i+1 的输入。
    这允许计时器在级联操作下在 PWM 模式或计时器模式下一起运行。


    •TimerP_STOP() API 停止级联计时器。
    •TimerP_start() API 再次启动计时器。

    停止和重新启动时、请确保设置正确的占空比和频率值。
    此外、在开始之前清除第二个计时器的计数器值;这可确保计数器从已知状态开始并提供正确的读数。

    此致、

    Anil.

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

    Anil、

    感谢您的反馈。  我使用 TIMER6 和 TIMER7 实现整个时序同步。  但是、我想使用计时器 10 和 11、因为 Timer10 的 PWM 输出引脚已路由到我们定制板上 CC1354 的输入。  使用计时器 6 和 7 涉及一些我们不愿做的详细返工。  我的问题是、尽管数据表和 TRM 中都介绍了计时器 8-11、但 SYSCFG 并未显示计时器 8-11 作为选择选项。  这 4 个计时器没有可用的原因是什么?  我愿意自行制作  计时器 6 和 7 的自动生成代码副本、并手动设置正确的地址和其他详细信息、但如果有原因无法使用这些代码、我们将重新设计电路板。

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

    Anil、

    我可能已经回答了我自己关于计时器 8-11 的问题。  它们似乎是可用于 SYSCFG 中驱动程序移植层的时钟部分的选项。  还有什么方法可以解决这个问题吗?

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

    您好 Bruce、

    对于 FreeRTOS、计时器范围为 8 至 11。 因此、它们不适用于正常应用。

    此致、

    Anil.

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

    Anil、

    感谢您确认计时器 8-11 不可用于应用。  我已完成工作、并已确定计时器 6 和 7、同时进行了一些电路板返工、并将在未来的电路板修订版中使用计时器 4 和 5。  我认为这个问题现已解决。