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.

[参考译文] AM2432:AM2432 用于高速 GPIO 切换的 Sitara MCU 计时器配置 — 故障排除

Guru**** 2667985 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1591295/am2432-am2432-sitara-mcu-timer-configuration-for-high-speed-gpio-toggling---troubleshooting

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

尊敬的 TI 团队:

我需要说明计时器在切换 GPIO 的速度方面的功能。

您能否指定计时器可以实现多少次最短时间来切换 GPIO?

同时、当计时器配置为寄存器的最高值时、我能够在 1us 时切换 GPIO。

请向我提供同样的信息。

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

    您好、Nilesh

    与此同时、当计时器配置为寄存器的最高值时、我能够在 1us 时切换 GPIO。

    目标是使时间低于 1 微秒吗?

    还有许多其他因素、例如中断进入延迟、ISR 执行和寄存器写入、因此所有这些因素都非常影响 1 微秒。

    您可以尝试探索 PWM。

    此致、

    Vaibhav

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

    供参考、 e2e.ti.com/.../faq-processor-sdk-am64x-how-to-create-a-pwm-using-a-timer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    目标是让时间少于 1 微秒吗?

    是的。 我的目标是使用计时器实现 GPIO 的 1ns 切换时间。

    理论上、它可以以纳秒级时序进行切换。 但是、它不提供以纳秒为单位的结果。

    我可以使用 PRU GPIO 实现吗? 如果是、那么我可以实现的切换最短时间是多少?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我能否使用 PRU GPIO 实现它? 如果是、那么我可以实现的切换最短时间是多少?  [/报价]

    您好、Nilesh

    我们将很快就 PRU GPIO 问题做出答复。

    此致、

    Vaibhav

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

    你好 Nilesh、


    PRU 内核以 333MHz 的最大频率运行、对应于每条指令~3ns 的周期时间。
    •将 PRU GPIO 切换为高电平通常需要一条指令 (~3ns)。
    •将 GPIO 切换为低电平也需要另一条指令 (~3ns)。
    •当切换操作放置在循环内时、循环指令本身会每次迭代增加另一个~3ns。

    由于每个 PRU 指令大约需要一个周期、因此 PRU 固件中的任何额外指令都将进一步按比例增加时序。

    因此、PRU 无法实现 1ns 的 GPIO 控制、因为可实现的最小时序粒度约为指令周期时间 (~3ns)。 因此、利用 PRU GPIO、1ns 的精度无法实现。

    此致、

    Anil.

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

    尊敬的 Anil:

    感谢您分享有关 PRU 引脚的见解。

    在我们的应用中、我们认为可以实现最短的引脚切换时间、同时将 PRU 引脚实施为 GPIO。 但是、根据提供的信息、主/MCU 域 GPIO 和 PRU 引脚之间在时序方面似乎没有主要差异。

    请分享您的观点。

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

    你好 Nilesh、

    但是、根据提供的信息、主/MCU 域 GPIO 和 PRU 引脚在时序方面似乎没有重大差异。

      与主内核和 MCU 内核相比、PRU 内核能够非常快速地切换 PRU GPIO 引脚。

    此致、

    Anil.

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

    您好、

    我已经使用计时器 ISR 实施 GPTIMER 来切换 GPIO (MAIN_DOMAIN)、从而实现最大切换速度。 因此、当计时器配置为 25MHz 时钟时、GPIO 切换速度为 300kHz。 我也尝试增加时钟、但没有得到任何结果。

    我想知道这是否是我可以实现的 GPIO 的最大切换速度? 如果否、则我必须在 SysConfig 中对计时器或 GPIO 进行哪些修改?

    当我使用时钟勾选延迟功能执行 GPIO 切换(在几秒内可用)时、它为我提供了大约 1MHz 的速度 然而、在 GPTIMER 中、这并不能提供富有成效的结果。

    请提供您的反馈、说明如何实现最大切换速度。

    #include <kernel/dpl/DebugP.h>
    #include <kernel/dpl/ClockP.h>
    #include "ti_drivers_config.h"
    #include "ti_drivers_open_close.h"
    #include "ti_board_open_close.h"
    #include <kernel/dpl/SemaphoreP.h>
    #include <drivers/hw_include/cslr_gpio.h>
    
    SemaphoreP_Object gOverflowSemObj;
    
    uint32_t pinToggle = 0;
    uint32_t gpioAdd;
    uint32_t regIndex, regVal;
    volatile CSL_GpioRegs*  hGpio;
    
    void tickTimerCallBack(void *args)
    {
        //Nothing...
    }
    
    void OverFlowCallbackUser(GPTIMER_Handle handle)
    {
        pinToggle ^= 1;
    
        if(pinToggle)
        {
            CSL_REG32_WR(&hGpio->BANK_REGISTERS[regIndex].SET_DATA, regVal);
        }
        else {
            CSL_REG32_WR(&hGpio->BANK_REGISTERS[regIndex].CLR_DATA, regVal);
        }
        //GPTIMER_setCount(gGpTimerHandle[0], 0xFFFFFFAEU);
    }
    
    void gp_timer_overflow_callback_main(void *args)
    {
        Drivers_open();
        Board_driversOpen();
        gpioAdd = (uint32_t) AddrTranslateP_getLocalAddr(CONFIG_GPIO0_BASE_ADDR);
        hGpio = (volatile CSL_GpioRegs*)((uintptr_t) gpioAdd);
        regIndex = GPIO_GET_REG_INDEX(CONFIG_GPIO0_PIN);
        regVal = GPIO_GET_BIT_MASK(CONFIG_GPIO0_PIN);
        /* Set Tiemr Count to a high value so that overflow can happen sooner */
        //GPTIMER_setCount(gGpTimerHandle[0], 0xFFFFFFAEU);
            /* Start the Timer */
        GPTIMER_start(gGpTimerHandle[0]);
    
        DebugP_log("Overflow Interrupt triggered !!\r\n");
    }


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

    尊敬的 Swargam:

    请更新相同内容。

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

    你好 Nilesh、

    您目前正在使用 PWM 控制 GPIO、这不是测量优化的 GPIO 切换时间的正确方法。

    相反、您只需在连续循环中调用 GPIO 设置高电平和设置低电平函数。 这将为您提供 GPIO 引脚的实际切换时间。
    请确保使用 Release Build 执行此测试。

    从理论上讲、当 R5F 内核以 800MHz 运行时、R5F 内核需要大约 0.2µs 才能写入寄存器。
    因此、对于完全打开+关闭的切换、您应该期望大约 0.4µs 延迟。

    此外、使用 PRU 内核时、当 PRU 在 333MHz 上运行时、在没有任何环路开销的情况下切换 GPIO 大约需要 0.006µs。

    此致、

    Anil.