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.

[参考译文] TDA4VM:用于MCU2_0的RTI28 WDT工作不正常

Guru**** 2541060 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1093942/tda4vm-rti28-wdt-for-mcu2_0-not-work-properly

部件号:TDA4VM

您好,TI:

我正在MCU2_0 (RTOS)中使用RTI28作为WDT,将CLK_SEL设置为32kHz,但它不起作用,下面是测试代码,请帮助检查。

src文件:

/* ========================================================================== */
/*                             Include Files                                  */
/* ========================================================================== */
#include <stdint.h>
#include <stdio.h>
#include <ti/csl/csl_types.h>
#include <ti/csl/hw_types.h>
#include <ti/csl/csl_rti.h>
#include <ti/csl/soc.h>
#include <ti/board/board.h>
#include <ti/osal/osal.h>
#include <ti/drv/sciclient/sciclient.h>
#include <utils/console_io/include/app_log.h>
#include <ti/board/board.h>

#include <utils/watchdog/include/rti_wtd.h>

/* ========================================================================== */
/*                                Macros                                      */
/* ========================================================================== */
#define APP_NAME                       "R5F RTI APP"

/* ========================================================================== */
/*                         Structures and Enums                               */
/* ========================================================================== */
/**
 * \brief  Enum to select the clock source for RTI module.
 */
typedef enum rtiClockSource
{
    RTI_CLOCK_SOURCE_HFOSC0_CLKOUT = 0U,
    /**< to select clock frequency of hfosc0 */
    RTI_CLOCK_SOURCE_LFOSC_CLKOUT = 1U,
    /**< to select clock frequency of lfosc */
    RTI_CLOCK_SOURCE_12MHZ = 2U,
    /**< to select clock frequency of 12 MHz */
    RTI_CLOCK_SOURCE_32KHZ = 3U,
    /**< to select clock frequency of 32KHz */
}rtiClockSource_t;

/* ========================================================================== */
/*                            Global Variables                                */
/* ========================================================================== */
volatile uint32_t isrFlag = 0U;
/**< Flag used to indicate interrupt is generated */

/* ========================================================================== */
/*                 Internal Function Declarations                             */
/* ========================================================================== */
/**
 * \brief   This API to select clock source for RTI module.
 *
 *
 * \param   rtiClockSource  RTI module clock source
 *                          Values given by enum #rtiClockSource_t
 *
 * \return  none.
 */
static void RTISetClockSource(uint32_t rtiClockSourceSelect);

/**
 * \brief   This API to calculate preload value from given time-out value.
 *
 * \param   rtiClockSource  RTI module clock source
 *                          Values given by enum #rtiClockSource_t
 *
 * \param   timeoutVal      RTI DWWD time-out value in mili-seconds.
 *
 * \return  Preload value   Time-out value in RTI source clock cycles.
 */
static uint32_t RTIGetPreloadValue(uint32_t rtiClkSource, uint32_t timeoutVal);

/**
 * \brief   This API to register interrupt for a given instance.
 *
 *
 * \return  0: Success, -1: Failure
 */
static int32_t RTIInterruptConfig(void);

/**
 * \brief   ISR after interrupt generation, sets global flag
 *
 * \retval  None
 */
static void RTIAppISR(uintptr_t handle);


/* ========================================================================== */
/*                          Function Definitions                              */
/* ========================================================================== */
void test_csl_rti_dwwd_test_app(void)
{
    uint32_t rtiModule, rtiWindow_size, rtiPreload_value, rtiReaction;
    int32_t  config_status;

    appLogPrintf("\n Board init complete\n");

    /* Register Interrupt */
    isrFlag = 0U;
    if(RTIInterruptConfig() != 0)
    {
        appLogPrintf("\r\nRTI Interrupt configuration failed. \r\n");
        return;
    }
    appLogPrintf("\n Interrupt config complete\n");

    /* Configure RTI parameters */
    rtiModule        = RTI_APP_RTI_CFG_BASE;
    rtiWindow_size   = APP_RTI_DWWD_WINDOW_SIZE;
    rtiReaction      = APP_RTI_DWWD_REACTION;
    rtiPreload_value = RTIGetPreloadValue((uint32_t) RTI_CLOCK_SOURCE_32KHZ,
                                          (uint32_t) APP_RTI_DWWD_TIMEOUT_VALUE);

    /* Select RTI module clock source */
    RTISetClockSource((uint32_t) RTI_CLOCK_SOURCE_32KHZ);
    config_status = RTIDwwdWindowConfig(rtiModule, rtiReaction,
                                        rtiPreload_value,
                                        rtiWindow_size);
    if (config_status == CSL_EFAIL)
    {
        appLogPrintf(APP_NAME ": Error during Window configuration.\n");
    }
    else
    {
        appLogPrintf(APP_NAME ": DWWD is configured for %u ms time-out \n",
            APP_RTI_DWWD_TIMEOUT_VALUE);
        appLogPrintf(APP_NAME ": DWWD will generate interrupt after "
            "above time-out period.\n");
        RTIDwwdCounterEnable(rtiModule);
        /* Let DWWD expire here */
        appLogPrintf(APP_NAME ": Wait for %u ms for interrupt "
            "to be generated by DWWD.\n", APP_RTI_DWWD_TIMEOUT_VALUE);

        appLogPrintf("isrFlag=%lu\n",isrFlag);
        while (0U == isrFlag)
        {
            /* Wait for interrupt */
        }
        appLogPrintf(APP_NAME ": RTI App completed successfully.\n");
        appLogPrintf("\n All tests have passed. \n");
    }
}


static void RTISetClockSource(uint32_t rtiClockSourceSelect)
{
    volatile uint32_t *hwRegPtr;

    hwRegPtr = (uint32_t *) (RTI_APP_CTRL_MMR_CFG_BASE + RTI_APP_CTRL_MMR_CLKSEL_OFFSET);
    hwRegPtr[0] = (hwRegPtr[0] & (~RTI_APP_RTI_CLK_SEL_FIELD_MASK)) | (rtiClockSourceSelect << RTI_APP_RTI_CLK_SEL_FIELD_SHIFT);
}

static int32_t RTIInterruptConfig(void)
{
    int32_t retVal = 0;
    OsalRegisterIntrParams_t intrPrms;
    OsalInterruptRetCode_e osalRetVal;
    HwiP_Handle hwiHandle;
    uint32_t rtiIntNum;

    Osal_RegisterInterrupt_initParams(&intrPrms);
    intrPrms.corepacConfig.arg          = (uintptr_t)0;
    intrPrms.corepacConfig.priority     = 1U;
    intrPrms.corepacConfig.corepacEventNum = 0U; /* NOT USED ? */

    rtiIntNum = RTI_APP_WDT_INT_NUM;

    if (retVal == 0)
    {
        intrPrms.corepacConfig.isrRoutine   = &RTIAppISR;
        intrPrms.corepacConfig.intVecNum    = rtiIntNum;

        osalRetVal = Osal_RegisterInterrupt(&intrPrms, &hwiHandle);
        if(OSAL_INT_SUCCESS != osalRetVal)
        {
            appLogPrintf(APP_NAME ": Error Could not register ISR !!!\n");
            retVal = -1;
        }
    }

    return retVal;
}

static uint32_t RTIGetPreloadValue(uint32_t rtiClkSource, uint32_t timeoutVal)
{
    uint32_t clkFreqKHz       = (uint32_t) RTI_CLOCK_SOURCE_32KHZ_FREQ_KHZ,
             timeoutNumCycles = 0;

    switch (rtiClkSource)
    {
        case RTI_CLOCK_SOURCE_32KHZ:
            clkFreqKHz = (uint32_t) RTI_CLOCK_SOURCE_32KHZ_FREQ_KHZ;
            break;
        default:
            break;
    }
    /* Get the clock ticks for given time-out value */
    timeoutNumCycles = timeoutVal * clkFreqKHz;
    return timeoutNumCycles;
}

static void RTIAppISR(uintptr_t handle)
{
    uint32_t intrStatus;
#ifdef WDT_RESET
    int32_t status;
#endif

    RTIDwwdGetStatus(RTI_APP_RTI_CFG_BASE, &intrStatus);
    RTIDwwdClearStatus(RTI_APP_RTI_CFG_BASE, intrStatus);
    appLogPrintf(APP_NAME ": Interrupt Generated!!!\n");
#ifdef WDT_RESET
    status = Sciclient_pmDeviceReset(SCICLIENT_SERVICE_WAIT_FOREVER);

    if (status != 0)
    {
        appLogPrintf(APP_NAME ": Sciclient_pmDeviceReset Failed : stauts = %d!!!\n", status);
    }
#endif
    isrFlag  = 1U;
}

头文件:

/**< RTI Instance */
#define APP_RTI_DWWD_WINDOW_SIZE         (RTI_RTIDWWDSIZECTRL_DWWDSIZE_50_PERCENT)
/**< DWWD Window Size */
#define APP_RTI_DWWD_TIMEOUT_VALUE       (60000U)
/**< DWWD Time Out Value */
#define APP_RTI_DWWD_REACTION            (RTI_RTIDWWDRXNCTRL_DWWDRXN_INTERRUPT) //0XA
/**< DWWD Reaction After Timeout */
#define RTI_CLOCK_SOURCE_32KHZ_FREQ_KHZ  (32U)
/**< RTI Clock Source Selection */

#define RTI_APP_CTRL_MMR_CFG_BASE        (CSL_CTRL_MMR0_CFG0_BASE) //0x100000UL
/**< RTI CTRL MMR Config Base address */

#define RTI_APP_RTI_CFG_BASE             (CSL_RTI28_CFG_BASE)
/**< RTI Config Base address */

#define RTI_APP_CTRL_MMR_CLKSEL_OFFSET   (CSL_MAIN_CTRL_MMR_CFG0_WWD28_CLKSEL) //0x000083F0U
/**< RTI Clock select Register offset */

#define RTI_APP_RTI_CLK_SEL_FIELD_MASK   (CSL_MAIN_CTRL_MMR_CFG0_WWD28_CLKSEL_CLK_SEL_MASK) //7
/**< RTI CLock select Register field mask */

#define RTI_APP_RTI_CLK_SEL_FIELD_SHIFT  (CSL_MAIN_CTRL_MMR_CFG0_WWD28_CLKSEL_CLK_SEL_SHIFT)  //0
/**< RTI CLock select Register field shift */

/**< RTI WWD interrupt number*/
#define RTI_APP_WDT_INT_NUM 			  (2)	

test_csL_RTI_dwwd_test_app 将在app_init.c中调用,但我看不到正确的倒计时,请您帮忙,谢谢

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

    您好,TI:

    是否有任何更新? 这对我们来说是紧急的,谢谢

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

    您好,Veitch,

    test_csl_rti_dwwd_test_app 将在app_init.c中调用,但我无法提供帮助,请更正。

    没有得到正确的倒计时是什么意思? 请您详细说明一下吗?

    此外,请提及您正在使用的SDK版本。

    此致,

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

    您好,Parth:

    非常感谢您的回复,  此问题有3个案例:

    1. 选择 CTRLMMR_WWD28_CLKSEL[2:0]后,RTI_DWDCNTR寄存器(0x23C00A0)不会倒计时
    至32kHz。  

    2.CTRLMMR_WWD28_CLKSEL[2]的默认值 是 WKUP_HFOSC0_CLKOUT(0x0),在这种情况下 ,我将 上述代码的RTI_CLOCK SOURC_32KHz_FREQ_kHz从32U修改19.2万U, 然后运行应用程序,它将显示 RTIDWindowConfig失败

    3.使用case2的前提条件,如果我将19.2万U 降低到 192,则不会显示case2中显示的故障,但WDT将达到大约每2秒的超时中断, 超时时间对我来说太短,我希望更长, 但没有任何变化,甚至增加 了APP_RTI_DWWD_TIMEOUT_VALUE。

    根据我的理解,将 RTI_CLOCK_SOURCK_FREQ减慢到32kHz将是一个解决方案,但目前,我不能像在Case1中提到的那样,在对其进行chage后使其工作。 因此,我希望TI专家可以在这里给我一些帮助,这将是非常感谢的。

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

    您好,Veitch,

    我使用了您在原始POST中共享的代码,并使用CCS将二进制文件加载到MCU2_0。 这对我来说似乎很好。 我所做的唯一修改是使用UART_printf进行控制台打印,但这不会影响。 请参阅以下日志:

    您能否确认您是否做出了除原始帖子中所分享内容之外的任何更改?

    此致,

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

    您好,Parth:

    我想知道在启用DWWD后,需要多长时间才能获得日志"中断生成"? 实际上 ,WDT大约每2秒就会出现一次超时中断,下面是日志,我正在使用 原始POST代码进行此测试,没有其他更改。

    我的日志:

    [MCU2_0]  Board init complete
    [MCU2_0]     62.549268 s:
    [MCU2_0]  Interrupt config complete
    [MCU2_0]     62.549295 s: R5F RTI APP: DWWD is configured for 60000 ms time-out
    [MCU2_0]     62.549327 s: R5F RTI APP: DWWD will generate interrupt after above time-out period.
    [MCU2_0]     62.549361 s: R5F RTI APP: Wait for 60000 ms for interrupt to be generated by DWWD.
    [MCU2_0]     63.948156 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_0]     63.948204 s: R5F RTI APP: RTI App completed successfully.
    [MCU2_0]     63.948236 s:
    [MCU2_0]  All tests have passed.
    root@j7-evm:/opt/vision_apps#
    root@j7-evm:/opt/vision_apps# [MCU2_0]     69.191043 s: R5F RTI APP: Interrupt Generated!!!
    
    root@j7-evm:/opt/vision_apps# [MCU2_0]     72.686295 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_0]     76.181545 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_0]     77.929173 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_0]     79.676801 s: R5F RTI APP: Interrupt Generated!!!

    此外,我不明白不能透过k3conf工具将RTI28时钟的频率改为32kHz,因为根据我的理解,如果 不能将RTI28时钟频率改为32kHz,那么RTI28计时器就不可能按预期正确倒计时了。 由于 原始POST代码采用32kHz频率来计算预载值,但RTI28的实际频率为19.2Mhz,默认设置为 WKUP_HFOSC0_CLKOUT,位为CTRLMMR_WWD28_CLKSEL[2:0]

    此致,

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

    您好,Veitch,

    I wd405.4866万 wd想知道启用“中断”日志后需要多长时间才能得到? [/引述]

    大约需要60秒才能生成"中断生成" 日志。 考虑到6000毫秒超时,这似乎是正常的。

    此外405.4866万此外,我不明白我不能将32kHz/rclock的频率更改为"RTI3conf",它始终表示无效的值。

    我不确定k3conf为什么不允许更改该值,我需要检查此值。

    此外,查看您的日志,您似乎是从Vision应用程序运行应用程序。 您是否可以尝试单独运行应用程序,只需进行RTOS设置。 这将帮助我们隔离VISION应用程序是否会产生任何问题。

    此致,

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

    您好,Parth:

    您405.5669万您是否可以尝试独立运行应用程序,只需使用RTOS设置。 这将帮助我们隔离Vision应用程序是否会产生任何问题。[/QUOT]

    我尝试在app_init.c中禁用与VISION应用程序相关的所有其他模块,并在  AppInit中调用test_csL_RTI_dwwd_test_app,然后我获得以下日志,似乎是问题的前头。 请告诉我您在 CTRLMMR_WWD28_CLKSEL[2]上选择了哪一个时钟如果它也是19.2M,我怀疑它如何在您那一端正常工作,因为源代码将它处理为 RTI_CLock_SOURC_32KHz_FREQ_kHz,而不是19.2Mhz。 它们不一致,对吗?  

    [MCU2_0]   5730.949405 s: CIO: Init ... Done !!!
    [MCU2_0]   5730.949462 s: ### CPU Frequency = 1000000000 Hz
    [MCU2_0]   5730.949491 s: APP: Init ... !!!
    [MCU2_0]   5730.949508 s: SCICLIENT: Init ... !!!
    [MCU2_0]   5730.949715 s: SCICLIENT: DMSC FW version [21.5.0--v2021.05 (Terrific Llam]
    [MCU2_0]   5730.949755 s: SCICLIENT: DMSC FW revision 0x15
    [MCU2_0]   5730.949778 s: SCICLIENT: DMSC FW ABI revision 3.1
    [MCU2_0]   5730.949803 s: SCICLIENT: Init ... Done !!!
    [MCU2_0]   5730.949824 s: MEM: Init ... !!!
    [MCU2_0]   5730.949851 s: MEM: Created heap (DDR_SHARED_MEM, id=0, flags=0x00000004) @ d3800000 of size 16777216 bytes !!!
    [MCU2_0]   5730.949899 s: MEM: Created heap (L3_MEM, id=1, flags=0x00000000) @ 3600000 of size 262144 bytes !!!
    [MCU2_0]   5730.949942 s: MEM: Created heap (DDR_NON_CACHE_ME, id=5, flags=0x00000000) @ cb000000 of size 100663296 bytes !!!
    [MCU2_0]   5730.949986 s: MEM: Init ... Done !!!
    [MCU2_0]   5730.950004 s: IPC: Init ... !!!
    [MCU2_0]   5730.950048 s: IPC: 3 CPUs participating in IPC !!!
    [MCU2_0]   5730.950083 s: IPC: Waiting for HLOS to be ready ... !!!
    [MCU2_0]   5733.808584 s: IPC: HLOS is ready !!!
    [MCU2_0]   5733.811746 s: IPC: Init ... Done !!!
    [MCU2_0]   5733.811797 s: APP: Syncing with 2 CPUs ... !!!
    [MCU2_0]   5733.961912 s: APP: Syncing with 2 CPUs ... Done !!!
    [MCU2_0]   5733.961949 s: REMOTE_SERVICE: Init ... !!!
    [MCU2_0]   5733.963177 s: REMOTE_SERVICE: Init ... Done !!!
    [MCU2_0]   5733.963242 s: APP: Init ... Done !!!
    [MCU2_0]   5733.963266 s: APP: Invoke test_csl_rti_dwwd_test_app !!!
    [MCU2_0]   5733.963291 s:
    [MCU2_0]  Board init complete
    [MCU2_0]   5733.963326 s:
    [MCU2_0]  Interrupt config complete
    [MCU2_0]   5733.963355 s: R5F RTI APP: DWWD is configured for 60000 ms time-out
    [MCU2_0]   5733.963388 s: R5F RTI APP: DWWD will generate interrupt after above time-out period.
    [MCU2_0]   5733.963423 s: R5F RTI APP: Wait for 60000 ms for interrupt to be generated by DWWD.
    [MCU2_0]   5733.963457 s: isrFlag=0
    [MCU2_0]   5734.063694 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_0]   5734.063728 s: R5F RTI APP: RTI App completed successfully.
    [MCU2_0]   5734.063755 s:
    [MCU2_0]  All tests have passed.
    [MCU2_0]   5734.063778 s: APP: Run ... !!!
    [MCU2_0]   5734.063797 s: IPC: Starting echo test ...
    [MCU2_0]   5734.065087 s: APP: Run ... Done !!!
    [MCU2_0]   5735.811322 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_0]   5737.558946 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_0]   5739.306572 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_0]   5741.054197 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_0]   5742.801823 s: R5F RTI APP: Interrupt Generated!!!
    [MCU2_1]   5730.924523 s: CIO: Init ... Done !!!
    [MCU2_1]   5730.924581 s: ### CPU Frequency = 1000000000 Hz
    [MCU2_1]   5730.924616 s: APP: Init ... !!!
    [MCU2_1]   5730.924636 s: SCICLIENT: Init ... !!!
    [MCU2_1]   5730.924847 s: SCICLIENT: DMSC FW version [21.5.0--v2021.05 (Terrific Llam]
    [MCU2_1]   5730.924885 s: SCICLIENT: DMSC FW revision 0x15
    

    此致,

    Veitch

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

    您好,Veitch,

    我可以确认CTRL_MMR_WWD28_CLKSEL[2:0]正在选择32KHz时钟。 请参阅下面的寄存器值:

    但我是在无引导模式下从CCS运行代码,而不是从app_init运行代码。 您也可以尝试一下。 在RTOS环境中构建代码并从CCS运行。 这将帮助我们隔离是应用程序问题还是它运行的环境导致了某些问题。

    我正在共享我正在运行的二进制文件。 如果您使用的是TI EVM,则也可以尝试此操作 。csl_rti_dwwd_test_app_mcu2_0_release.zip 。 将其加载到MCU2_0上,并使用CCS并运行。

    此致,