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:SKD8.6计时器捕捉

Guru**** 2393725 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1491997/am6422-skd8-6-timer-capture

器件型号:AM6422

工具与软件:

您好、

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

我提到此链接尚未响应。 我希望您能收到您的回复!

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

    您好、Wanglili、

    在新的10.1 MCU SDK 中、我们提供了以下代码、并且计时器常见问题解答中的 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

    C:\ti\mcu_plus_sdk_am64x_10_01_00_32\examples\drivers\gp_timer\gp_timer_pwm_capture

    此致、

    Anil。

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

    我们还不打算取代10.1。 我看到您发送的连接。 我根据寄存器对其进行了配置、并按照说明进行操作、但仍然无法正常工作。 我希望你能帮助你看到哪里有一个缺失的地方。谢谢你!

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

    您好、

       我使用了 ECAP 模块并配置了 ECAP 中断。 R5F 程序通过 A53引导。 当使用示波器进行测量时、从外部中断触发到进入用户 ISR (中断服务例程)的时间为2.0μs。 这一次是否涉及堆栈推入/弹出操作? 在800MHz 实时内核(R5F)上、这似乎时间过长、会显著影响性能。 我使用 ECAP 是否有误、或者这是否是预期的性能水平?

     

       

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

    您好、Wanglili、

    我们还没有计划替换10.1。 我看到您发送的连接。 我根据寄存器对其进行了配置、并按照说明进行操作、但仍然无法正常工作。 我希望你能帮助你看到哪里有一个缺失的地方。谢谢你![/报价]

    这不是 MCU+SDK 中支持的功能,用户需要使他们根据 TRM 和上述 PWM 常见问题解答工作...

    请分享您的申请。 我可以检查您的更改并提供反馈。

    [报价 userid="602647" url="~/support/processors-group/processors/f/processors-forum/1491997/am6422-skd8-6-timer-capture/5733817 #5733817"]   我使用了 ECAP 模块并配置了 ECAP 中断。 R5F 程序通过 A53引导。 当使用示波器进行测量时、从外部中断触发到进入用户 ISR (中断服务例程)的时间为2.0μs。 这一次是否涉及堆栈推入/弹出操作? 在800MHz 实时内核(R5F)上、这似乎时间过长、会显著影响性能。 我使用 ECAP 是否错误、或者这是否为预期的性能水平?

    您能否分享您如何测量2个已用时间的过程?

    此致、

    Anil。

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

    您好、

    1 μ、A

         我使用 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);
    }

    2 μ、A

    我将使用具有 D18引脚的 eCAP 模块来捕获 GPS 1PPS (第二个脉冲)信号。 当脉冲到达时、它会触发我的中断服务例程(ISR)。 在 ISR 内部、我将另一个 GPIO 引脚切换为低电平状态。 通过观察示波器上的两个信号(GPS 脉冲和 GPIO 切换)、我测量1PPS 信号到达和 GPIO 引脚被拉低之间的时间差、以评估中断响应延迟。

    static void App_ecapInit(void)
    {
        /* Disable and Clear Interrupts */
        ECAP_intrDisable(gEcapBaseAddr, ECAP_INT_ALL);
        ECAP_intrStatusClear(gEcapBaseAddr, ECAP_INT_ALL);
    
        /* Disable CAP1-CAP4 register loads */
        ECAP_captureLoadingDisable(gEcapBaseAddr);
    
        /* Configure eCAP */
        ECAP_counterControl(gEcapBaseAddr, ECAP_COUNTER_STOP);
        /* Enable capture mode */
        ECAP_operatingModeSelect(gEcapBaseAddr, ECAP_CAPTURE_MODE);
    
        ECAP_continousModeConfig(gEcapBaseAddr);
        /* One shot mode, stop capture at event 4 */
    //    ECAP_oneShotModeConfig(gEcapBaseAddr, ECAP_CAPTURE_EVENT4_STOP);
    
        /* Set polarity of the events to rising, falling, rising, falling edge */
        ECAP_captureEvtPolarityConfig(gEcapBaseAddr,
                                      ECAP_CAPTURE_EVENT_RISING,
                                      ECAP_CAPTURE_EVENT_FALLING,
                                      ECAP_CAPTURE_EVENT_RISING,
                                      ECAP_CAPTURE_EVENT_FALLING);
    
        /* Set capture in time difference mode */
        ECAP_captureEvtCntrRstConfig(gEcapBaseAddr,
                                     ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET,
                                     ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET,
                                     ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET,
                                     ECAP_CAPTURE_EVENT_RESET_COUNTER_NO_RESET);
    
        ECAP_syncInOutSelect(gEcapBaseAddr, ECAP_SYNC_IN_DISABLE, ECAP_SYNC_OUT_DISABLE);
        ECAP_counterControl(gEcapBaseAddr, ECAP_COUNTER_FREE_RUNNING);
    
        /* Enable eCAP module */
        ECAP_captureLoadingEnable(gEcapBaseAddr);
        /* Enable interrupt */
        ECAP_intrEnable(gEcapBaseAddr, ECAP_INT_ALL);
    //    ECAP_oneShotReArm(gEcapBaseAddr);
    }
    //interupt
         HwiP_Params_init(&hwiPrms4);
         hwiPrms4.intNum      = CONFIG_ECAPRF1_INTR;
         hwiPrms4.callback    = &RF_ecapIntrISR;
         hwiPrms4.isFIQ = 1;
         hwiPrms4.isPulse     = 0;//CONFIG_ECAPRF1_INTR_IS_PULSE;
         hwiPrms4.priority = 0;
         retVal= HwiP_construct(&gEcapHwiObject, &hwiPrms4);
         DebugP_assert(retVal == SystemP_SUCCESS);
         
    void RF_ecapIntrISR(void *arg)
    {
    //    double capval=0;
        uint32_t cap32val=0;
        uint32_t status=0;
        uint32_t cap1Count=0;
    
    
    
        cap32val = TimerP_getCount(gTimerBaseAddr[CONFIG_TIMER1S]);
        status = ECAP_getIntrStatus(gEcapBaseAddr, ECAP_INT_ALL);
        if(((status&0x02)==ECAP_CEVT1_INT)||((status&0x08)==ECAP_CEVT3_INT))
            GPIO_pinWriteLow(gpioDO1BaseAddr,CONFIG_DO1_PIN);
    }
    

    这是相关的代码部分。 在执行期间、系统中没有其他有效的中断。

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

    我提到的代码中是否有任何不恰当的要点? 有新消息吗?

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

    我提到的代码中是否有任何不恰当的要点? 有新消息吗?