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.
你好
我正在尝试 使用 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 计时器。
我认为 时钟源也可能是问题所在。 但我不知道如何修改它。
感谢你的帮助。
您好!
回到这个话题、您是否已解决此问题或您是否仍需要帮助?
此致、
埃里克
您好!
我仍然 没有解决这个问题。
是否可以提供示例代码或其他解决方案?
您好!
您是否对计时器寄存器进行了比较以确保配置相同? 您是否在寄存器中看到任何差异?
此致、
埃里克