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.

[参考译文] AM6422:SDK 8.6计时器比较和捕获模式

Guru**** 2481465 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1432141/am6422-sdk-8-6-timer-compare-and-capture-modes

器件型号:AM6422
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

我们要使用计时器的输入捕获功能、但在 SysConfig 软件中未看到计时器和引脚之间的连接。 是否有任何相关的样片计划?

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

    您好!

    我已将您的主题分配给了我们的一名团队成员。 请注意,这是一个在印度的假日周。 如果您在几个工作日内未收到回复、请在下周随意点击该主题帖。

    此致、

    Nick

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

    您好!

    我们正在等待您的回复、有任何消息吗?

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

    您好、Wanglili、

    感谢您的耐心。

    [quote userid="602647" url="~/support/processors-group/processors/f/processors-forum/1432141/am6422-sdk-8-6-timer-compare-and-capture-modes 是否有任何相关的样片计划?

    当我们讨论计时器时、目前没有样例程序。 这可能会出现在未来的 SDK 版本中。  

    到目前为止、我可以提供的唯一计时器示例如下:

    "

    对于 AM64x MCU + SDK、我已经编写了一段代码来演示计时器中断。

    我已经通过获取下的空应用编写了此应用  MCU_PLUS_SDK/examples/empty  作为基准。

    我随附了 zip 文件、以便您继续操作、导入到 CCS 中并在移动中运行该文件。

    empty_am64x-sk_r5fss0-0_nortos_ti-arm-clang.zip



    "

    此致、

    Vaibhav

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

    您好!

    我了解计时器中断的这种用法。 目前我们要使用计时器采集、是否还不受支持? 我们的使用方案如下:通过 GPS pps 脉冲中断清除计时器值、并在一个计算周期内修改计时器的计数值、以便实现与第二个脉冲相同的频率计数。 我 目前有一些问题、我希望你可以帮助分析它。

    首先介绍我的应用背景。

    1、、一个完整的第二计时器定义了200MHz 的时钟频率、中断优先级为1 μ s、如列表中所示

    2 μ s、捕获中断捕获 GPS 的 PPS 脉冲

    3 μ s、 PPS 脉冲时、首先关闭中断、然后将计时器计数恢复到初始值、μ s、然后 打开中断。

    4、在输入捕捉中断时记录当前计时器计数、从大约30个计数值计算平均值、并使用该平均值作为计时器的负载值。

     difarr 为重新加载值。

    5、通过4计算,调整计时器基本上与 GPS 的 PPS 一致。 此时有2个外部中断、但中断优先级低于捕捉中断。

    6 μ s、SPI 与外部器件交换数据时、捕获中断计时器的计数不稳定、偏差达到4us、但当 SPI 未运行时、捕获中断到达时计时器计数误差基本上在1us 以内。

    7、我还使用系统时钟进行测试、结果是在使用 SPI 时错误为3-4 μ s。

    关于我的现象、如何验证问题是什么? 如有任何疑问、请随时提醒我添加说明。

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

    您好、Wanglili、

    感谢您的详细解释。

    目前、从 TI 的软件产品的角度来看、我们不支持计时器捕获和比较。

    我会密切关注该主题、并在我们开始支持该功能时通知您。

    此致、

    Vaibhav

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

    您好、

    好的、非常感谢。 但是、您是否阅读了我上面提出的问题? 当我使用它时、我发现计时器计数不准确。 问题可能是什么? 是否有可调用的 API 函数来清除计时器计数?

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

    还有一个问题、如何在中断模式下使用 FIQ? 当它被设定为1时、它的优先级应该高于 IRQ 吗?

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

    您好、

    我在这里的测试中发现了一种现象。 当我在 DDR 上运行程序时、如果我使用 GPS 对、将会有很大的偏差、但当我在 MSRAM 上运行程序时、不会有如此大的偏差。 这可能与我怀疑的计时器计数不准确无关。 在运行 DDR 时、是否有什么东西会影响中断? 与 DDR 相关的参数是什么?

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

    您好、Wanglili、

    请等待一段时间、让另一位专家对此发表评论。

    此致、

    Vaibhav

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

    您好、Wanglili

     AM64X 上提供了计时器模块。 可以支持此计时器来测量 PWM 参数和驱动 PWM 信号。

    您可以使用计时器模块捕获 PWM 信号。

    请查看 下面的常见问题解答 和下面的 TRM 章节、对捕获模式进行更改。

    我已经创建了一个关于从时间模块生成 PWM 的常见问题解答、同样的过程也可应用于捕捉模式。

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1377521/faq-processor-sdk-am64x-how-to-create-a-pwm-using-a-timer?tisearch=e2e-sitesearch&keymatch=pwm%20timer%20paula

    此致、

    Anil。

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

    您好、

    我刚刚联系了 AM64 SOC。 我自己配置该寄存器有点困难。 您能否为我们提供样本程序以供参考? 如果可以的话、那就更好了。

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

    您好、Wanglili、

    请查看上面有关捕获模式的常见问题解答和 TRM 映像。

    您可以轻松执行该操作、并且 很少有寄存器可用于在捕获模式下配置计时器。

    请检查常见问题解答代码并为定时器在捕获模式中创建一个示例。

    由于、您在捕获模式下需要遵循的相同 PWM 步骤。

    此致、

    Anil。

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

    您好、

      我根据您提供的 PWM 示例配置了捕获模式。 当前配置完成后、我会检查寄存器以确认配置已完成、但当前无法接收捕获的信号。 在分析此器件的问题可能发生在哪里时、我需要您的帮助?

       我使用 timer7的 u7引脚进行捕获、计时器时钟频率为200MHz、溢出中断周期为1s。我没有 发现配置有问题。 我希望您能帮我找到问题所在。 非常感谢。

    void Timer_config(void)
    {
         TimerP_Params timerParams;
         HwiP_Params timerHwiParams;
         int32_t status;
         volatile uint32_t *addr;
         uint32_t ctrlVal = 0x00;
    
         /* set timer clock source */
         SOC_controlModuleUnlockMMR(SOC_DOMAIN_ID_MAIN, 2);
         *(volatile uint32_t*)AddrTranslateP_getLocalAddr(0x430081CC) = 2;
         SOC_controlModuleLockMMR(SOC_DOMAIN_ID_MAIN, 2);
    
         gTimer7BaseAddr = (uint32_t)AddrTranslateP_getLocalAddr(0x2470000u);
    
         TimerP_Params_init(&timerParams);
         timerParams.inputPreScaler = 1;
         timerParams.inputClkHz     = 200000000u;
         timerParams.periodInNsec   = 1000000000u;
         timerParams.oneshotMode    = 0;
         timerParams.enableOverflowInt = 1;
         timerParams.enableDmaTrigger  = 0;
    
    
         TimerP_setup(gTimer7BaseAddr, &timerParams);
         addr = (volatile uint32_t *)(gTimer7BaseAddr + 0x38);
    
         ctrlVal =  ( (1<<1U) | (1<<14U)| (1<<8U) | (1<<5U) ); //Trigger on overflow, Toggle, enable Auto Reload Mode
         *addr = ctrlVal;
    
         addr = (volatile uint32_t *)(gTimer7BaseAddr + 0x2c);
         ctrlVal = (0x1U << 2)|(0x1U << 1);
         *addr = ctrlVal;
    
         HwiP_Params_init(&timerHwiParams);
         timerHwiParams.intNum = 159;
         timerHwiParams.callback = Timer7_isr0;
         timerHwiParams.isPulse = 0;
         timerHwiParams.priority = 2;
         status = HwiP_construct(&gTimerHwiObj[CONFIG_TIMER1S], &timerHwiParams);
         DebugP_assertNoLog(status==SystemP_SUCCESS);
    
         Pinmux_PerCfg_t Timer_pin_Cfg[] =
         {
            {
                 PIN_PRG1_PRU0_GPO17,//U7
                ( PIN_MODE(6)  | PIN_PULL_DISABLE )
            },
    
            {PINMUX_END, PINMUX_END}
         };
    
         Pinmux_config(Timer_pin_Cfg, PINMUX_DOMAIN_ID_MAIN);
         TimerP_start(gTimer7BaseAddr);//start timer
    }
    void Timer7_isr0(void *args)
    {
    //    void timerirq(void *args);
        uint32_t value = 0x00;
        uint32_t timercnt=0;
    
        /* clear status for overflow interrupt */
        value = CSL_REG32_RD(gTimer7BaseAddr + 0x28);
    
        if(value & (0x1U << 1))//overflow
        {
            value = (0x1U << 1) ;
            CSL_REG32_WR((gTimer7BaseAddr + 0x28), value);
            timerirq(args);
        }
        if(value & (0x1U << 2))//capture
        {
            value = (0x1U << 2) ;
            CSL_REG32_WR((gTimer7BaseAddr + 0x28), value);
            timercnt = CSL_REG32_RD(gTimer7BaseAddr + 0x50);
            timercnt = timercnt - (0xffffffff-(200000000-1));
            PPS_IsrFxn1(timercnt,0);
        }
        TimerP_clearOverflowInt(gTimer7BaseAddr);
        HwiP_clearInt(159);
    }

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

    您好!

    您可能会 在1月2日收到回复、今天我正忙于其他升级。

    对延迟答复深表歉意。

    此致、

    Anil。

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

    您好、

       有新消息吗? 我们正在等待您的回复。

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

    尊敬的 Wanglili:

    该主题专家目前在本周和下周不在办公室。 请预计响应会延迟。 感谢您的耐心。

    此致、

    Tushar