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:使用 EXT_REFCLK1 作为时间源以 10us 速率生成中断

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1548653/am6421-use-ext_refclk1-as-time-source-to-generate-interrupts-at-10us-rate

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

工具/软件:

我遵循此论坛示例启用 EXT_REFCLK1 输入

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1449750/am6422-processors-forum/5565882?tisearch=e2e-sitesearch&keymatch=EXT_REFCLK1#

这似乎是有效的、但我设置为每 10us 放弃一次 ISR 的计时器只有一个中断。  我使用 25MHz HF_OSC0 的计时器时钟输入尝试了相同的固件、并按预期每 10us 以连续周期运行一次。

我可以使用一对级联计时器并计数 10 μ s 周期、或使用单个计时器和 ISR 方法、但这两种方法都需要使用 EXT_REFCLK1 作为同步时钟源。

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

    您好 Bruce、

    对不起、我对上述描述有点困惑。 我有以下理解、请确认相同。

    1。EXT_REFCLK1 配置正确。 (即 Pinmux 设置通过 Pinmux 工具正确完成)?

    2.将计时器配置为每 10us 生成一次中断、但只获得一次中断?

    3.相同的固件 25MHz ,但这里使用的时钟是 HFOSC(HFOSC),一切都正常工作?

    此致、

    Tushar

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

    Tushar、

    您的理解是正确的。  首次初始化计时器后、我得到一个 10us IRQ、当使用 EXT_REFCLK1 (48MHz) 作为计时器源时钟时、不会超过该值。  然后、我只将计时器源时钟切换到 HF_OSC (25MHz)、并且按照预期每 25us 就会得到中断一次。  我附加了 SYSCFG 为 EXT_REFCLK1 计时器设置生成的代码、以及设置 PinMux 和我的 ISR 的代码片段。

    更多的细节: 整个程序使用 FreeRTOS、并在其中一个 R%F 内核 (R5FSS1-0) 上运行

    计数值  TwoWayTimerTick 仅在我的程序执行时递增一次。  如果我只将 clocke sourec 更改为 HFOSC、则计数会正常增加。

    ==================================================

    代码生成的 ti_DPL_config.c 文件

    void TimerP_isr0 (void *args)

    void DECODETIMER_TwoWayCallback (void *args);

    DECODETIMER_TwoWayCallback (args);
    TimerP_clearOverflowInt (gTimerBaseAddr[twoway_timer]);
    HwiP_clearInt (twoway_timer_INT_NUM);
    }

    void TimerP_init ()

    TimerP_Params timerParams;
    HwiP_Params timerHwiParams;
    int32_t 状态;

    /*设置计时器时钟源*/
    SoC_controlModuleUnlockMMR (SOC_DOMAIN_ID_MAIN、2);
    *(volatile uint32_t *) AddrTranslateP_getLocalAddr (twoway_timer_clock_SRC_MUX_ADDR)= twoway_timer_clock_SRC_EXT_REFCLK1;
    SoC_controlModuleLockMMR (SOC_DOMAIN_ID_MAIN、2);

    gTimerBaseAddr[twoway_TIMER]=(uint32_t) AddrTranslateP_getLocalAddr (twoway_timer_base_ADDR);

    TimerP_Params_init (&timerParams);
    timerParams.inputPreScaler = twoway_timer_input_pre_piscaler;
    timerParams.inputClkHz = twoway_timer_input_CLK_Hz;
    timerParams.periodInNsec = twoway_timer_nsec_per_tick;
    timerParams.oneshotMode = 0;
    timerParams.enableOverflowInt = 1;
    timerParams.enableDmaTrigger = 0;
    TimerP_SETUP (gTimerBaseAddr[twoway_TIMER]、&timerParams);

    HwiP_Params_init (&timerHwiParams);
    timerHwiParams.intNum = twoway_timer_INT_NUM;
    timerHwiParams.callback = TimerP_isr0;
    timerHwiParams.isPulse = 0;
    timerHwiParams.priority = 4;
    Status = HwiP_Construct (&gTimerHwiObj[twoway_timer]、&timerHwiParams);
    DebugP_assertNoLog (STATUS==SystemP_Success);

    TimerP_start( gTimerBaseAddr[twoway_timer]);

    }

    ===================================================

    我的 Pinmux 代码在 main() fright 中的 System_init() 之后执行;

    void ExtRefClk1_config ()

     PinMuxMainDomainCfg_Cfg_t gPinMuxMainDomainCfg[]={Pinmux_Per

     /* MySYSTEM1 -> EXT_REFCLK1 -> A19 */
     {   
      PIN_EXT_REFCLK1、
      PIN_MODE (0)|((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) 和 (~Ω PIN_PULL_DIRECTION))
      }、

      { PINMUX_END、PINMUX_END }
    };

     Pinmux_config (gPinMuxMainDomainCfg、PINMUX_domain_ID_MAIN);
    }

    ======================================

    只对中断进行计数的中断服务处理程序:

    void DECODETIMER_TwoWayCallback ( void * args )

     TwoWayTimerTick++;
    }

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

    您好、

    您能否确认如何为计时器模块提供外部时钟? 是否已正确连接所有硬件?

    似乎没有为计时器模块正确配置源时钟。

    此致、

    Tushar

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

    我同意似乎时钟配置不正确。  在开始这个问题之前、我通过使用示波器进行了检查、确认 48MHz TCXO 已连接到 EXT_REFCLK1、并且一切看起来都正确。  我能够通过将 48MHz 设置为自由运行并使用调试器多次查看计数值来验证计时器是否正在访问计时器。  我仍然不知道为什么中断不起作用。

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

    您好 Bruce、

    感谢您的确认。 如果时钟配置正确、则时钟应按预期工作。

    请再尝试一个实验、不要在配置后启动计时器。

    拆下  TimerP_start( gTimerBaseAddr[twoway_timer]); 中的一行 TimerP_INIT_() 测量输出。 如果这是通过 SysConfig 生成的、则取消选中 Start timer 选项。

    引脚多路复用完成后启动计时器。 (即在 ExtRefClk1_config() 函数调用后)

    void TimerP_init()
    {
        TimerP_Params timerParams;
        HwiP_Params timerHwiParams;
        int32_t status;
        
        /* set timer clock source */
        SOC_controlModuleUnlockMMR(SOC_DOMAIN_ID_MAIN, 2);
        *(volatile uint32_t*)AddrTranslateP_getLocalAddr(TWOWAY_TIMER_CLOCK_SRC_MUX_ADDR) = TWOWAY_TIMER_CLOCK_SRC_EXT_REFCLK1;
        SOC_controlModuleLockMMR(SOC_DOMAIN_ID_MAIN, 2);
        
        gTimerBaseAddr[TWOWAY_TIMER] = (uint32_t)AddrTranslateP_getLocalAddr(TWOWAY_TIMER_BASE_ADDR);
        
        TimerP_Params_init(&timerParams);
        timerParams.inputPreScaler = TWOWAY_TIMER_INPUT_PRE_SCALER;
        timerParams.inputClkHz = TWOWAY_TIMER_INPUT_CLK_HZ;
        timerParams.periodInNsec = TWOWAY_TIMER_NSEC_PER_TICK;
        timerParams.oneshotMode = 0;
        timerParams.enableOverflowInt = 1;
        timerParams.enableDmaTrigger = 0;
        TimerP_setup(gTimerBaseAddr[TWOWAY_TIMER], &timerParams);
        
        HwiP_Params_init(&timerHwiParams);
        timerHwiParams.intNum = TWOWAY_TIMER_INT_NUM;
        timerHwiParams.callback = TimerP_isr0;
        timerHwiParams.isPulse = 0;
        timerHwiParams.priority = 4;
        status = HwiP_construct(&gTimerHwiObj[TWOWAY_TIMER], &timerHwiParams);
        DebugP_assertNoLog(status==SystemP_SUCCESS);
    
    
    }
    
    void main()
    {
        System_init();
        ExtRefClk1_config();
        TimerP_start( gTimerBaseAddr[TWOWAY_TIMER] );
    }

    请告知我们结果。

    此致、

    Tushar

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

    Tushar、

    您的建议是有效的 — 通过等待我的应用程序代码稍后启动计时器,它使用了外部 48MHz 而没有任何问题。  感谢你的帮助

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

    您好、

    感谢您的确认。

    此致、

    Tushar