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.

[参考译文] PROCESSOR-SDK-J7200:MCUSW 设置1ms 时基

Guru**** 2542410 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1043084/processor-sdk-j7200-mcusw-setup-1ms-timebase

器件型号:PROCESSOR-SDK-J7200

你好

  我正在尝试  使用   MCUSW 基址设置1ms 时基。

我发现 PDK 中的测试用例"dmTimerUt"可以正确显示1ms、如下所示:

但是、当我将程序代码移植到 MCUSW 时、 如下所示:

我使用与 PDK 相同的参数、但获取90ms 计时器

void main(void)
{
    GptApp_DemoStatus = E_OK;
#ifdef UART_ENABLED
    AppUtils_Init();
#endif
    AppUtils_LogResult(APP_UTILS_TEST_STATUS_INIT);
    /*Init*/
    MCUSWDioApp_Init();
    MCUSWGptApp_Init();

    AppUtils_Printf((uint32)APP_UTILS_PRINT_MSG_NORMAL,
                    "Sample Application - STARTS !!!\n");
    /*Start Main test case*/

//    return (0U);
}


//20210901_Jimchen

#define CAN_START_SEC_ISR_CODE
#include "Can_MemMap.h"

CAN_ISR_TEXT_SECTION FUNC(void, CAN_CODE_FAST) CanApp_CanXIsr(uintptr_t CanPtr)
{
    CanApp_IsrType canChIsr = (CanApp_IsrType)CanPtr;

    /* Associated GPT ISR */
    canChIsr();
            AppUtils_Printf(MSG_NORMAL, APP_NAME
                                        ": canChIsr()!!!\n");
}
unsigned int IOLevelGPT;
void csldmTimerTest_StubTEST(uintptr_t arg)
{
  uint32_t baseAddr = (uint32_t) (0x40420000UL);
  //uint32_t baseAddr = (uint32_t) (0x40400000UL);

  /* Disable the Timer interrupts */
  TIMERIntDisable(baseAddr, TIMER_INT_OVF_EN_FLAG);

  /* acknowledge the interrupt */
  TIMERIntStatusClear(baseAddr, TIMER_IRQSTATUS_OVF_IT_FLAG_MASK);

  //gdmTimerTest_IsrCount++;

   /* Enable the Timer interrupts */
  TIMERIntEnable(baseAddr, TIMER_INT_OVF_EN_FLAG);

AppUtils_Printf(MSG_NORMAL,
APP_NAME ": csldmTimerTest_StubTEST::: \n");
    if(IOLevelGPT==STD_HIGH)
    {
        Dio_WriteChannel(CAN_TRCV_MCU_MCAN_1, STD_LOW);
        AppUtils_Printf(MSG_NORMAL, APP_NAME
            ": CAN_TRCV_MCU_MCAN_1, STD_LOW\n");
  
        IOLevelGPT = STD_LOW;         
    }
    else
    {
        Dio_WriteChannel(CAN_TRCV_MCU_MCAN_1, STD_HIGH); 
        AppUtils_Printf(MSG_NORMAL, APP_NAME
            ": CAN_TRCV_MCU_MCAN_1, STD_HIGH\n"); 
        IOLevelGPT = STD_HIGH; 
    }
}
#endif
void MCUSWGptApp_Init(void)
{
//    GptApp_Startup();

    /* Initialize memory sections  */
    AppUtils_GptSectionInit();

    AppUtils_Printf(MSG_NORMAL, "\n");
    AppUtils_Printf(MSG_NORMAL, APP_NAME
                                        ": Sample Application - STARTS !!!!!!!!!!!!!!!!!!!!!\n");


 #if 1  
    //uint32_t regVal;
    Board_initCfg boardCfg;
    __attribute__((unused)) Board_STATUS  boardStatus;

    boardCfg = BOARD_INIT_PINMUX_CONFIG |
               BOARD_INIT_UART_STDIO;
    boardStatus = Board_init(boardCfg);
    __attribute__((unused))  int32_t cslRet = CSL_EFAIL, testStatus;
    uint32_t status;

    OsalInterruptRetCode_e   retVal;
    OsalRegisterIntrParams_t interruptRegParams;
    /* Initialize with defaults */
    Osal_RegisterInterrupt_initParams(&interruptRegParams);

    /* Populate the interrupt parameters */
    interruptRegParams.corepacConfig.arg=(uintptr_t) timerAddrTESTTimer;//0x40420000UL
    interruptRegParams.corepacConfig.name=NULL;
    interruptRegParams.corepacConfig.isrRoutine= csldmTimerTest_StubTEST;
    interruptRegParams.corepacConfig.triggerSensitivity =  OSAL_ARM_GIC_TRIG_TYPE_HIGH_LEVEL;
    interruptRegParams.corepacConfig.priority = 0x20U;

    interruptRegParams.corepacConfig.intVecNum=40U; /* Host Interrupt vector */
    //interruptRegParams.corepacConfig.intVecNum=38U; /* Host Interrupt vector */
    interruptRegParams.corepacConfig.corepacEventNum = 0u;

    /* Register interrupts */
    retVal = Osal_RegisterInterrupt(&interruptRegParams,&(gdmTimerTest_HwiPHandle));

    if (retVal == OSAL_INT_SUCCESS)
    {
        testStatus = 0;        
        AppUtils_Printf(MSG_NORMAL, APP_NAME
                                            ": Osal_RegisterInterrupt Init OK !!!\n");
    }
    else
    {
        testStatus = 1;
        AppUtils_Printf(MSG_NORMAL, APP_NAME
                                    ": Osal_RegisterInterrupt Init NG !!!\n");
    }
    /* Reset the timer */
    if (testStatus == CSL_APP_TEST_PASS)
    {
        cslRet = TIMERReset(timerAddrTESTTimer);
    }

    if (cslRet == CSL_PASS)
    {
        cslRet = TIMEREmuModeConfigure(timerAddrTESTTimer, TIMER_FREE);
    }

    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERIdleModeConfigure(timerAddrTESTTimer, TIMER_NO_IDLE);
    }

    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERPostedModeConfig(timerAddrTESTTimer, TIMER_NONPOSTED);
    }

    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERReadModeConfig(timerAddrTESTTimer, TIMER_READ_MODE_NONPOSTED);
    }

    if (cslRet == CSL_PASS)
    {
        uint32_t postedStatus;
        cslRet = TIMERCounterSet(timerAddrTESTTimer, CSL_TEST_TIMER_COUNTER_VAL);
        do {
          cslRet = TIMERWritePostedStatusGet2(timerAddrTESTTimer, &postedStatus);
          if (cslRet != CSL_PASS)
          {
              break;
          }
          status = (postedStatus & CSL_TEST_TIMER_DM_TWPS_W_PEND_TCRR);
        } while (status != (uint32_t) 0u);
    }

    if (cslRet == CSL_PASS)
    {
        uint32_t postedStatus;
        cslRet = TIMERReloadSet(timerAddrTESTTimer, CSL_TEST_TIMER_COUNTER_VAL);
        do {
          cslRet = TIMERWritePostedStatusGet2(timerAddrTESTTimer, &postedStatus);
          if (cslRet != CSL_PASS)
          {
              break;
          }
          status = (postedStatus & CSL_TEST_TIMER_DM_TWPS_W_PEND_TLDR);
        } while (status != (uint32_t) 0u);
    }

    if (cslRet == CSL_PASS)
    {
        /* Enable the Timer Wakeup events represented by wakeFlags */
        cslRet = TIMERWakeEnable(timerAddrTESTTimer, TIMER_IRQWAKEEN_OVF_WUP_ENA_MASK);
    }

    if (cslRet == CSL_PASS)
    {
        TIMERIntEnable(timerAddrTESTTimer, TIMER_INT_OVF_EN_FLAG);
    }
    if (cslRet == CSL_PASS)
    {
        cslRet = TIMERDisable(timerAddrTESTTimer);
    }



    //define TIMER_TCLR_AR_MASK                                                                                  (0x00000002U)
       HwiP_enableInterrupt(0x20U);
       TIMERModeConfigure(timerAddrTESTTimer, 0x00000002U);
       //DMTIMER1MSModeConfigure(timerAddrTESTTimer, 0x00000002U);

       TIMEREnable(timerAddrTESTTimer);
    /* Wait for previous write to complete */
    //TimerWaitForWrite(0x00000001, timerAddrTESTTimer);

    /* Start the timer */
    //HW_WR_FIELD32(
    //    timerAddrTESTTimer + 0x24,
    //    DMTIMER_1MS_TCLR_ST,
     //   0x1);
#endif      
    AppUtils_Printf(MSG_NORMAL, APP_NAME
                                        ": Sample Application - STARTS Init OK !!!\n");
    
}

修改错误的哪一侧导致了问题?

感谢你的帮助。

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

    您好!

    我的第一个想法是、它可能是使用时钟源的问题。 我看到您已注释掉 GptApp_Startup(),您能否将此启动代码包括回并查看您是否看到正确的行为?

    谢谢、

    埃里克

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

    我已经尝试过您 的建议、但得到与 之前相同的结果、90ms 计时器。

    我认为 时钟源也可能是问题所在。 但我不知道如何修改它。

    感谢你的帮助。

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

    您好!

    回到这个话题、您是否已解决此问题或您是否仍需要帮助?

    此致、

    埃里克

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

    您好!

    我仍然 没有解决这个问题。  
    是否可以提供示例代码或其他解决方案?

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

    您好!

    您是否对计时器寄存器进行了比较以确保配置相同? 您是否在寄存器中看到任何差异?

    此致、

    埃里克