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.

[参考译文] TMDS62LEVM:(无 RTOS)RTI 看门狗示例代码设置问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1521157/tmds62levm-no-rtos-rti-watchdog-example-code-setup-issue

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

工具/软件:

您好、

当我运行示例代码 F:\example\TI\freertos_sdk_am62lx_11_00_00_05\examples\drivers\watchdog\watchdog_interrupt\am62lx-evm\a53ss0-0_nortos 时。 我 有以下两个问题。

1.加载示例二进制文件后、我看到 UART 打印中“PSCI 主要版本 1ock_set_rate:无法设置 freq、SCMI_id = 273 rate = 32552“

SOC_ModuleClockFrequency gSocModulesClockFrequency[] = {
    { AM62LX_DEV_RTI0, AM62LX_DEV_RTI0_RTI_CLK, 32552 },

    { AM62LX_DEV_UART0, AM62LX_DEV_UART0_FCLK_CLK, 48000000 },

    { SOC_MODULES_END, SOC_MODULES_END, SOC_MODULES_END },
};

2.到期时间设置为 10000ms 时,我是否应该预期中断会在 10 秒左右触发而不是立即触发(当前它立即触发)?

{
        .callbackFxn        = NULL,
        .callbackFxnArgs    = NULL,
        .resetMode          = Watchdog_RESET_OFF,
        .debugStallMode     = Watchdog_DEBUG_STALL_ON,
        .windowSize         = Watchdog_WINDOW_100_PERCENT,
        .expirationTime     = 10000,
},

谢谢您、

Dazong

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

    您好、Dazong、

    您能否澄清一下、当您在 25MZ 时钟选择下进行配置时、WDT 会工作?

    如果我们将 25MHz 时钟馈送到 WDT、则可以将到期时间配置为 1.3s。  

    要获得 10 秒的过期时间、您需要以 32KHz 时钟频率馈送 WDT ...

    您是否集成了所有 WDT 更改?  是否可以分享您的项目以重现问题在我这边?

    此致、

    Anil.

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

    尊敬的 Anil:

    使用 25MHz 时、当将延迟设置为 1000ms 时、到期时间接近 1 秒

    1. ti_drivers_open_close.c
    
    /* watchdog Driver Parameters */
    Watchdog_Params gWatchdogParams[CONFIG_WATCHDOG_NUM_INSTANCES] =
    {
        {
            .callbackFxn        = NULL,
            .callbackFxnArgs    = NULL,
            .resetMode          = Watchdog_RESET_OFF,
            .debugStallMode     = Watchdog_DEBUG_STALL_ON,
            .windowSize         = Watchdog_WINDOW_100_PERCENT,
            .expirationTime     = 1000,
        },
    };
    
    2. ti_drivers_config.c
    static Watchdog_HwAttrs gWatchdogHwAttrs[CONFIG_WATCHDOG_NUM_INSTANCES] =
    {
        {
            .instance        = WATCHDOG_INST_ID_0,
            .baseAddr        = CSL_RTI0_CFG_BASE,
            .wdtClkFrequency = 25000000U,
        },
    };
    
    3. ti_power_clock_config.c
    SOC_ModuleClockFrequency gSocModulesClockFrequency[] = {
        { AM62LX_DEV_RTI0, AM62LX_DEV_RTI0_RTI_CLK, 25000000 },
    
        { AM62LX_DEV_UART0, AM62LX_DEV_UART0_FCLK_CLK, 48000000 },
    
        { SOC_MODULES_END, SOC_MODULES_END, SOC_MODULES_END },
    };
    
    4. watchdog_interrupt_mode.c
    void watchdog_interrupt_main(void *args)
    {
        HwiP_Params             hwiPrms;
        int32_t                 status = SystemP_SUCCESS;
        static HwiP_Object       gRtiHwiObject;
        uint64_t curTime;
        /* Register interrupt */
        HwiP_Params_init(&hwiPrms);
        hwiPrms.intNum      = CONFIG_WDT0_INTR;
        hwiPrms.eventId     = CONFIG_WDT0_EVENT_ID;
        hwiPrms.callback    = &watchdogCallback;
        hwiPrms.isPulse     = 1U;
        status              = HwiP_construct(&gRtiHwiObject, &hwiPrms);
        
        curTime = ClockP_getTimeUsec();
    
        DebugP_assert(status == SystemP_SUCCESS);
    
        DebugP_log("Watchdog interrupt Mode Test Started ...\r\n");
    
        while (gWatchdogInt == 0);
        curTime = ClockP_getTimeUsec() - curTime;
    
        DebugP_log("%ld us\n", curTime);
    
        DebugP_log("Watchdog Driver NMI received\r\n");
    
        DebugP_log("All tests have passed!!\r\n");
    
    }
    
    Output:
    Watchdog interrupt Mode Test Started ...
    988698 us
             Watchdog Driver NMI received
    All tests have passed!!

    我认为这显然仍然与我们关于输入时钟频率的一般外形的讨论有关。

    谢谢您、

    Dazong

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

    您好、Dazong、

      当我们尝试选择 25MHz 时钟时、ATF 会正确配置看门狗时钟。

    但是,更改为 32KHz , ATF 正在做一个错误,这需要在我的侧检查..

    如果您与我分享示例项目、我可以很容易地在我这边重现问题并告诉您状态。

    此致、

    Anil.

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

    尊敬的 Anil:

    请找到随附的项目

    e2e.ti.com/.../watchdog_5F00_interrupt_5F00_am62lx_2D00_evm_5F00_a53ss0_2D00_0_5F00_nortos_5F00_gcc_2D00_aarch64.txt.zip

    谢谢、

    Dazong

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

    尊敬的 Anil:

    正如你所知,我们正在对所有外围设备进行单元测试,我注意到关于 WDT 驱动程序的另一件事是 watchdog_close () 是空的。

    对于 WDT、我们要对其进行测试、类似于计时器中断。 如果没有 wachdog_close()、似乎我无法 真正设置 新的“expirationTime"。“。 例如第一次、测试 1.25 秒、第二次、测试 500ms 等 根据我之前的尝试、WDT 仅获取第一次传递的值、在本例中为 1 秒、如下面的日志所示。 TI 是否能够支持此功能、以便我们可以使用不同的超时进行测试?

    	wwdt_config.expirationTime = get_arg_ulong(argv[2]);
    	info("expirationTime = %d\n", wwdt_config.expirationTime);
    	wwdt_config.windowSize = Watchdog_WINDOW_100_PERCENT;
    
    	wwdt_Init(&wwdt_config);
    	info("wdt int 1 = %d\n", gWatchdogInt);
        /* Register interrupt */
        HwiP_Params_init(&hwiPrms);
        hwiPrms.intNum      = CONFIG_WDT0_INTR;
        hwiPrms.eventId     = CONFIG_WDT0_EVENT_ID;
        hwiPrms.callback    = &watchdogCallback;
        hwiPrms.isPulse     = 1U;
        status              = HwiP_construct(&gRtiHwiObject, &hwiPrms);
        
        curTime = ClockP_getTimeUsec();
    
        DebugP_assert(status == SystemP_SUCCESS);
    
    	info("wdt int 2 = %d\n", gWatchdogInt);
        gWatchdogInt = 0;
    	while (gWatchdogInt == 0)
    	{
    		// do nothing
    	}
    
    	HwiP_destruct(&gRtiHwiObject);
    
    	info("wdt int 3 = %d\n", gWatchdogInt);
    
        curTime = ClockP_getTimeUsec() - curTime;
    
        info("%ld us\n", curTime);
    
    	Watchdog_close(wwdt_config.hwwdt);
    	wwdt_config.hwwdt = NULL;
    	Watchdog_deinit();
    	gWatchdogInt = 0;

    cmd:> wwdt_int 0 1250
    expirationTime = 1250
    wdt int 1 = 0
    wdt int 2 = 0
    +++++
    +++++
    wdt int 3 = 2
    1250908 us
    
    cmd:> wwdt_int 0 500
    expirationTime = 500
    wdt int 1 = 0
    +++++
    wdt int 2 = 1
    +++++
    +++++
    wdt int 3 = 2
    1252280 us
    
    cmd:>wwdt_int 0 300
    expirationTime = 300
    wdt int 1 = 0
    +++++
    wdt int 2 = 1
    +++++
    +++++
    wdt int 3 = 2
    1252281 us
    
    cmd:>

    谢谢您、
    Dazong

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于 WDT、我们要对其进行测试、类似于计时器中断。 如果没有 wachdog_close()、似乎我无法 真正设置 新的“expirationTime"。“。 例如第一次、测试 1.25 秒、第二次、测试 500ms 等 根据我之前的尝试、WDT 仅获取第一次传递的值、在本例中为 1 秒、如下面的日志所示。 TI 是否能够支持此功能、以便我们可以使用不同的超时进行测试?

    您好、Dazong、

    观察到的行为是预期的并且是正确的。

    AM62L 器件上启动看门狗计时器 (WDT) 后:
    •它无法停止。
    •在运行时不能修改超时(到期)值。

    该行为是根据设计确定的、并与 AM62L 架构上的 WDT 实现保持一致。

    更改 WDT 超时

    如果需要更改 WDT 超时值、唯一的方法是:
    将新的超时值写入持久位置(例如外部闪存)。
    2.复位 SoC。
    3.引导时、在 WDT 初始化期间、读取存储的超时值并相应地配置 WDT。

    激活 WDT 超时后、没有其他方法可以动态更改 WDT 超时。

    推荐调试指南

    有关 Sitara AM6x MPU 器件(包括 AM62L)上与 WDT 相关的更多信息、配置帮助和调试提示、请参阅以下指南:

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1414222/faq-am6442-watchdog-debug-and-configuration-guide-for-all-sitara-am6x-mpu-devices

    此致、

    Anil.

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

    谢谢 Anil、

    Dazong

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

    您好、Dazong、

    要将 WDT 时钟频率设置为 32KHz、请尝试使用该时钟 ID 并查看它是否起作用。

            status = SOC_moduleClockEnable(AM62LX_DEV_RTI0, 1);
            DebugP_assertNoLog(status == SystemP_SUCCESS);
    
            status = SOC_moduleSetClockFrequency(AM62LX_DEV_RTI0,AM62LX_DEV_RTI0_RTI_CLK_PARENT_CLK_32K_RC_SEL_OUT0,32552);
            DebugP_assertNoLog(status == SystemP_SUCCESS);

    此致、

    Anil.

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

    尊敬的 Anil:

    我正在尝试将 WDT 从中断更改为热复位。 根据示例代码、除了将 RESET_MODE 更改为复位开启之外、我还需要做什么?

    Watchdog_Params gWatchdogParams[CONFIG_WATCHDOG_NUM_INSTANCES] =
    {
        {
            .callbackFxn        = NULL,
            .callbackFxnArgs    = NULL,
            .resetMode          = Watchdog_RESET_ON,
            .debugStallMode     = Watchdog_DEBUG_STALL_ON,
            .windowSize         = Watchdog_WINDOW_100_PERCENT,
            .expirationTime     = 10000,
        },
    };

    在示例代码中仅将 resetMode 更改为 RESET_ON、我会看到中断未被触发。

    谢谢您、

    Dazong

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

    您好、Dazong、

    在下面的条件检查中、添加对 AM62L (SOC_AM62Lx) 的支持、然后查看其是否正常工作。  

    此致、

    Anil.

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

    尊敬的 Anil:

    我的示例代码中没有这些行。 如果您可以检查我上周在此 TT 中附加的 zip 文件。

    谢谢您、

    Dazong

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

    查看 watchdog_RTI.c 和 watchdog_soc.c 文件、 这些是否导致了该问题?

    if (retVal >= 0)
            {
                /* Configure the Watchdog driver. */
                 
                /* Bring watchdog out of reset */
                //Watchdog_reset(handle);
                
                /* if NMI interrupt mode is configured */
                if (ptrWatchdogMCB->params.resetMode == Watchdog_RESET_OFF)
                {
                     /* Clear the status flags */
                    HW_WR_REG32(ptrHwCfg->baseAddr + CSL_RTI_RTIWDSTATUS, WATCHDOG_CLEAR_STATUS);
                }
                else
                {                
                    /* Reset is not supported on AM64x.*/
                    /* Configure the SOC moule to trigger a warm reset upon watchdog reset */
                    //Watchdog_configureWarmReset(handle);
                 
                }
            }

    void Watchdog_configureWarmReset(Watchdog_Handle handle)
    {
        return;
    }

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

    您好、Dazong、

    在今天的通话中、我们可以讨论这个问题。

    此致、

    Anil.  

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

    您好、Dazong、

    我查看了 TRM、发现 WDT 支持 WDT 在 WDT 过期后对 SOC 进行 AUO 复位。

    请执行一次测试和 configure.resetMode = Watchdog_reset_on、并对以下行进行注释

    WATCHDOG_CLEAR (gWatchdogHandle[CONFIG_WDT0]) 函数、查看它是否起作用。  

    您已将到期时间配置为 10 秒。 因此您需要选择 32kHz 多路复用器选择。

    请告诉我测试结果。

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

    尊敬的 Anil:

    我们能够根据您的建议(设置 CONFIG.resetMode = Watchdog_reset_on)在 WDT 到期后确认 SOC 复位 

    但是、我们注意到了以下观察结果、希望得到您对这些结果的反馈:

    1) 我们无法确定在 WDT 过期后启动 SOC 复位的确切代码。 我的假设是这样的  SoC_generateSwWarmResetMainDomain (void)  在 SOC.c 中定义的被调用、但在 soc 重新启动之前从未达到我在函数中设置的断点。 因此、不清楚 WDT 到期后是什么启动复位。

    2) SOC 复位后、我们尝试使用获取触发复位的原因/原因  SoC_getWarmResetCauseMainDomain (void)  在 SOC.c 中定义的函数、无论 soc 复位原因如何、该函数始终返回 0。  

    但是、在 WDT 过期且 SOC 重新启动后、直接读取复位原因寄存器 (WKUP_CTRL_MMR_CFG5_RST_SRC 位于 0x43054010UL)、返回 16(设置了位 4、即由 MPU 看门狗 0 引起的复位)。

    我的意见是  SoC_getWarmResetCauseMainDomain (void)  考虑到以下参数的值、函数读取的是错误的寄存器 (0x43004010UL) 而不是 0x43054010UL:

     

    3) 我们还尝试将回调函数传递给 wwdt_config、但在 WDT 到期和 SOC 复位之前永远不会达到回调函数。

    你怎么看?

    谢谢、

    Simeon

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

    您好  Simeon、

     AM62L  看门狗计时器 (WDT) 有两种工作模式。

     中断模式:

    WDT 会在 WDT 到期后生成中断。 要启用此模式、请执行设置

    configure.resetMode 应设置为 WATCHDOG_RESET_OFF。

    在该模式下、当 WDT 到期时、将触发用户定义的回调。

    但是、不建议使用此模式、因为如果内核挂起或达到异常、内核将对异常进行优先级排序、并且不会处理 WDT 中断。 因此、SoC 将不会恢复、而 WDT  在此类故障情况下失效。

    复位模式:

    在此模式下、WDT 到期会触发 SoC 的硬件复位。

     需要进行 API 调用才能复位  —在 SoC 重置架构内自动进行重置。

    要使用此模式、请将 configure.resetMode 设置为 Watchdog_reset_on。

    在此模式下、即使注册了回调、也不会调用它、因为硬件复位会在 WDT 到期后立即发生。

    因此在这种模式下定义回调是无效的。

    请查看下图、WDT 事件直接连接到 SOC 复位硬件。

    因此,当 WDT 到期时,SOC 将自动进行复位,不需要任何软件参与。

     WDT 寄存器访问:

    用于检查复位原因状态的正确寄存器地址为 0x43054010。 当前 SDK 对该复位寄存器使用了错误的 MMR 宏。

    我会为 thi 提出一个错误 以便可以在将来的版本中修复。

    作为临时解决方法、您可以直接在代码中使用正确的地址、或如下所示修改驱动程序、然后重新编译驱动程序和应用程序。

    这将提供正确的  “重置原因“状态。


    uint32_t SOC_getWarmResetCauseMainDomain(void)
    {
        uint32_t     resetCause = 0U;
    
        /* Read the Reset Cause Register bits */
        resetCause = CSL_REG32_RD(CSL_WKUP_CTRL_MMR0_DEVICE_MANAGEMENT_BASE + CSL_WKUP_CTRL_MMR_CFG5_RST_SRC);
    
        return resetCause;
    }

    此致、

    Anil.

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

    感谢您的澄清、Anil。

    那么、我们如何在使用时宠物/刷新 WDT WATCHDOG_RESET_ON  以防止它过期并触发 MPU 复位?

    - Simeon

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

    您好 Simeon、

    例如、如果已将看门狗计时器 (WDT) 过期时间配置为 1 秒

    现在,您可以将计时器中断配置为每 500 毫秒触发一次(配置最高优先级中断)

    在此计时器中断例程中、您可以调用 WATCHDOG_CLEAR() API 。 这将重置 WDT 计数器并新启动。

    在此设置示例中、我们每 500 毫秒“馈送“WDT 密钥、这在 WDT 过期时间的 50%范围内。

    定期馈送 WDT 取决于软件系统的时序。

    在过期周期的一半内清除 WDT 是一个不错的安全裕度、但可以根据系统的行为调整该间隔。

    您应该分析软件执行路径并确定哪个 API 或任务最耗时。

    在此基础上、相应地配置 WDT 到期时间、并确保在 WDT 到期之前已被清除。

    此致、

    Anil